Hill算法程序说明文档

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Hill算法程序说明文档
——《密码编码学与网络安全》实验一
一、基本变量、数据结构、函数说明:
1.基本变量定义部分:
sc,sp:string型,明密文存储字符串。

r,c:int型,用于限制每次明密文矩阵的已知字符数。

pair:int型,明密文对最大值
2.数据结构定义部分:
cmatrix:double型二维数组,用于存储密文矩阵信息。

newpmatrix:double型二维数组,用于存储矩阵转逆变换后的明文矩阵信息。

oldpmatrix:double型二维数组,用于存储一开始未转逆的明文矩阵信息。

pmatrix:double型二维数组,用于存储最终的明文矩阵信息。

kmatrix:double型二维数组,用于存储密钥矩阵信息。

3.基本函数定义:
changemod:返回类型为int型,参数类型为int型。

主要用途是:对一个输入的整型不断进行模26处理。

直到这个数能够被变量bs整除。

(这个函数的设置目的主要是为了防止算出的矩阵为小数)。

二、输入输出说明:
本程序是需要输入进行驱动的。

具体输入项为:
a. 已知明密文对每对的字符个数;
b. 已知的明文对(若干);
c. 与之相对应的密文对。

通过将明文矩阵行代换、并且转为逆矩阵后,与密文矩阵进行矩阵乘法并且mod 26后,程序运行完毕。

具体输出为:
a. 行代换后的明文矩阵;
b. 明文矩阵的逆矩阵;
c. 最终解得的密钥矩阵K。

三、算法简略流程说明:
对于输入的明密文矩阵,pmatrix和cmatrix矩阵。

首先使用线性代数的方法将明文矩阵进行行代换,如下列代码所示:
for(int k=1;k<=r;k++){
for(int t=c+1;t<=c*2;t++){
if((t-k)==c) {
pmatrix[k][t]=1;
}
else{
pmatrix[k][t]=0;
}
}
}
for(int x=1;x<=r;x++) {
for(int y=1;y<=c*2;y++) {
System.out.print(pmatrix[x][y]+" ");
}
System.out.println();
}
然后将所得的行代换后的明文矩阵进行逆矩阵变换操作,具体步骤参见线性代数相关章节。

具体代码为:
for (int k = 1; k <= c; k++) {
if (pmatrix[k][k] != 1) {
int bs = pmatrix[k][k];
pmatrix[k][k] = 1;
for (int p = k + 1; p <= c * 2; p++) {
int sum = pmatrix[k][p];
while (sum % bs != 0) {
sum += 26;
}
pmatrix[k][p] = sum / bs;
}
}
for (int q = 1; q <= r; q++) {
if (q != k) {
int bs = pmatrix[q][k];
for (int p = 1; p <= c * 2; p++) {
pmatrix[q][p] -= bs * pmatrix[k][p];
}
}
else {
continue;
}
}
}
注意:其中的bs为各小矩阵的行列式的值。

以上两段代码为关于如何进行逆矩阵转换的具体实现。

之后,与密文矩阵进行矩阵相乘,进行mod 26运算,就能得出密文矩阵K。

四、程序具体使用说明:
1.
在“输入已知明密文对每对字符个数”中填入字符个数,eg:2
(注意:不要超过10)
2.
在“输入明文”对话框中输入明文序列。

(注意:每次输入的字符数必须与前一对话框中输入的字符个数保持一致)。

3.
在“输入密文”对话框中填入相应密文序列,必须与字符个数保持一致。

4.这样填入的明密文对的个数为先前填入的字符个数。

5.输入举例如下所述:
已知明密文对每对的字符个数:2
已知的明文:fr,与之相对的密文:PQ;
已知的明文:id,与之相对的密文:CF;
输出为下图所示:。

相关文档
最新文档