?? kaiser.txt
字號:
凱撒密文的破解編程實現
近來安全的發展,對密碼學的研究越來越重要,雖然我們現在大多采用的是
非對稱密碼體制,但是同時由于處理及其它的一些重要原因,對傳統密碼仍然
是在大量的使用,如移位,替代的基本思想仍然沒有改變,我個人認為,將來
的很長時間內,我們必將會花大量的時間對密碼學進行研究,從而才能促進我
們的電子政務,電子商務的健康發展,下面我要談的是對一個古典密碼-----
凱撒(kaiser)密碼的的解密,也就是找出它的加密密鑰,從而進行解密,由于
它是一種對稱密碼體制,加解密的密鑰是一樣的,下邊簡單說明一下加解密
加密過程:
密文:C=M+K (mod 26)
解密過程:
明文:M=C-K (mod 26)
詳細過程請參考相關資料
破解時主要利用了概率統計的特性,E字母出現的概率最大。
加密的程序實現我就不說了,
下面重點說一下解密的程序實現:我是用C寫的,在VC6.0下調試運行正確
#include"stdio.h"
#include"ctype.h"
#include"stdlib.h"
main(int argc ,char *argv[])
{
FILE *fp_ciper,*fp_plain; //密文與明文的文件指針
char ch_ciper,ch_plain;
int i,temp=0; //i用來存最多次數的下標
//temp用在求最多次數時用
int key; //密鑰
int j;
int num[26]; //保存密文中字母出現次數
for(i = 0;i < 26; i++)
num[i] = 0; //進行對num[]數組的初始化
printf("======================================================\n");
printf("------------------BY 安美洪 design--------------------\n");
printf("======================================================\n");
if(argc!=3)
{
printf("此為KAISER解密用法:[文件名] [密文路徑] [明文路徑]\n");
printf("如:decryption F:\ciper_2_1.txt F:\plain.txt\n");
} //判斷程序輸入參數是否正確
if((fp_ciper=fopen(argv[1],"r"))==NULL)
{
printf("打開密文出錯!解密失敗\n");
exit(0);
}
while((ch_ciper=fgetc(fp_ciper))!=EOF)
switch(ch_ciper)
{
case 'A':num[0]=num[0]+1; break; //統計密文各字母出現次數
case 'B':num[1]=num[1]+1; break; //與上同,下邊一樣
case 'C':num[2]=num[2]+1; break;
case 'D':num[3]=num[3]+1; break;
case 'E':num[4]=num[4]+1; break;
case 'F':num[5]=num[5]+1; break;
case 'G':num[6]=num[6]+1; break;
case 'H':num[7]=num[7]+1; break;
case 'I':num[8]=num[8]+1; break;
case 'J':num[9]=num[9]+1; break;
case 'K':num[10]=num[10]+1;break;
case 'L':num[11]=num[11]+1;break;
case 'M':num[12]=num[12]+1;break;
case 'N':num[13]=num[13]+1;break;
case '0':num[14]=num[14]+1;break;
case 'P':num[15]=num[15]+1;break;
case 'Q':num[16]=num[16]+1;break;
case 'R':num[17]=num[17]+1;break;
case 'S':num[18]=num[18]+1;break;
case 'T':num[19]=num[19]+1;break;
case 'U':num[20]=num[20]+1;break;
case 'V':num[21]=num[21]+1;break;
case 'W':num[22]=num[22]+1;break;
case 'X':num[23]=num[23]+1;break;
case 'Y':num[24]=num[24]+1;break;
case 'Z':num[25]=num[25]+1;break;
}
fclose(fp_ciper);
for(i=0;i<26;i++)
if(num[i]>temp)
{
j=i; // 求出最大次數的下下標
temp=num[i];
}
if(j<5)
key=(j+1+26)-5; //是按字母表的第幾位計算
//而不是按下標,故加1
//5是指E在字母表中的位序
else
key=(j+1)-5;
if((fp_ciper=fopen(argv[1],"r"))==NULL)
{
printf("再次打開密文出錯!解密失敗\n");
exit(0);
} //再次打開密文,進行解密
if((fp_plain=fopen(argv[2],"w"))==NULL)
{
printf("打開或建立明文文件出錯!解密失敗\n");
exit(0);
} //把明文存到此文件
while((ch_ciper=fgetc(fp_ciper))!=EOF)
{
if(ch_ciper > 'E')
ch_plain=(((ch_ciper-'A'-key)%26)+'A'); //解密
else
ch_plain=(((ch_ciper-'A'-key+26)%26)+'A'); //解密
ch_plain=tolower(ch_plain); //把大寫明文轉化為小寫
fputc(ch_plain,fp_plain); //把明文寫到文件文件plain
}
fclose(fp_ciper);
fclose(fp_plain);
printf("解密成功,密鑰KEY=%d,明文已保存到文件中,謝謝使用!\n",key);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -