Caesar cipher 凱撒密碼,一種既古典又經典的替換式密碼,凱撒將要給遠方將領的信函內容隱密起來避免重要軍事命令外流,學歷史加練C#語法的筆記。
羅馬共和的執政官凱撒Caesar除了將羅馬陰曆改成陽曆的Julian Date外,更建立了一種替換式密碼。
從caesar cipher wiki中的示意圖可以發現,每個英文字母(拉丁字母)置換為後3個位置的字母:
加密方程式:
\(En(P)= (P+K) mod 26 \)
public string CaesarEncryption(string PlainText, int Offset)
{
//需要置換的拉丁字母
char[] Encyclopedia = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
StringBuilder sb = new StringBuilder();
foreach (char c in PlainText.ToUpper())
{
int idx = c - 'A';
if (idx >= 0 && idx < Encyclopedia.Length)
{
sb.Append(Encyclopedia[((idx + Offset) % 26)]);
}
else
{
sb.Append(c);
}
}
return sb.ToString();
}
測試程式:
//輸入拉丁字母
string PlainText = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//凱撒加密:向右位移3
string CipherText = CaesarEncryption(PlainText, 3);
Console.WriteLine("輸入:{0}", PlainText);
Console.WriteLine("加密:{0}", CipherText);
//解密 26 - 3:向右位移23
string PlainText2 = CaesarEncryption(CipherText, 23);
Console.WriteLine("解密:{0}", PlainText2);
測試結果:
後來衍生一種ROT13加密法,意思是加密是向右位移13個位置,是一種在英文網路論壇用作隱藏八卦(spoiler)、妙句、謎題解答以及某些髒話的工具,目的是逃過版主或管理員的匆匆一瞥。
有趣的是加密的位移量和解密位移量是相同的!
替換式加密法小結:
- 替換加密法不會改變字母出現次數,一篇文章經過替換式密碼加密,統計加密後各字母出現的次數,然後與過去文章字母出現頻率統計數經驗相比較就可以破解。
- 幾年前曾發現某些銀行帳單的繳款條碼以身分證字號編碼然後替換數字外加改變位置,如果蒐集足夠的樣本數,還是很容易取得個資。
- 中國文字博大精深,常用超過1萬個字,這要怎麼替換? 藏頭詩好像比較容易。
字母出現頻率分析:
參考: