明文空间M、密文空间C都是和密钥空间K满足,M=C=K={0,1,2,…,25}=Z_26 ,即把26个英文字母与整数0,1,2,…,25一一对应。
加密变换,E={E:Z26→Z26, Ek (m) = m + k (mod26)| m∈M, k∈K }
解密变换,D={D:Z26→Z26, Dk © = c-k (mod26)| c∈C, k∈K }
解密后再把Z26中的元素转换英文字母。
密文 = 明文 + key(mod26) 【把明文字母依次向后移k位,其中k小于26】
当密钥k=3时,就是历史上著名的凯撒密码(Caesar)
C语言代码如下:
#include
#include
int main (){
char small_letter[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'};
char big_letter[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'};
char text[1000],result[1000];
int c,count=0,k,p;
int c1,p1;
char function;
printf("Insert Message:");
c=getchar();
c1=c;
while(1) //读取字符串
{
if(c == '\n') break;
text[count]=c;
printf("%c",text[count]);
count++;
c=getchar();
}
printf("\n");
printf("Please select E encryption or D decryption:");
scanf("%c",&function);
if (function == 'E'){
printf("Insert Key :" );
scanf("%d",&k);
for(int i=0;i<count;i++){
if(text[i]>='A'&&text[i]<='Z')
{
result[i]=big_letter[((text[i]-'A')+k)%26];
}
//找出加密后字符在字符数组里的对应位置
else if (text[i]>='a'&&text[i]<='z')
{
result[i]=small_letter[((text[i]-'a')+k)%26];
}
else result[i]=text[i];
printf("%c",result[i]);
}
}
else if(function == 'D') {
printf("Insert Key :" );
scanf("%d",&k);
for(int i=0;i<count;i++){
if(text[i]>='A'&&text[i]<='Z')
{
p=((text[i]-'A')-k);
while(p<0)p+=26;
result[i]=big_letter[p];
}
//找出解密后字符在字符数组里的对应位置,注意不要让它超出范围(下表位置为负数)
else if (text[i]>='a'&&text[i]<='z')
{
p=((text[i]-'a')-k);
while(p<0)p+=26;
result[i]=small_letter[p];
}
else result[i]=text[i];
printf("%c",result[i]);
}
printf("\n");
}
return 0;
}