HILL加密算法的C语言实现

找到一个HILL加密算法,做了一个简单的修改,源码如下:
 #include<stdio.h>
 #define N 3 //可加密的字符串长度
---------------------------------------------------------------------------------------------------------------
char plaintext[N]; //明文,输入时输入字符,参与运算时强制转换成整数
int ciphertext[N]; //密文,保存成整数,输出时强制转换成字符
int key[N][N]; //密钥矩阵,也就是密匙
----------------------------------------------------------------------------------------------------------------
void getPlainText() //获得明文字符串
{
printf("请输入明文:");
scanf("%s",plaintext);
 printf("\n");
 }
----------------------------------------------------------------------------------------------------------------
 void getKey() //输入密钥矩阵
{
int i,j;
 printf("请输入加密矩阵:\n");
 for(i=0;i<N;i++)
 for(j=0;j<N;j++)
 scanf("%d",&key[i][j]);
 printf("\n");
 }
----------------------------------------------------------------------------------------------------------------
 void hill() //Hill加密算法
{
int i,j;
 for(i=0;i<N;i++){ //矩阵的乘法
for(j=0;j<N;j++){ //计算转换依据,0~25对应a~z
 ciphertext[i]+=key[i][j]*(int)(plaintext[j]-'a');
 ciphertext[i]%=26;
 }
 }
 printf("\n");
 }
-----------------------------------------------------------------------------------------------------------------
 void printCipherText() //输出加密后的密文
{
int i;
 printf("加密后的密文是:");
for(i=0;i<N;i++) //把参与计算后是整数强制转换成对应的字符
printf("%c",(char)(ciphertext[i]+'a'));
 printf("\n");
 }
-------------------------------------------------------------------------------------------------------------------
 void main()
 {
 getPlainText(); //明文
getKey(); //密钥
hill(); //加密
printCipherText(); //密文
}


  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hill密码算法是一种基于矩阵的加密算法,可以用来加密和解密文本。下面是一个简单的C语言实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <math.h> #define MAX 100 int key[MAX][MAX], inv_key[MAX][MAX]; int det, n; // 求行列式的值 int get_det(int a[MAX][MAX], int n) { int i, j, k, sign = 1; for (i = 0; i < n; i++) { for (j = i + 1; j < n; j++) { while (a[j][i]) { int t = a[i][i] / a[j][i]; for (k = i; k < n; k++) { a[i][k] = (a[i][k] - t * a[j][k]) % 26; if (a[i][k] < 0) a[i][k] += 26; a[i][k] ^= a[j][k] ^= a[i][k] ^= a[j][k]; } sign = -sign; } } det = (det * a[i][i]) % 26; } if (sign == -1) det = (26 - det) % 26; return det; } // 求逆矩阵 int get_inv(int a[MAX][MAX], int n) { int i, j, k; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { inv_key[i][j] = (i == j) ? 1 : 0; } } for (i = 0; i < n; i++) { for (j = i + 1; j < n; j++) { while (a[j][i]) { int t = a[i][i] / a[j][i]; for (k = i; k < n; k++) { a[i][k] = (a[i][k] - t * a[j][k]) % 26; if (a[i][k] < 0) a[i][k] += 26; inv_key[i][k] = (inv_key[i][k] - t * inv_key[j][k]) % 26; if (inv_key[i][k] < 0) inv_key[i][k] += 26; a[i][k] ^= a[j][k] ^= a[i][k] ^= a[j][k]; inv_key[i][k] ^= inv_key[j][k] ^= inv_key[i][k] ^= inv_key[j][k]; } } } } for (i = 0; i < n; i++) { if (a[i][i] == 0) return 0; int t = a[i][i]; for (j = 0; j < n; j++) { a[i][j] = (a[i][j] * (26 / t)) % 26; inv_key[i][j] = (inv_key[i][j] * (26 / t)) % 26; } } for (i = n - 1; i >= 0; i--) { for (j = i - 1; j >= 0; j--) { int t = a[j][i]; for (k = 0; k < n; k++) { a[j][k] = (a[j][k] - t * a[i][k]) % 26; if (a[j][k] < 0) a[j][k] += 26; inv_key[j][k] = (inv_key[j][k] - t * inv_key[i][k]) % 26; if (inv_key[j][k] < 0) inv_key[j][k] += 26; } } } return 1; } // 加密函数 void encrypt(char *str) { int i, j, k, len = strlen(str); int a[MAX], b[MAX]; for (i = 0; i < len; i++) { str[i] = toupper(str[i]) - 'A'; } for (i = 0; i < len; i += n) { for (j = 0; j < n; j++) { a[j] = str[i + j]; b[j] = 0; for (k = 0; k < n; k++) { b[j] += key[j][k] * a[k]; } b[j] %= 26; } for (j = 0; j < n; j++) { str[i + j] = b[j] + 'A'; } } } // 解密函数 void decrypt(char *str) { int i, j, k, len = strlen(str); int a[MAX], b[MAX]; for (i = 0; i < len; i++) { str[i] = toupper(str[i]) - 'A'; } for (i = 0; i < len; i += n) { for (j = 0; j < n; j++) { a[j] = str[i + j]; b[j] = 0; for (k = 0; k < n; k++) { b[j] += inv_key[j][k] * a[k]; } b[j] %= 26; } for (j = 0; j < n; j++) { str[i + j] = b[j] + 'A'; } } } int main() { int i, j, k; char str[MAX]; printf("请输入明文:"); fgets(str, MAX, stdin); printf("请输入矩阵阶数:"); scanf("%d", &n); printf("请输入加密矩阵:\n"); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { scanf("%d", &key[i][j]); } } det = get_det(key, n); if (det == 0 || gcd(det, 26) != 1) { printf("加密矩阵不可逆,加密失败!\n"); return 0; } if (!get_inv(key, n)) { printf("加密矩阵不可逆,加密失败!\n"); return 0; } encrypt(str); printf("密文为:%s\n", str); decrypt(str); printf("解密后的明文为:%s\n", str); return 0; } ``` 这个程序中,我们使用了一个`key`矩阵来加密和解密文本,其中`n`是矩阵的阶数。在加密过程中,我们按照矩阵的阶数对文本进行分组,并对每一组应用矩阵乘法。在解密过程中,我们需要求出矩阵的逆矩阵,然后按照相同的方法进行解密。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值