题目要求
试设计实现仿射密码和单表代换密码:给出密钥生成(随机选择小于26的数、选择和26互素的密钥;以及生成0-25上的一个随机置换)、加解密的伪代码
仿射密码
//仿射密码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
//密钥生成
int gcd(int a, int b) {
int temp;
while (b != 0) {
temp = a % b;
a = b;
b = temp;
}
return a;
}
int keygenerationA(){
int a;
srand((unsigned)time(NULL));
a = rand()%26;
while(gcd(a,26)!=1)a = rand()%26;
printf("a=%d\n", a);
return a;
}
int keygenerationB(){
int b;
srand((unsigned)time(NULL)+1);
b = rand()%26;
printf("b=%d\n", b);
return b;
}
//加密
int encrypt(int a,int b,int p){
int c;
c=(a*p+b)%26;
char d = (char)c+97;
printf("%c\n", d);
return c;
}
//解密
int mod_inverse(int x) {
for(int i=0;i<26;i++){
if((x*i)%26==1){
return i;
break;
}
}
}
int decrypt(int a,int b,int c){
int p;
a=mod_inverse(a);
p=((c-b)*a)%26;
if(p<0){
p+=26;
}
char d = (char)p+97;
printf("%c\n", d);
}
//主函数
int main(){
char text[100]="";
int end[100];
int a;
int b;
printf("生成密钥:\n");
a=keygenerationA();
b=keygenerationB();
printf("请输入明文\n");
scanf("%[^\n]",text);
int l= strlen(text);
printf("以下为密文\n");
for(int i=0;i<l;i++){
int p=text[i]-97;
end[i]=encrypt(a,b,p);
}
printf("以下为明文\n");
for(int i=0;i<l;i++){
int c=end[i];
decrypt(a,b,c);
}
}
单表代换密码
//单表代换
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
//密钥生成
void keygeneration(int *k){
int num;
int t[26]={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};
for(int i=0;i<26;i++){
srand((unsigned)time(NULL)+i);
num=rand()%(26-i);
k[i]=t[num];
for(int j=num;j<25-i;j++){
t[j]=t[j+1];
}
}
printf("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\n");
for(int l=0;l<26;l++){
printf("%c ",k[l]+65);
}
printf("\n");
}
//加密
int encrypt(int *k,int a){
int c;
c=k[a];
char d = (char)c+65;
printf("%c\n", d);
return c;
}
//解密
int decrypt(int *k,int a){
for(int i=0;i<26;i++){
if(k[i]==a){
printf("%c\n",i+97);
}
}
}
//主函数
int main(){
char text[100]="";
int end[100];
int k[26];
printf("生成密钥:\n");
keygeneration(k);
printf("请输入明文\n");
scanf("%[^\n]",text);
int l= strlen(text);
printf("以下为密文\n");
for(int i=0;i<l;i++){
int p=text[i]-97;
end[i]=encrypt(k,p);
}
printf("以下为明文\n");
for(int i=0;i<l;i++){
int c=end[i];
decrypt(k,c);
}
}