【随笔】凯撒密码的简单实现

一、恺撒密码简介

在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。

根据偏移量的不同,还存在若干特定的恺撒密码名称:

  • 偏移量为10:Avocat(A→K)
  • 偏移量为13:ROT13
  • 偏移量为-5:Cassis (K 6)
  • 偏移量为-6:Cassette (K 7)

二、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
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <bits/stdc++.h>
using namespace std;

const int SIZ = 100000;
char src[SIZ], enc[SIZ];

void caesar(char src[], char enc[], int key)
{
key %= 26;
for (int i=0; src[i]; i++)
{
if ((src[i]<'A') || (src[i]>'Z' && src[i]<'a') || src[i]>'z') {
enc[i] = src[i]; continue;
}

if (src[i] >= 'a')
enc[i] = (src[i] - 'a' + key + 26) % 26 + 'a';
else
enc[i] = (src[i] - 'A' + key + 26) % 26 + 'A';
}
}

int main()
{
system("chcp 65001");
while (1)
{
printf("-- 凯撒密码 加/解密 -- \n");
printf("1. 加密 \n2. 解密 \n3. 退出 \n");

int select, key; scanf("%d", &select);
if (select == 3) break;

printf("请输入原文: "); scanf("%s", src);
printf("请输入密钥: "); scanf("%d", &key);

if (select == 2) key = -key;
memset(enc, 0, sizeof(enc));

caesar(src, enc, key); printf("密文: %s\n", enc);
system("pause"); system("cls");
}
return 0;
}

/*
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
*/