点击文章标题进入阅读模式!
尊重知识产权,引用注明出处!谢谢合作! 有问题请在B站私信! 链接欢迎大家关注我的Bilibli 感谢一键三连哦~
在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。
这里我们主要讨论的还是如何使用C语言,和Python语言实现恺撒密码的算法! 关于密码,具体还请看到百度百科解释恺撒密码
(1). 如何确定哪些字符不需要改变?哪些字符需要改变?如果需要改变?应该改为哪个对应的字符?
算法的处理方法是:输入一个字符串,给字符变量char c,先判定它是否为字母(包括大小写)。若不是字母,则不改变c的值;若是字母则还要继续检查它是否在(‘Z’-密钥数字+1~’Z’)内(包括大小写字母也是对应转化)。如果不在这个范围,那么就可以正常偏移,即使该字母的ASCII值+密钥,这就等于字母往后移动了密钥的位数;如果在这个范围内,那么偏移是就该使该字母的ASCII值+密钥-26,因为有26个英文字母,所以减26就是回到A开始继续往后移动
(2). 如何使字符变量c改变为所指定的字母?
办法是改变它的ASCII值,例如字符变量的原值使大写字母’A’,想使c的值改变为’E’,只需执行’c = c + 4’即可,因为’A’的ASCII值是65,而’E’的ASCII值是69,二者相差4。
对照ASCII表
C语言源程序代码:
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 27 28 29 30 31 32 33 34 35 int add () { char a[20 ] = { 0 }; int b = 0 ; int c = 0 ; printf ("输入密文:\n" ); scanf ("%s" , a); c = strlen (a); printf ("输入密钥:\n" ); scanf ("%d" , &b); for (int i = 0 ; i < c; i++) { if ((a[i] >= 'a' && a[i] <= 'z' ) || (a[i] >= 'A' && a[1 ] <= 'Z' )) { if ((a[i] >= ('Z' - b + 1 ) && a[i] <= 'Z' ) || (a[i] >= ('z' - b + 1 ) && a[i] <= 'z' )) { a[i] = a[i] - (26 - b); } else { a[i] = a[i] + b; } } printf ("%c" , a[i]); } printf ("\n" ); return 0 ; } int main () { add(1 ); system("pause" ); }
运行结果:
python代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 str = input ("输入密文:\n" )b = int (input ("输入密钥:\n" )) flag="" for i in range (len (str )): if (ord (str [i]) >= ord ('a' ) and ord (str [i]) <= ord ('z' )) or (ord (str [i]) >= ord ('A' ) and ord (str [1 ]) <= ord ('Z' )): if ((ord (str [i]) >= (ord ('Z' ) - b + 1 ) and ord (str [i]) <= ord ('Z' )) or (ord (str [i]) >= (ord ('z' ) - b + 1 ) and ord (str [i]) <= ord ('z' ))): flag += chr (ord (str [i]) - (26 - b)) else : flag += chr (ord (str [i]) + b) else : flag += str [i] print (flag)
运行结果: