《現(xiàn)代密碼學(xué)-古典密碼 實驗報告》由會員分享,可在線閱讀,更多相關(guān)《現(xiàn)代密碼學(xué)-古典密碼 實驗報告(13頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、真誠為您提供優(yōu)質(zhì)參考資料,若有不當之處,請指正。
現(xiàn)代密碼學(xué)
實
驗
報
告
院系:理學(xué)院
班級:信安二班
姓名:
學(xué)號:
前言
密碼學(xué)(Cryptology)是研究秘密通信的原理和破譯秘密信息的方法的一門學(xué)科。密碼學(xué)的基本技術(shù)就是對數(shù)據(jù)進行一組可逆的數(shù)學(xué)變換,使未授權(quán)者不能理解它的真實含義。密碼學(xué)包括密碼編碼學(xué)(Cryptography)和密碼分析學(xué)(Cryptanalyst)兩個既對立又統(tǒng)一的主要分支學(xué)科。研究密碼變化的規(guī)律并用之于編制密碼以保護信息安全的科學(xué),稱為密碼編碼學(xué)。研究密碼變化的規(guī)律并用之于密碼以獲取信息情報的科學(xué),稱為密碼分析學(xué),也
2、叫密碼破譯學(xué)。
密碼學(xué)在信息安全中占有非常重要的地位,能夠為信息安全提供關(guān)鍵理論與技術(shù)。密碼學(xué)是一門古老而深奧的學(xué)問,按其發(fā)展進程,經(jīng)歷了古典密碼和現(xiàn)代密碼學(xué)兩個階段?,F(xiàn)代密碼學(xué)(Modern Cryptology)通常被歸類為理論數(shù)學(xué)的一個分支學(xué)科,主要以可靠的數(shù)學(xué)方法和理論為基礎(chǔ),為保證信息的機密性、完整性、可認證性、可控性、不可抵賴性等提供關(guān)鍵理論與技術(shù)。
古典密碼算法實驗
在密碼編碼體制中有兩種 基本也是 古老的編碼體制一直沿用至今,它們是代替密碼和置換密碼,其歷史悠久并且是現(xiàn)代密碼體制的基本組成部分,在密碼學(xué)中占有重要
3、地位。古典密碼是密碼學(xué)發(fā)展的一個階段,也是近代密碼學(xué)產(chǎn)生的淵源,一般把 Shannon 在 1949 年發(fā)表“保密系統(tǒng)的通信理論”之前的時期稱為古典密碼時期。盡管古典密碼大多比較簡單,一般可用手工或機械方式實現(xiàn),且都可用統(tǒng)計分析方法破譯,目前已很少采用。但是,古典密碼所采用的代替技術(shù)和置換技術(shù)仍然是現(xiàn)代分組密碼算法設(shè)計的基礎(chǔ),了解它們的設(shè)計原理,有助于理解、設(shè)計和分析現(xiàn)代密碼。
一、 實驗?zāi)康?
通過編程實現(xiàn)經(jīng)典的代替密碼算法和置換密碼,包括移位密碼、維吉尼亞密碼、周期置換密碼、列置換密碼,加深對代替技術(shù)的了解,為現(xiàn)代分組密碼實驗奠定基礎(chǔ)。
二、 實驗原理
代替(Substitu
4、tion)是古典密碼中 基本的處理技巧,就是將明文字母由其他字母表中的字母替換的一種方法。代替密碼(Substitution Cipher)就是使用代替法進行加解密的密碼算法。代替密碼的密鑰是一個替換表,它表示了明文字母與密文字母的對應(yīng)關(guān)系。加密時,通過查表,明文字母被逐個替換后,生成看似無任何意義的字母串,即密文。解密時,逆向使用替換表,將密文字母逐個替換為明文字母。
按照一個明文字母是否總是被一個固定的字母代替進行劃分,代替密碼可分為兩類:
(1) 單表代替密碼(Monoalphabetic Substitution Cipher):明文中出現(xiàn)的同一個字母,不管它出現(xiàn)在什么位置,在
5、加密時都用相同的字母來代替。移位密碼就是單表代替密碼。
(2) 多表代替密碼(Polyalphabetic Substitution Cipher):明文中出現(xiàn)的同一個字母,在加密時不是完全被相同的字母代替,而會根據(jù)其出現(xiàn)的位置次序用不同的字母代替。維吉利亞密碼就是多表代替密碼。
1. 移位密碼
移位密碼(Shift Cipher)是一種典型的單表替代密碼,也稱為加法密碼。
移位密碼的加密方法就是將明文中的每個字母用其在字母表后面的第 k 個字母替代,它的加密過程可以表示為:
c = (m + k) mod n
其中,m 為明文字母在字母表中的位置數(shù);n 為字母表中的字母
6、總數(shù);k 為密鑰;c 為密文字母在字母表中對應(yīng)的位置數(shù)。相應(yīng)的,移位密碼的解密過程可以表示為:
m = (c - k) mod n
實驗代碼:
#include
#include
using namespace std;
//定義一些全局變量
char str[100]; //用于存儲處理前字符串
char enstr[100]; //用于存儲處理后字符串
int num=0; //用于累計字符數(shù)量
char * p; //用于指向處理字符串
int key;
//加
7、密
void encrypt()
{
while(*p!='\0')
{
*p=(*p-97+key)%26+97;
p++;
}
cout<<”CRYPT_OK”<
8、 main()
{
int ord;
while(1)
{
cout<<"1.加密\n2.解密\n3.退出"<>ord;
if(ord==1)
{
cout<<"請輸入待處理字符串:"<>str;
p=str;
cout<<"請輸入密鑰:";
cin>>key;
encrypt();
}
if(ord==2)
{
cout<<"請
9、輸入待處理字符串:"<>str;
p=str;
cout<<"請輸入密鑰:";
cin>>key;
decrypt();
}
if(ord==3) break;
}
}
實驗結(jié)果:
2. 維吉尼亞密碼
維吉尼亞密碼(Vigenere Cipher)是一種多表代替密碼,其本質(zhì)是周期移位密碼。
維吉尼亞密碼的(用戶)密鑰為一含有 d 個字母的有限字母序列
k = k0k1…kd-1
加密時,首先將用戶密鑰進行周期擴展(周期為 d),擴展后的無限字母序列稱為工作密鑰,記為
10、
K = K0K1…Ki… 其中
Ki = Ki mod d ,i=0,1,…
當 d=1 時,維吉尼亞密碼就是移位密碼。對于含有 l 個字母的明文,維吉尼亞加密過程可以表示為:
ci = (mi+Ki ) mod n
其中,M = m0m1…mi…ml-1 為明文,C = c0c1…ci…cl-1 為密文,K = K0K1…Ki…Kl-1 為工作鑰, n 為明文字母表的長度,l 為明文長度(含有字母的數(shù)目)。
例如,使用用戶鑰 cat,對明文“vigenere cipher” 進行維吉尼亞加密。此時,n=26(對應(yīng)英文字母表),用戶鑰 c=3、a=0、t=19,得到的密
11、文為“xizgnxtevkpagr”。
實驗代碼:
#include
using namespace std;
int main()
{
while(1)
{
char choice;
cout<>choice;
if(choice=='1')
{
char arra[100]="",arrb[100]="",arrc[100]=""
12、;
int i=0;
char a,b,c;
cout<<"請輸入明文:";
cin>>arrb;
cout<<"請輸入密鑰:";
cin>>arra;
int an=strlen(arra);
int bn=strlen(arrb);
if(an90)
13、{
c=char(64+c%90);
arrc[i]=c;
}
else
arrc[i]=char(c);
}
cout<<"加密后密文為:";
for(i=0;i>arrc;
cout<<"請輸
14、入密鑰:";
cin>>arra;
//cout<
15、
arrb[i]=char(b);
}
else
arrb[i]=char(b);
}
cout<<"解密后明文為:";
for(i=0;i
16、行)寫在一張紙上,按 1,2,…,m 的一個置換π交換列的位置次序,再按垂直方向(即按列)讀出即得密文。解密就是將密文按相同的寬度 m 垂直在寫在紙上,按置換π的逆置換π ?1 交換列的位置次序,然后水平地讀出得到明文。置換π就是密鑰。
實驗代碼:
主函數(shù)main();
#include
#include
#include
#include
int main(int argc)
{
char *str1,*key,*str3,c;
str1=(char *)malloc(500)
17、;
key=(char *)malloc(500);
str3=(char *)malloc(500);
printf("Column permutation cipher Encryption & Decryption\n----------------------------\n Please select which type \n E:Encription\n D:Decription\n Q:Quit\n----------------------------\n");
c=getchar();
while(c!='q'&&c!='Q')
{
i
18、f(c=='E'||c=='e')
{
getchar();
printf("Please input the plaintext:\n");
gets(str1);
printf("Please input the Encrption Key:\n");
gets(key);
printf("The cipher is:\n");
Encryption(str1,key);
printf("Column permutation cipher Encryption & Decryption\n------------------
19、----------\n Please select which type \n E:Encription\n D:Decription\n Q:Quit\n----------------------------\n");
c=getchar();
}
else
{
getchar();
printf("Please input the Decryption Key:\n");
gets(key);
printf("Please input the ciphertext:\n");
gets(str3);
prin
20、tf("The plaintext is:\n");
Decryption(key,str3);
printf("Column permutation cipher Encryption & Decryption\n----------------------------\n Please select which type \n E:Encription\n D:Decription\n Q:Quit\n----------------------------\n");
c=getchar();
free(str1);
free(key);
f
21、ree(str3);
}
}
return 0;
}
加密函數(shù):
void Encryption(char str1[],char key[])
{
int i,j;
char num[300];
int plen=strlen(str1);
int len=strlen(key);
for(i=0;i
22、] == key[i])
num[i]=num[i]+1;
}
}
printf("\n");
for(i=0;i
23、3[])
{
int i,j;
char num[500];
char cnum[500];
int clen=strlen(str3);
int len=strlen(key);
for(i=0;i
24、;i