一、常规凯撒
1.原理:
它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。
2.代码实现凯撒
#include <stdio.h>
#include <stdlib.h>
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;
char function;
printf("Insert Text:");
c=getchar();
while(1) //读取字符串
{
if(c == '\n') break;
text[count]=c;
printf("%c",text[count]);
count++;
c=getchar();
}
printf("\n");
printf("Encrypt or Decrypt? E or D :");
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 {
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;
}
二、变异凯撒
1.原理:常规凯撒是每个字母的偏移量是一样的,变异凯撒是第一个字母偏移量是m,第二个偏移量是m+1(或m+n),之后的依次在前一个的偏移量上+1(或+n)
2.例题
寒鹭变异凯撒:题是mrfk~Gbsx]@]`mZjt,之前正好解了一道与这个相似的,直接用凯撒密码解不出来,是变异的。所以mrfk正好对应flag,m对f偏移量为-7,r对l为-6,f对a为-5,k对g为-4,所以每次加一,用ASCII表对照来解
标签:text,偏移量,密码,result,letter,printf,凯撒 From: https://www.cnblogs.com/Lyjia-n/p/18178600