密碼學課設實驗 古典密碼c 實現

2021-09-10 01:20:54 字數 3543 閱讀 6964

一、實驗目的

通過實現簡單的古典密碼演算法,理解密碼學的相關概念如明文(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...