Caesar 暗号
概要
文字列
計算量
与えられた文字列の長さを
Snippet
C++
cpp
std::string caesar_cipher(std::string &s, int n) {
char table[0xff] = {0};
for (int t = 0; t < 0xff; t++) {
table[t] = t;
}
for (int i = 0; i < 26; i++) {
char upper_ch_src = 'A' + i;
char upper_ch_dst = 'A' + (i + n) % 26;
char lower_ch_src = 'a' + i;
char lower_ch_dst = 'a' + (i + n) % 26;
table[(int)upper_ch_src] = upper_ch_dst;
table[(int)lower_ch_src] = lower_ch_dst;
}
std::string res = "";
for (int i = 0; i < (int)s.size(); i++) {
char ch = s[i];
res += table[(int)ch];
}
return res;
}
Python
python
def caesar_cipher(s, n):
d = {}
for c in (65, 97):
for i in range(26):
d[chr(i + c)] = chr((i + n) % 26 + c)
return "".join([d.get(c, c) for c in s])
解説
シーザー暗号 (Caesar cipher) は平文のアルファベットを辞書順で3文字だけ後ろにずらすという古典的な暗号である.
以下のように a
は d
となり, b
は e
となる.
- a -> d
- b -> e
- c -> f
- d -> g
また x
は a
, y
は b
といったように, z
を超える場合はアルファベットを一周して a
に戻る.
- w -> z
- x -> a
- y -> b
- z -> c
13文字シフトのシーザー暗号は特に ROT13
と呼ばれており, 復号と暗号化が同じ操作であることが知られている.
ROT13
は nkf
や tr
を使って以下のように復号することもできる.
- nkf
$ echo URYYB_JBEYQ | nkf -r
HELLO_WORLD
- tr
$ echo URYYB_JBEYQ | tr A-Z N-ZA-M | tr a-z n-za-m
HELLO_WORLD