学习目标:
- 熟练掌握多表古典密码简单乘法加密算法原理及实现。
- 掌握多表古典密码简单乘法加密算法的应用。
预备知识:
乘法密码是简单代替密码的一种。
它需要预先知道消息元素的个数,加密的过程其实是相当于对明文消息所组成的数组下标进行加密,然后用明文消息中加密后位置所对应的明文字符代替。
多表古典密码简单乘法加密算法:
Step1:确定k和q的值;
Step2:输入相应的密文;
Step3:作变换c=(mi*ki) mod q,字母用ASCII码变为数字后计算;
Step4:得到相对应的明文;
Step5:逐一输出明文。
实验步骤:
创建文件multip.cpp
示例代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
main( )
{
char M[200];
char C[200] ;
int K[200] ,q=26,i,j;
srand( (unsigned)tinme( NULL ) );
for(j=0;j<=200;j++)
{
K[j]=rand( )%50;
}
printf("please input chars:\n");
gets(M) ;
for(i= 0;M[i]!='\0' ;i++)
{
if(M[i]>='a' &&M[i]<='z')
C[i]=((M[i]-'a'+1)*K[i])%q+'a' ;
}
else if(M[i]>='A' &&M[i]<='Z')
C[i]=((M[i]-'A'+1)*K[i])%q+'A';
}
else
C[i]=M[i] ;
}
C[i]='\0';
printf("The result is:\n%s\n",C);
getch() ;
return 0;
}
实验结果如下:
思考:
乘法密码加密算法的原理:
它需要预先知道消息元素的个数,加密的过程其实是相当于对明文消息所组成的数组下标进行加密,然后用明文消息中加密后位置所对应的明文字符代替。
设明文消息元素个数为n,密钥为k。
密钥k在选取的时候应满足两个条件:
(1)0<k<n
(2)k与n互素
设明文消息为M,消息元素为m;
则密文消息为C,密文元素为c=m*k mod n;
其解密过程如下:
首先要得到解密密钥,就是要求得加密密钥k模n的逆元 ;
具体求法为k * mod n=1;
然后计算m=c * mod n即可得到明文消息M。
举例说明如下:
英文字母有26个,即n=26;
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 26
M=m[26]={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 };
我们选取密钥k=5;
现在我们对hello进行加密
hello所对应的数组为[8,5,12,12 15];
由于8*5 (mod 26) =40(mod)26=14;
依次类推,可得到加密后的数组为[ 14 , 25,8,8, 23 ];
对应的密文消息就是nyhhw
现在我们开始对nyhhw解密
首先要求得解密密钥 ;
由于5*21(mod 26)=105(mod26)=1;
所以 =21;
nyhhw所对应的数组为[ 14 , 25,8,8, 23 ];
由于14*21(mod26)=294(mod26)=8;
依次类推,可得到解密后的数组为[8,5,12,12 15];
对应的明文消息就是hello。