您的位置:首页 > 其它

扩展的凯撒密码实现

2009-12-29 22:48 726 查看
用程序实现扩展的加密算法 
凯撒密码:C = (M+K)mod 26  ——> C = (K1*M+K2)mod
这当中K1是有限制的,而K2是任意的

[b]1. 确定在模26内哪些数能作为K1使用。[/b]
[b]  方法:从0-25内其中任何一个数,有且只有一个数在模26内,存在一个逆[/b]

 
int n[26] = {0};
int i,j;
for(i=0;i<26;i++){
for(j=0;j<26;j++){
if((i*j)%26==1){
n[i]++;
}
}
}

for(i=0;i<26;i++){
if(n[i]==1)
cout<<i<<' ';
}
cout<<endl;

输出结果:




即在1-25之间只有以上几个数才能作为K1 ,不然会出现问题

 

 

2. 在之前的基础上确认k1和k2

3. 输入明文:thetaskiscancelled, 输出密文

解决方法:
解释利用c = (K1*m+K2)mod 26 这个公式,计算出结果。其中用数组realWord[19]来表示文明,用数组screctWord[i]来表示密文,当中最重要的是以下公式:
screctWord[i] = (K1*(realWord[i]-'a')+K2)%26+'a'
 

//实现扩展的凯撒加密算法
//K1 = [学号末两位数 % 26] ,K2 = 学号末两位的平法 % 26
//输入明文:thetaskiscancelled,输出密文
//writed by zjd(200926740330)

#include<iostream>
using namespace std;

int main(){
//先计算在模26上能当K1的数
int n[26] = {0};
int i,j;
for(i=0;i<26;i++){
for(j=0;j<26;j++){
if((i*j)%26==1){
n[i]++;
}
}
}

for(i=0;i<26;i++){
if(n[i]==1)
cout<<i<<' ';
}
cout<<endl;

int mySID = 30;
int K1 = 5;// 30 % 26 = 4,但4是不能当K1的,所以取比它大的,且可以当做的书5
int K2 = (30*30)%26;
char realWord[19] = {'t','h','e','t','a','s','k','i','s','c','a','n','c','e','l','l','e','d','/0'};
char screctWord[19];
for(i=0;i<18;i++){
screctWord[i] = (K1*(realWord[i]-'a')+K2)%26+'a';
}
screctWord[18] = '/0';

//输出明文:
cout<<realWord<<endl;
//输出密文
cout<<screctWord<<endl;
return 0;
}




 
四、实验数据:



 
这就是用上述的算法实现的数据输出,明文(上)与密文(下)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  扩展 算法 加密 c