各类加密算法实现
各类加密算法实现
序
因为不打算学密码学,所以只是写他们的原理而不是设计思路.
感谢这位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表
- 填充S表(从0到255,一般来说是256个字节)
- 用密钥填充另一个256字节的k表
- 用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个小时.
加密过程
密钥变换
- 去除第8,16,...,64(8个校验码)
- 56位IP置换
- 分成两个部分28bit
- 循环左移
按照表格规则位移 - 置换为48bit密钥
IP置换(INITIAL PERMUTATIONS)
先看Initial Permutation,也就是初始置换(没翻译过,猜的),拿前两个的58和50举例,这里面的数字是把原始数据的58位移动到第1位,第50位移动到第2位,以此类推.
F轮函数
然后IP置换的明文拆分成两个32位数据,称为L0,R0(左右).L0先不管,接下来是R0进行加密.
-
E扩展
主要目的是把R0从32位变成48位.
可以看到这里就是把4位的头和尾分别作为变化后的前一块的尾和头,而第一块的头为第32位,最后一块的位为第一位.剩下就和IP置换的差不多了.
-
异或
与48位密钥异或 -
S盒压缩处理
用8个S盒压缩处理得到32位数据,也就是说,异或结果等分成8块,每块6位输入压缩为4位输出.
具体过程:
也就是说,算了,看图片应该明白.
接着把行数和列数拿到表里看,是哪个数字就置换,然后再转化成2进制,只有四位. -
P盒置换
把32位数据根据P盒再次置换. -
与L0异或
加解密脚本
加密:
解密:
AES
特征
明文长度固定128位,密钥可以是128,192,256位
是为了代替DES发明的.
加密过程
密钥变换
- 如果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个字中的4个字节循环左移1个字节。即将输⼊字[b0, b1, b2, b3]变换成
[b1,b2,b3,b0] -
字节代换
对字循环的结果使⽤S盒进⾏字节代换 -
轮常量异或
将前两步的结果同轮常量Rcon[j]进⾏异或,其中j表示轮数
初始变换(Initial round)
与密钥异或
轮加密
- 字节代换(SubBytes)
根据表代换
- ⾏移位(ShiftRows)
- 列混合(MixColumn)
注意,这不是通常的矩阵运算,相加为异或,相乘看下面:
- 如果是0x02
- 0x03
计算方式:
假设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
- 轮密钥加(AddRoundKey)
密钥矩阵在十次变换中能产生十个密钥矩阵,与之异或即完成.
加解密脚本
加密:
解密:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)