密码学——凯撒密码
文章目錄
- 前言
- 一、凱撒密碼簡介
- 二、凱撒密碼算法
- 1.加密算法
- 2.解密算法
- 三、代碼實現
- 總結
前言
本內容為博主學習凱撒密碼的筆記,如有錯誤,煩請指正。
一、凱撒密碼簡介
凱撒密碼是最早的代換密碼,使用單表代換。其基本思想是:通過把字母移動一定的位數來實現加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一個固定數目進行偏移后被替換成密文。例如,當偏移量是3的時候,所有的字母A將被替換成D,B變成E,以此類推X將變成A,Y變成B,Z變成C。位數就是凱撒密碼加密和解密的密鑰。
例子如下:
二、凱撒密碼算法
1.加密算法
對于某一明文字母m來說,假設其ASCII碼為x,往后移了i位,則新得到的密文c的ASCII碼為x + i,考慮加密為26個字母周期性加密,則需將ASCII碼對26取模,舉例小寫字母如下:
c = (m - 'a' + i) % 26 + 'a';2.解密算法
同理,解密算法也是一個意思,對于某一密文字母m來說,假設其ASCII碼為x,往前移了i位,則新得到的密文c的ASCII碼為x - i,考慮加密為26個字母周期性加密,則需將ASCII碼對26取模,再考慮到且(x-i)可能為負數,取’z’進行計算,舉例小寫字母如下:
m = (c - 'z' - i) % 26 + 'z';三、代碼實現
下面代碼實現對移位為i的凱撒密碼加密算法,只對字母有效,區分大小寫。
#include <stdio.h>void main(){char plaintext[100],ciphertext[100];char m;int i,k,j=0;while(1){printf("請選擇模式:1.加密 2.解密 0.退出\n");scanf("%d", &k);if(k == 0) break;else if(k == 1){printf("請輸入加密位數:");scanf("%d", &i);getchar();printf("請輸入明文:\n");gets(plaintext);for(j = 0; plaintext[j] != '\0'; j++){m = plaintext[j];if(m <= 'Z' && m >='A')//往后移ciphertext[j] = (m - 'A' + i) % 26 + 'A';else if(m <= 'z' && m >='a')ciphertext[j] = (m - 'a' + i) % 26 + 'a';else ciphertext[j] = m;}ciphertext[j] = '\0';//添加結束符printf("加密后的密文如下:\n");for(j = 0; ciphertext[j] != '\0'; j++)printf("%c", ciphertext[j]);printf("\n");}else if(k == 2){printf("請輸入解密位數:");scanf("%d", &i);getchar();printf("請輸入密文:\n");gets(ciphertext);for(j = 0; ciphertext[j] != '\0'; j++){m = ciphertext[j];if(m <= 'Z' && m >='A')//往前移plaintext[j] = (m - 'Z' - i) % 26 + 'Z';else if(m <= 'z' && m >='a')plaintext[j] = (m - 'z' - i) % 26 + 'z';else plaintext[j] = m;}plaintext[j] = '\0';printf("加密后的密文如下:\n");for(j = 0; plaintext[j] != '\0'; j++)printf("%c", plaintext[j]);printf("\n");}elseprintf("輸入錯誤!\n");memset(plaintext, 0, 100);//清空字符數組memset(ciphertext, 0, 100);} }示例結果如下
總結
凱撒密碼是比較簡單的,只是進行單表代換,實現起來也比較容易,破解起來也不難,是很不安全的密碼。
凱撒密碼是沒有密匙的,即使沒有密匙也能將它破解出來,因為凱撒移位密碼只有25種密匙,最多就是將這25種可能性挨個檢測一下可以了,這就是我們所說的暴力破解法。
當然,還可以使用頻度分析法分析每個字母出現的頻率,從而知道凱撒密碼的移位數。
“如果我們知道一條加密信息所使用的語言,那么破譯這條加密信息的方法就是找出同樣的語言寫的一篇其他文章,大約一頁紙長,然后我們計算其中每個字母的出現頻率。我們將頻率最高的字母標為1號,頻率排第2的標為2號,第三標為3號,依次類推,直到數完樣品文章中所有字母。然后我們觀察需要破譯的密文,同樣分類出所有的字母,找出頻率最高的字母,并全部用樣本文章中最高頻率的字母替換。第二高頻的字母用樣本中2號代替,第三則用3號替換,直到密文中所有字母均已被樣本中的字母替換。”——(360百科)
總結
- 上一篇: java求1~20阶乘之和
- 下一篇: Flash CS4运行时提示:Java运