一、實驗目的
通過實現簡單的古典密碼演算法,理解密碼學的相關概念如明文(plaintext)、密文(ciphertext)、加密金鑰(encryption key)、解密金鑰(decryption key)、加密演算法(encryption algorithm)、解密演算法(decryption algorithm)等。
1)用c\c++語言實現單錶仿射(affine)加/解密演算法;
2)用c\c++語言實現統計26個英文本母出現頻率的程式;
3)利用單錶仿射加/解密程式對一段較長的英文文章進行加密,再對明文和密文中字母出現的頻率進行統計並作對比,觀察有什麼規律。
仿射變換:
加密:解密:
其中,k1和k2為金鑰,k1∈zq,k2∈zq*。
1.首先將所有輸入的字母轉化為數字,定義int conv_to_num(char ch)函式
同時定義對應的char conv_to_char(int num)函式將陣列轉回為字母
2.然後進行加密,定義void encrypt(int k1, int k2, char* m, int n, char* cipher)。按照仿射變換的公式進行定義,利用字元的ascii碼進行運算,對於不是字母的字元,直接存入密文陣列裡面。
3.因為k2與模26不能互質,所以要定義prime函式判斷兩個數是否互質
4.解密函式原理同加密函式
5.關於詞頻統計函式int lettercounter(char *str,int nstr),要點在於利用乙個二維陣列arr[26][2]來統計字母個數,arr[i][0]存字母,arr[i][1]存字母個數。同時由於大小寫的問題還定義了乙個 biglettercounter(char *str, int nstr)函式,讀入大寫字元存在的位置,在解密時將其變為大寫;
**如下:
// 單錶放射.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。
///*實驗一*/
#include "pch.h"
#include#include #include using namespace std;
int arra[200];//第乙個存位置,第二個存大寫的字母
int big_c = 0;
void biglettercounter(char *str, int nstr) }}
//判斷是否互質
bool prime(int num1, int num2)
if (num1 == 1)
return true;
else
return false;
}// [a-za-z] 轉化為 0-25
int conv_to_num(char ch)
return num;
}// 0-25 轉化為 [a-za-z]
char conv_to_char(int num)
//加密函式
void encrypt(int k1, int k2, char* m, int n, char* cipher)
int c = (k1 + k2 * num) % 26;
cipher[i] = conv_to_char(c); }}
//解密
void decrypt(int k1, int k2, char* m, int n, char* cipher)
// 求模反元素
int num = 0;
while ((k2 * num - (c - k1)) % 26 != 0)
m[i] = conv_to_char(num); }}
//計數
int lettercounter(char *str,int nstr)
int num;
//計數
for (num = 0; num < nstr; num++)
else continue;
} }//輸出
int countnum = 0;
cout << endl << "上文字元頻率統計:" << endl;
for (int i = 0; i < 26; i++)
cout <> k1;
cin >> k2;
if (!prime(26, k2))
//從檔案中讀取明文
char filename[81];
ifstream encfile;
char c;
int i=0,filenum;//filenum訪問檔案中字元數
rewind(stdin); //清空緩衝區
cout << endl;
cout << "輸入要加密的檔名:";
cin.getline(filename, 81);
encfile.open(filename, ios::in | ios::out);
if (!encfile)
while (!encfile.eof())
encfile.close();
filenum = i - 1;
//輸出明文
cout << endl;
cout << "明文為:";
for (int num = 0; num < filenum; num++)
cout << m[num];
cout << endl;
lettercounter(m, filenum);
biglettercounter(m, filenum);
//加密
char c[200];
encrypt(k1, k2, m, filenum,c);
//輸出密文
cout << endl;
cout << "密文為:";
for (int num = 0; num < filenum; num++)
cout << c[num];
cout << endl;
lettercounter(c, filenum);
//解密
char d_m[200];
decrypt(k1, k2, d_m, filenum, c);
int countj = 0;
for (int i = 0; i < filenum; i++) }
//輸出解密後的明文
cout << endl;
cout << "解密後的明文為:";
for (int num = 0; num < filenum; num++)
cout << d_m[num];
cout << endl;
lettercounter(d_m, filenum);
return 0;
}
程式結果如下:
input.txt內容如下:
古典密碼學 移位密碼
首先了解密碼學的基本目的是使得兩個在不安全的通道中通訊的人,通常稱為alice和bob,以一種使他們的敵手oscar不能明白和理解通訊內容的方式進行通訊。定義 乙個密碼體制是滿足以下條件的五元組 p,c,k,e,d 1.p代表所有可能的明文組成的有限集。2.c代表所有可能的密文組成的有限集。3.k代...
密碼學複習一 古典密碼
1 保證資訊保安的關鍵要素 認證 鑑別 訪問控制,資料保密,資料完整,抗否認性。2 四種基本攻擊型別 唯密文攻擊 攻擊者只知道一些密文 已知明文攻擊 攻擊者知道一些明文密文對 選擇明文攻擊 攻擊者可以選擇一些明文密文對 針對金鑰額攻擊 主要是針對公鑰密碼系統 對於唯密文攻擊一般是採用窮舉攻擊。3 對...
密碼學學習一 古典密碼學
使用固定資訊,將原文替換成密文 單錶替換的原文和密文是同一張表 如原文密文關係如下 a b b c c d d e e f 則bee的密文就是cff 多表替換的原文和密文存在多張表中 表1 a b b c c d d e e f 表2 a c b d c e d f e g 原文 bee 金鑰 12...