寫乙個程式實現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 加密演算法有哪些?密碼 密碼學 密碼 通訊雙方按照約定的法則進行資訊特殊變換的一種重要保密手段。依照這些法則,變明文為密文,稱為加密變換 變密文為明文,稱為脫密變換 解密 密碼體制可以分為以下幾種 密碼學的目標 加密乙個密碼系統的安全性只在於金鑰的保密性,而不在演算法的...