各类加密算法实现

各类加密算法实现

因为不打算学密码学,所以只是写他们的原理而不是设计思路.

感谢这位up主:可厉害的土豆 讲的非常清楚,我这边基本是她的视频笔记.

其他参考资料:

古典加密

老东西,到时候copy别人的吧

编码

虽然编码不算加密,但是CTF很多比赛把它当成加密的一环,也记录在这里.

base系列

对称加密算法

只有一个钥匙,不分公钥私钥.

流加密

一个字节一个字节加密

RC4

特征

密钥长度可变,用一个足够大的S表为基础,对表进行非线性变换,产生密钥流.

由于RC4算法加密是采用的xor,所以,一旦子密钥序列出现了重复,密文就有可能被破解。关于如何破解xor加密,请参看Bruce Schneier的Applied Cryptography一书的1.4节Simple XOR,在此我就不细说了。那么,RC4算法生成的子密钥序列是否会出现重复呢?由于存在部分弱密钥,使得子密钥序列在不到100万字节内就发生了完全的重复,如果是部分重复,则可能在不到10万字节内就能发生重复,因此,推荐在使用RC4算法时,必须对加密密钥进行测试,判断其是否为弱密钥。其不足主要体现于,在无线网络中IV(初始化向量)不变性漏洞。

而且,根据分析结果,没有任何的分析对于密钥长度达到128位的RC4有效,所以,RC4是最安全的加密算法之一,大家可以放心使用!

加密过程
初始化S表
  1. 填充S表(从0到255,一般来说是256个字节)
  2. 用密钥填充另一个256字节的k表
  3. 用k表对s表初始变换
void rc4_init(unsigned char*s,unsigned char*key, unsigned long Len)
{
    int i=0,j=0;
    //char k[256]={0};
    unsigned char k[256]={0};
    unsigned char tmp=0;
    for(i=0;i<256;i++) {
        s[i]=i;
        k[i]=key[i%Len];
    }
    for(i=0;i<256;i++) {
        j=(j+s[i]+k[i])%256;
        tmp=s[i];
        s[i]=s[j];//交换s[i]和s[j]
        s[j]=tmp;
    }
}

在初始化的过程中,密钥的主要功能是将S-box搅乱,i确保S-box的每个元素都得到处理,j保证S-box的搅乱是随机的。而不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,将S-box和明文进行xor运算,得到密文,解密过程也完全相同。

加解密

RC4的加密解密过程是一样的.

/*加解密*/
void rc4_crypt(unsigned char*s,unsigned char*Data,unsigned long Len)
{
    int i=0,j=0,t=0;
    unsigned long k=0;
    unsigned char tmp;
    for(k=0;k<Len;k++)
    {
        i=(i+1)%256;
        j=(j+s[i])%256;
        tmp=s[i];
        s[i]=s[j];//交换s[x]和s[y]
        s[j]=tmp;14        t=(s[i]+s[j])%256;
        Data[k]^=s[t];
    }
}

块加密

一块一块加密,保证前后相关性,以免爆破出来.

DES(Data Encryption Standard)

特征

key长64位,56位参与运算,剩下8位为校验位

一个趣闻:美国制定的时候,改了表,原本很多人以为是为了留后门,结果后续出现了差分攻击,发现这改动提高了差分攻击的难度,也就是说美国内部密码学比外界提早20年.

缺点:密钥过短,在强大的计算机面前没法防御多久,十几年前就可以缩短到22个小时.

加密过程

DES加密过程DES加密过程概括

密钥变换

DES-密钥变换

  1. 去除第8,16,...,64(8个校验码)
  2. 56位IP置换
    DES-PC1
  3. 分成两个部分28bit
  4. 循环左移
    DES-位移表
    按照表格规则位移
  5. 置换为48bit密钥
    DES-PC2
IP置换(INITIAL PERMUTATIONS)

DES-IP置换表

DES-IP置换过程

先看Initial Permutation,也就是初始置换(没翻译过,猜的),拿前两个的58和50举例,这里面的数字是把原始数据的58位移动到第1位,第50位移动到第2位,以此类推.

F轮函数

然后IP置换的明文拆分成两个32位数据,称为L0,R0(左右).L0先不管,接下来是R0进行加密.

  1. E扩展
    主要目的是把R0从32位变成48位.
    DES-E扩展置换表

    可以看到这里就是把4位的头和尾分别作为变化后的前一块的尾和头,而第一块的头为第32位,最后一块的位为第一位.剩下就和IP置换的差不多了.

  2. 异或
    与48位密钥异或

  3. S盒压缩处理
    用8个S盒压缩处理得到32位数据,也就是说,异或结果等分成8块,每块6位输入压缩为4位输出.
    DES-S盒压缩处理

    DES-S盒压缩处理表

    具体过程:DES-S盒压缩具体处理方式
    也就是说,算了,看图片应该明白.
    接着把行数和列数拿到表里看,是哪个数字就置换,然后再转化成2进制,只有四位.

  4. P盒置换
    DES-P盒置换
    把32位数据根据P盒再次置换.

  5. 与L0异或

加解密脚本

加密:

解密:


AES

特征

明文长度固定128位,密钥可以是128,192,256位

是为了代替DES发明的.

加密过程

AES加密过程

密钥变换

image-20250303105611815image-20250303105617340

  • 如果i不是4的倍数,那么第i列由如下等式确定:
    W[i]=W[i-4]⨁W[i-1]
  • 如果i是4的倍数,那么第i列由如下等式确定:
    W[i]=W[i-4]⨁T(W[i-1])

函数T由三部分组成:

  1. 字循环

    将1个字中的4个字节循环左移1个字节。即将输⼊字[b0, b1, b2, b3]变换成
    [b1,b2,b3,b0]

    image-20250303105855524

  2. 字节代换
    对字循环的结果使⽤S盒进⾏字节代换

    image-20250303105933340

  3. 轮常量异或
    将前两步的结果同轮常量Rcon[j]进⾏异或,其中j表示轮数
    image-20250303110014834

    image-20250303110022928

初始变换(Initial round)

AES-初始变换1

AES-初始变换2

与密钥异或

轮加密
  1. 字节代换(SubBytes)

AES-字节代换
根据表代换

  1. ⾏移位(ShiftRows)
    AES-行位移
  2. 列混合(MixColumn)

AES-列混合

AES-列混合1

注意,这不是通常的矩阵运算,相加为异或,相乘看下面:

  • 如果是0x02
    image-20250303112214922
  • 0x03
    image-20250303113004620

计算方式:

假设b矩阵某个数为x

x * 01,为x本身

x * 02,x的二进制左移一位(右边补0),如果溢出(即如果x的二进制最高位为1),那么再异或上 1B

x * 03,结果为 (x * 02) +(这里+指异或,不是简单位相加) x,即,先乘02再异或本身,计算方法和上面一样。

举例:

02 * 87

87的二进制位 1000 0111,左移一位得到 0000 1110,因为本身的二进制最高位为1,所以再异或 1B即

00001110 xor 00011011

得到 00010101 即:15

同理 03*6E = B2

01 * 46 = 46

01 * A6 = A6

于是第一行 第一列的值为 15 xor B2 xor 46 xor A6 = 47

  1. 轮密钥加(AddRoundKey)

密钥矩阵在十次变换中能产生十个密钥矩阵,与之异或即完成.

加解密脚本

加密:



解密:



posted @   T0fV404  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示