Hill密碼的加密與解密(C語言)

2021-07-28 01:46:00 字數 2424 閱讀 9910

寫乙個程式實現2*2 hill密碼的加解密演算法

加密過程寫的很順利,因為是2*2矩陣,一些本應該用矩陣乘法計算的東西也直接被我簡化成用算式表示了。

在寫解密過程是遇到了問題,矩陣求逆的部分不太會做。跟著書上前面的例題看了一下。書上說對於2*2的矩陣,求其行列式。如果矩陣a有非零的行列式,則這個矩陣的逆如下計算:[a^(-1)]ij = (det a)^(-1) * (-1)^(i+j) * (dij), 其中(dij)是將矩陣去掉第j行和第i列後的子行列式的值,det(a)是a的行列式,而(det a)^(-1)是det(a) mod 26的逆。

然後舉了個例子,矩陣a = 5 8 17 3; det a = (5 * 3) - (8 * 17) = -121 mod 26 = 9

因為9*3 = 27 mod 26 = 1,可得到9^(-1) mod 26 = 3

因此,a^(-1) mod 26 = 3 * (3, -8, -17, 5) = 3 * (3, 18, 9, 5) = (9, 54, 27, 15) = (9, 2, 1, 15)

啊對就這裡。最開始我怎麼都沒看明白,後面去問別人人給我說就是對其中的每乙個元素mod 26而已我才發現。wow這真是厲害極了。知道這個規律之後這也就好求逆了。

編寫的**如下

#include 

#include

#include

#define max 60

int main()

, k2[2][2] = ;

int temp1[2] = , temp2[2] = ;

char p[max] = , c[max] = ;

int t1[max] = , t2[max] = ;

int len, flag=0, temp, temp1, i, j, num=0;

printf("*****== hill 密碼 *****==\n\n");

printf("請輸入秘鑰的值:\n");

for(i=0; i<2; i++)

}printf("\n1. 加密\t 2. 解密\n請選擇:");

scanf("%d", &num);

if(num == 1)

// 將大寫轉成小寫,並賦值給t1陣列

for(i=0; iif(p[i] >= 'a' && p[i] <= 'z')

t1[i] = p[i] - 'a';

}// 得到加密後結果,儲存在t2中

for(i=0; i2)

if(flag == 1)

printf("加密結果為:\n");

for(i=0; i'a';

printf("%c ", c[i]);

}printf("\n");

}else

if(num == 2)

for(i=0; iif(c[i] >= 'a' && c[i] <= 'z')

t2[i] = c[i] - 'a';

}// 求k的逆

temp = -1;

for(i=1; temp < 0; i++)

i = 1;

while(1)

else

}k2[0][0] = k1[1][1] * temp1;

k2[0][1] = (((-1 * k1[0][1]) + 26) * temp1) % 26;

k2[1][0] = (((-1 * k1[1][0]) + 26) * temp1) % 26;

k2[1][1] = k1[0][0] * temp1;

//printf(" %d

%d%d

%d%d

%d\n",temp, temp1, k2[0][0], k2[0][1], k2[1][0], k2[1][1]);

//system("pause");

//printf(" %d

%d%d

%d%d

%d\n",temp, temp1, k2[0][0]%26, k2[0][1]%26, k2[1][0]%26, k2[1][1]%26);

//system("pause");

// 得到解密後結果,儲存在t2中

for(i=0; i2)

if(flag == 1)

printf("解密結果為:\n");

for(i=0; i'a';

printf("%c ", p[i]);

}printf("\n");

}else

return

0;}

附帶測試資料:

輸入陣列: 9 4 5 7

明文: meetmeattheusualplaceatthenratherthaneightoclock

密文: yybtyyrdyvgacedzihkokqgbfeuprdfeotlchcywcfgsnmqa

凱撒密碼 C語言 加密解密

凱撒加密 caesarcipher 是一種簡單的訊息編碼方式 它根據字母表將訊息中的每個字母移動常量位k。舉個例子如果k等於3,則在編碼後的訊息中,每個字母都會向前移動3位 a會被替換為d b會被替換成e 依此類推。字母表末尾將回卷到字母表開頭。於是,w會被替換為z,x會被替換為a。如果是將移動的位...

凱撒密碼解密加密(C語言)

一 凱撒密碼 在密碼學中,愷撒密碼 英語 caesar cipher 或稱愷撒加密 愷撒變換 變換加密,是一種最簡單且最廣為人知的加密技術。它是一種替換加密的技術,明文中的所有字母都在字母表上向後 或向前 按照乙個固定數目進行偏移後被替換成密文。例如,當偏移量是3的時候,所有的字母a將被替換成d,b...

加密與解密(五) 密碼 加密

問題 1 密碼的存在意義?2 加密演算法有哪些?密碼 密碼學 密碼 通訊雙方按照約定的法則進行資訊特殊變換的一種重要保密手段。依照這些法則,變明文為密文,稱為加密變換 變密文為明文,稱為脫密變換 解密 密碼體制可以分為以下幾種 密碼學的目標 加密乙個密碼系統的安全性只在於金鑰的保密性,而不在演算法的...