将替代密码用于军事用途的第一个文件记载是恺撒著的《高卢记》。恺撒描述了他如何将密信送到正处在被围困、濒临投降的西塞罗。其中罗马字母被替换成希腊字母使得敌人根本无法看懂信息。苏托尼厄斯在公元二世纪写的《恺撒传》中对恺撒用过的其中一种替代密码作了详细的描写。恺撒只是简单地把信息中的每一个字母用字母表中的该字母后的第三个字母代替。这种密码替换通常叫做凯撒移位密码,或简单的说,凯撒密码。
//编译环境VS2022.
#include <stdio.h>
#include <string.h>
int main()
{
char s[100], c;
int i, p, d, e;
printf("请选择 : A.加密 B.解密 Q.退出\n");
scanf_s("%c", &c,10);
//加密过程。
if (c == 'a' || c == 'A')
{
printf("输入明文:");
scanf_s("%s", &s,100);//scanf_s需要对于数组设置缓冲区大小(即100)。
p = strlen(s);
printf("请设置偏移量:");
scanf_s("%d", &d,3);
for (i = 0; i < p; i++)
{
if (s[i] >= 'a' && s[i] <= 'z')
s[i] = (s[i] - 'a' + d) % 26 + 'a';//这里运用到了ASCII码对于字母的计算。
else if (s[i] >= 'A' && s[i] <= 'Z')
s[i] = (s[i] - 'A' + d) % 26 + 'A';
else s[i] = s[i] + d;
}
printf("%s", s);
printf("\n\n\n");
}
//解密。
if (c == 'b' || c == 'B')
{
printf("请输入密文:");
scanf_s("%s", &s,100);
p = strlen(s);
printf("请输入加密的偏移变量:");
scanf_s("%d", &d,3);
for (i = 0; i < p; i++)
{
if (s[i] >= 'a' && s[i] <= 'z')
{
e = s[i] - 'a' - d;
if (e <= 0)
s[i] = (e + 26) % 26 + 'a';
else s[i] = e % 26 + 'a';
}
else if (s[i] >= 'A' && s[i] <= 'Z')
{
e = s[i] - 'A' - d;
if (e < 0)
s[i] = (e + 26) % 26 + 'A';
else s[i] = e % 26 + 'A';
}
else s[i] = s[i] - d;
}
printf("%s", s);
printf("\n\n");
}
//不进行任何操作
if (c == 'q' || c == 'Q')
return 0;
return 0;
}