|
楼主 |
发表于 2020-2-26 22:00:43
|
显示全部楼层
密码学原理
C、置换密码
置换密码是指将明文字符按照一定的规律移动位置,获得的错乱密文,字符本身不变
(密钥) (x1,x2,x3~~~~xn) = (y1,y2,y3~~~~yn) n项字符为一组
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
例:
(x1,x2,x,3,x4,x5)=(x3,x1,x5,x2,x4)
明文 : HELLO 密文:LHOEL
很容易看出置换密码的特点,通过交换位置让人无法读取。
这种密码也可以有数学表达式去表达,这个表达是通过 矩阵 来实现的。
用一个0和1组成的矩阵实现置换位置。
(密钥) Y = X * [ m阶矩阵 ] (X为明文字符,Y为密文字符)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
例:
5阶矩阵 0 1 0 0 0
0 0 0 1 0
1 0 0 0 0
0 0 0 0 1
0 0 1 0 0
明文:HELLO (7 4 11 11 14) 加密:明文乘以矩阵 == (11 7 14 4 11) 密文:(11 7 14 4 11) -->LHOEL
这种密码解密时只需要用 Y*[ m阶矩阵 ] ^(-1) = X 既可
D、流密码
将明文看成字符串,并逐位加密,关键在于生成密钥流。
1、弗纳姆密码
将明文转为二进制数,用和明文一样长的简单密钥流与其进行异或运算。
这里我们用无限 0x02 作为密钥流
- #include "string.h"
- #include "stdio.h"
- char shellcode[]={0x8b,0xf4,0x6a,0x05,0x8b,0x45,0xfc,0x50,0xff,0x15,0x14,0xa2,0x42,0x00}; //加密,解密部分
- int main(){
- int i;
- char key = 0x02; //密钥
- for(i=0;i<=13;i++)
- {
- shellcode[i] = shellcode[i] ^ key;
- printf("%.2x,",shellcode[i]);
- }
- printf("\n");
- return 0;
- }
复制代码 这个加密是十分简单的。解密在次运行这个程序即可。
2、同步流密码
短周期同步流密码
这种流密码的密钥不再是一个单独的数,而是一个有周期性的密钥流,举个例子
例:
我们假设给出两个密钥数 0x01,0x02
a1 = 0x01 a2 = 0x02 a3 = a2⊕a1 a4 = a3⊕a2 ~~~~~~
不能看出 an = an-1 ⊕an-2
通过这种递推关系,我们获得一长串密钥流
a1 = 0x01 a2 = 0x02 a3 = 0x03 a4 = 0x01 a5 = 0x02 ~~~~~~~
- #include "string.h"
- #include "stdio.h"
- char shellcode[]={0x8b,0xf4,0x6a,0x05,0x8b,0x45,0xfc,0x50,0xff,0x15,0x14,0xa2,0x42,0x00}; //加密,解密部分
复制代码 解密在次运行这个程序即可。
长周期同步流密码
对于这种同步流密码来说,密钥流十分重要,上面的例子周期为3,密钥中每三个数循环一次。
长周期我们可以通过 an = an-1 ⊕an-10 这个递推关系来实现,不过要初始化10个a数组中的值。
设 初始化a数组值的个数为m ,通过分析我们可以知道,这一类的递推关系的周期为
周期为 2^m-1
|
|