C++ 程序实现希尔密码

c++server side programmingprogramming

基于线性代数的希尔密码是密码学中的一种多图替代密码。

要加密消息:密钥字符串和消息字符串以矩阵形式表示。然后将它们相乘,对 26 取模。密钥矩阵应该具有逆矩阵才能解密消息。

要解密消息:将加密消息与用于加密的逆密钥矩阵相乘,对 26 取模以获得解密消息。

例如

密钥矩阵

1 0 1
2 4 0
3 5 6

消息字符串"ABC"矩阵形式为 −

0
1
2

用于加密

将上述两个矩阵相乘后,我们得到,

2
4
17

这将是加密消息"CER"

用于解密

密钥矩阵的逆为 −

1.09091 0.227273 -0.181818
-0.545455 0.136364 0.0909091
-0.0909091 -0.227273 0.181818

现在将密钥矩阵的逆矩阵与加密消息矩阵相乘为−

0
1
2

原始消息字符串为‘ABC’。

下面是实现上述示例的 C++ 程序。

算法

开始
函数 getKeyMatrix()
   对于 i = 0 到 2
      对于 j = 0 到 3
      将矩阵 a[i][j] 的元素作为输入。
​​         m[i][j] = a[i][j]
      done
   done
    将消息字符串作为用户输入。
   对于 i = 0 到 2
      msg[i][0] = mes[i] - 65
   done
End
Begin
Function encrypt()
   对于 i = 0 到 2
      对于 j = 0 到 0
         对于 k = 0 到 2
            en[i][j] = en[i][j] + a[i][k] * msg[k][j]
   对乘法得到的矩阵的每个元素取模 26,并打印加密消息。
End
Begin
Function decrypt()
   调用函数 inversematrix()
   对于 i = 0 到 2
      对于 j = 0 到 0
         对于 k = 0 到 2
            de[i][j] = de[i][j] + b[i][k] * en[k][j]
对乘法结果取模 26 得到原始消息。

示例

#include<iostream>
#include<math.h>
using namespace std;
float en[3][1], de[3][1], a[3][3], b[3][3], msg[3][1], m[3][3];
void getKeyMatrix() { //从用户处获取密钥和消息
   int i, j;
   char mes[3];
   cout<<"输入密钥的 3x3 矩阵(应有逆):\n";
   for(i = 0; i < 3; i++)
   for(j = 0; j < 3; j++) {
      cin>>a[i][j];
      m[i][j] = a[i][j];
   }
   cout<<"\n输入一个由 3 个字母组成的字符串(使用 A 到 Z):";
   cin>>mes;
   for(i = 0; i < 3; i++)
   msg[i][0] = mes[i] - 65;
}
void encrypt() { //加密消息
   int i, j, k;
   for(i = 0; i < 3; i++)
   for(j = 0; j < 1; j++)
   for(k = 0; k < 3; k++)
   en[i][j] = en[i][j] + a[i][k] * msg[k][j];
   cout<<"\n加密后的字符串为:";
   for(i = 0; i < 3; i++)
   cout<<(char)(fmod(en[i][0], 26) + 65); //对乘法得到的矩阵的每个元素取模 26
}
void inversematrix() { //求密钥矩阵的逆
   int i, j, k;
   float p, q;
   for(i = 0; i < 3; i++)
   for(j = 0; j < 3; j++) {
      if(i == j)
         b[i][j]=1;
      else
         b[i][j]=0;
   }
   for(k = 0; k < 3; k++) {
      for(i = 0; i < 3; i++) {
         p = m[i][k];
         q = m[k][k];
         for(j = 0; j < 3; j++) {
            if(i != k) {
               m[i][j] = m[i][j]*q - p*m[k][j];
               b[i][j] = b[i][j]*q - p*b[k][j];
            }
         }
      }
   }
   for(i = 0; i < 3; i++)
   for(j = 0; j < 3; j++)
   b[i][j] = b[i][j] / m[i][i];
   cout<<"\n\n逆矩阵为:\n";
   for(i = 0; i < 3; i++) {
      for(j = 0; j < 3; j++)
      cout<<b[i][j]<<" ";
      cout<<"\n";
   }
}
void decrypt() { //解密消息
   int i, j, k;
   inversematrix();
   for(i = 0; i < 3; i++)
   for(j = 0; j < 1; j++)
   for(k = 0; k < 3; k++)
   de[i][j] = de[i][j] + b[i][k] * en[k][j];
   cout<<"\n解密后的字符串为:";
   for(i = 0; i < 3; i++)
   cout<<(char)(fmod(de[i][0], 26) + 65); //对 26 取模得到原始消息
   cout<<"\n";
}
int main() {
   getKeyMatrix();
   encrypt();
   decrypt();
}

输出

输入密钥的 3x3 矩阵(应有逆矩阵):
1
0
1
2
4
0
3
5
6

输入 3 个字母的字符串(使用 A 到 Z):ABC

加密字符串为:CER

逆矩阵为:
1.09091 0.227273 -0.181818
-0.545455 0.136364 0.0909091
-0.0909091 -0.227273 0.181818

解密字符串为:ABC

相关文章