恺撒密码

点击文章标题进入阅读模式!

尊重知识产权,引用注明出处!谢谢合作!
有问题请在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表
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");
}

运行结果:
C

python代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# -*- coding = utf-8 -*-
# @Time : 2022/5/8 22:04
# @Author : 乙太
# @file : 凯撒加密.py
# @Software: PyCharm

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)

运行结果:
py