1.仿射加密
加密函数:Y=(AX+B)%26
解密函数:Y=(AX+B)%26,得到:X=(A的逆元)*(Y-B)%26
注意gcd(A,26)需要等于1,否则在解密的时候不算一对一的,那这个密码实际上没有意义了(只有A和26互素的时候,A才有唯一的逆元)
当A=1,B=2时,就是一个移位密码了。
2.流密码加密
序列密码强度完全依赖于密钥序列的随机性(Randomness)和不可预
测性(Unpredictability)。
核心问题是密钥流的产生——密钥流生成器的设计
在此系统中我们用两种方案实现密钥流的生成
2.1RC4
工作模式:OFB(输出反馈模式)
随机密钥算法:KSA 算法(密钥调度算法)、PRGA(伪随机数生成算法)
算法基本流程:
密钥调度算法将一个随机密钥变换成一个初始置换
PRGA 利用初始置换生成一个伪随机输出序列
用该伪随机序列与明文/密文异或——加密/解密
加密/解密:message=message⊕K(流密码特点)
2.2LFSR
3.对称加密
3.1 DES加密
分组加密算法:明文和密文为 64 位分组长度;
对称算法:加密和解密除密钥编排不同外,使用同一算法;
密钥长度:64 位,每个字节第 8 位为奇偶校验位,可忽略;
密钥可为任意的 56 位数,但存在弱密钥,尽量避开;
采用混乱和扩散的组合,每个组合先替代后置换,共 16 轮;
只使用了标准的算术和逻辑运算,易于实现。
3.2 AES加密
高级加密标准(AES)
AES 是分组密码,属于 Square 结构
加密、解密相似但不对称
密钥长度和分组长度均可变,密钥长度和分组长度可以独立地指定
为 128 比特、192 比特或 256 比特
有较好的数学理论作为基础
结构简单、速度快
能在多种平台上以较快的速度实现
直接调库
RSA 加密算法
参考博客 https://blog.csdn.net/qq_44109982/article/details/109225636
取得p=587,q=113,n=p*q=66331
由于实现要求用16位的rsa加解密,所以每次可以对两个字符进行处理,相当于两个字符分为一组。
对于长度为奇数的字符串,在末尾补一个1,因为utf8编码中1对应的字符为不可见字符,那就可以用1来标记补的位(因为键盘上敲不出来)
解密时也要判断一下每组第二个字符(解密结果)是否为1,若为1则不对其处理。
上图例子中的11111,分成三组,分别为0x3131 0x3131 0x3101,加密后的结果(M=C^e%n)验算可得,0x54a1 0x54a1 0x2eea