① 愷撒密碼的原理
密碼的使用最早可以追溯到古羅馬時期,《高盧戰記》有描述愷撒曾經使用密碼來傳遞信息,即所謂的「愷撒密碼」,它是一種替代密碼,通過將字母按順序推後起3位起到加密作用,如將字母A換作字母D,將字母B換作字母E。因據說愷撒是率先使用加密函的古代將領之一,因此這種加密方法被稱為愷撒密碼。這是一種簡單的加密方法,這種密碼的密度是很低的,只需簡單地統計字頻就可以破譯。現今又叫「移位密碼」,只不過移動的位數不一定是3位而已。
密碼術可以大致分為兩種,即移位和替換,當然也有兩者結合的更復雜的方法。在移位中字母不變,位置改變;替換中字母改變,位置不變。
將替換密碼用於軍事用途的第一個文件記載是愷撒著的《高盧記》。愷撒描述了他如何將密信送到正處在被圍困、瀕臨投降的西塞羅。其中羅馬字母被替換成希臘字母使得敵人根本無法看懂信息。
蘇托尼厄斯在公元二世紀寫的《愷撒傳》中對愷撒用過的其中一種替換密碼作了詳細的描寫。愷撒只是簡單地把信息中的每一個字母用字母表中的該字母後的第三個字母代替。這種密碼替換通常叫做愷撒移位密碼,或簡單的說,愷撒密碼。
盡管蘇托尼厄斯僅提到三個位置的愷撒移位,但顯然從1到25個位置的移位我們都可以使用, 因此,為了使密碼有更高的安全性,單字母替換密碼就出現了。
如:
明碼表 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
密碼表 T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
明文 T H E F A U L T, D EAR BRUTUS, L I ES N OT I N OUR ST ARS B UT I N OURSELVES.
密文 M A X Y T N EM, WX TK UKNMNL, EBX L GHM BG HN K LMT KL U NM BG HNK LXEOXL.(空格是為了和上排對齊)
只需重排密碼表二十六個字母的順序,允許密碼表是明碼表的任意一種重排,密鑰就會增加到四千億億億多種,我們就有超過4×1027種密碼表。破解就變得很困難。
如何破解包括愷撒密碼在內的單字母替換密碼?
方法:字母頻度分析
盡管我們不知道是誰發現了字母頻度的差異可以用於破解密碼。但是9世紀的科學家阿爾·金迪在《關於破譯加密信息的手稿》對該技術做了最早的描述。
「如果我們知道一條加密信息所使用的語言,那麼破譯這條加密信息的方法就是找出同樣的語言寫的一篇其他文章,大約一頁紙長,然後我們計算其中每個字母的出現頻率。我們將頻率最高的字母標為1號,頻率排第2的標為2號,第三標為3號,依次類推,直到數完樣品文章中所有字母。然後我們觀察需要破譯的密文,同樣分類出所有的字母,找出頻率最高的字母,並全部用樣本文章中最高頻率的字母替換。第二高頻的字母用樣本中2號代替,第三則用3號替換,直到密文中所有字母均已被樣本中的字母替換。」
以英文為例,首先我們以一篇或幾篇一定長度的普通文章,建立字母表中每個字母的頻度表。
在分析密文中的字母頻率,將其對照即可破解。
雖然設密者後來針對頻率分析技術對以前的設密方法做了些改進,比如說引進空符號等,目的是為了打破正常的字母出現頻率。但是小的改進已經無法掩蓋單字母替換法的巨大缺陷了。到16世紀,最好的密碼破譯師已經能夠破譯當時大多數的加密信息。
局限性:
短文可能嚴重偏離標准頻率,假如文章少於100個字母,那麼對它的解密就會比較困難。
而且不是所有文章都適用標准頻度:
1969年,法國作家喬治斯·佩雷克寫了一部200頁的小說《逃亡》,其中沒有一個含有字母e的單詞。更令人稱奇的是英國小說家和評論家吉爾伯特·阿代爾成功地將《逃亡》翻譯成英文,而且其中也沒有一個字母e。阿代爾將這部譯著命名為《真空》。如果這本書用單密碼表進行加密,那麼頻度分析破解它會受到很大的困難。
一套新的密碼系統由法國外交家維熱納爾(Blaise de Vigenère)於16世紀末確立。其密碼不再用一個密碼表來加密,而是使用了26個不同的密碼表。這種密碼表最大的優點在於能夠克制頻度分析,從而提供更好的安全保障。
② 凱撒密碼
我覺得創建26個文件實在太冗雜了。其實一個就夠了,因為隨著你的選擇的改變(比如以9為加密條件,所有字母循環後移9位),目標文件裡面的內容就自動更新了。
當然你也可以使用函數 int create(char *filename , int mode) 在執行框裏手動輸入像 e:\\original.txt 這樣的地址字元,但你想像一下,這是不是很麻煩?
在實際加密中,可使用隨機函數 rand()產生循環後移位數,而且完全可以不限制在26位,擴展ASCII碼可以產生成千上萬的字元,將文件加密到那些幾乎無規律,難以識別的字元上,安全性就提高了許多。當然還有什麼多輪加密之類的。可以自己慢慢摸索,挺有趣的。祝你好運!
修改如下(已成功執行):
#include<stdio.h>
#include<stdlib.h>
char encrypt(char ch,int n)/*加密函數,把字元向右循環移位n*/
{
while(ch>='A'&&ch<='Z')
{
return ('A'+(ch-'A'+n)%26);
}
while(ch>='a'&&ch<='z')
{
return ('a'+(ch-'a'+n)%26);
}
return ch;
}
void main()
{
FILE *in,*out;
char ch1,ch2;
int i;
printf("Please input the number(1~26) you want to use for encrypt:");
scanf("%d",&i);
if((in=fopen("e:\\original.txt","r"))==NULL)/*文件名根據自己建立的位置修改,
我建在e盤的根目錄下
{
printf("Can not open this file!\n");
exit(0);
}
if((out=fopen("e:\\encrypt.txt","w"))==NULL) //同上
{
printf("Can not open this file!\n");
exit(0);
}
while(!feof(in)){
if((ch1=fgetc(in))!=EOF)
ch2=encrypt(ch1,i);
fputc(ch2,out);
}
printf("Encrypt is over!\n");
fclose(in);
fclose(out);
}
③ 凱撒密碼和柵欄密碼解密
凱撒密碼:明文中的所有字母都在字母表上向後進行偏移後替換成偏移後的密文 偏移量通常是3 AA=z 例如:所有的字母A將被替換成D,B變成E,以此類推
但是凱撒密碼還有其它種類有: 偏移量為10 稱做 Avocat(AK)
偏移量為13 稱做 ROT13
偏移量為-5 稱做 Cassis (K 6)
偏移量為-6 稱做 Cassette (K 7)
柵欄密碼,就是把要加密的明文分成N個一組,然後把每組的第1個字連起來,形成一段無規律的話。 不過柵欄密碼本身有一個潛規則,就是組成柵欄的字母一般不會太多。(一般不超過30個,也就是一、兩句話) 比較復雜
④ 凱撒密碼的演算法c語言的怎麼實現啊
凱撒密碼是一種非常古老的加密方法,相傳當年凱撒大地行軍打仗時為了保證自己的命令不被敵軍知道,就使用這種特殊的方法進行通信,以確保信息傳遞的安全。他的原理很簡單,說到底就是字母於字母之間的替換。下面讓我們看一個簡單的例子:「」用凱撒密碼法加密後字元串變為「edlgx」,它的原理是什麼呢?把「」中的每一個字母按字母表順序向後移3位,所得的結果就是剛才我們所看到的密文。
#include <stdio.h>
main()
{
char M[100];
char C[100];
int K=3,i;
printf("請輸入明文M(注意不要輸入空白串)\n");
gets(M);
for(i=0;M[i]!='\0';i++)
C[i]=(M[i]-'a'+K)%26+'a';
C[i]='\0';
printf("結果是:\n%s\n",C);
}