C语言hill加密代码 控制台输入1:加密 2:解密 加密过程: 输入一段明文:*** 输入秘钥:* 程序输出相应密文:*** 解密过程: 输入一段密文:*** 输入秘钥:* 程序输出相应明文:*** :代码规整美观,必要处加注释
时间: 2024-06-18 21:05:30 浏览: 179
以下是C语言实现Hill加密算法的代码示例,代码注释已经详细描述了每一步骤的含义和操作方法:
```
#include<stdio.h>
#include<string.h>
//定义矩阵加法运算函数
void matrix_add(int a, int b, int c, int n) {
int i, j;
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
c[i][j] = a[i][j] + b[i][j];
}
}
}
//定义矩阵乘法运算函数
void matrix_mul(int a, int b, int c, int n) {
int i, j, k;
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
c[i][j] = 0;
for(k=0; k<n; k++) {
c[i][j] += a[i][k] * b[k][j];
}
}
}
}
//定义求矩阵行列式的函数
int det(int a, int n) {
if(n == 1) {
return a;
} else if(n == 2) {
return a*a - a[0]*a;
} else {
int c;
int s = 0;
int i, j, k;
for(i=0; i<n; i++) {
for(j=1; j<n; j++) {
for(k=0; k<n; k++) {
if(k < i) {
c[j-1][k] = a[j][k];
} else if(k > i) {
c[j-1][k-1] = a[j][k];
}
}
}
if(i % 2 == 0) {
s += a[i] * det(c, n-1);
} else {
s -= a[i] * det(c, n-1);
}
}
return s;
}
}
//定义求矩阵的逆矩阵的函数
int matrix_inv(int a, int b, int n) {
int d = det(a, n);
if(d == 0) {
return -1;
} else {
int c;
int i, j, k, l;
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
for(k=0; k<n-1; k++) {
for(l=0; l<n-1; l++) {
if(k < i && l < j) {
c[k][l] = a[k][l];
} else if(k >= i && l < j) {
c[k][l] = a[k+1][l];
} else if(k < i && l >= j) {
c[k][l] = a[k][l+1];
} else {
c[k][l] = a[k+1][l+1];
}
}
}
if((i+j) % 2 == 0) {
b[j][i] = det(c, n-1);
} else {
b[j][i] = -det(c, n-1);
}
}
}
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
b[i][j] /= d;
}
}
return 0;
}
}
//定义加密函数
void encrypt(char *plaintext, char *key) {
int n = strlen(key);
int m = strlen(plaintext);
int i, j, k;
int key_mat;
int plaintext_vec;
int ciphertext_vec;
char ciphertext[m+1];
ciphertext[m] = '\0';
//将秘钥字符串转化为矩阵
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
key_mat[i][j] = key[n*i+j] - 'a';
}
}
//将明文字符串转化为向量并进行加密
for(i=0; i<m/3+1; i++) {
for(j=0; j<3; j++) {
plaintext_vec[j] = (i*3+j<m ? plaintext[i*3+j]-'a' : 25);
}
matrix_mul(key_mat, plaintext_vec, ciphertext_vec, n);
for(j=0; j<3; j++) {
ciphertext[i*3+j] = (ciphertext_vec[j]%26 + 'a');
}
}
printf("加密结果为:%s\n", ciphertext);
}
//定义解密函数
void decrypt(char *ciphertext, char *key) {
int n = strlen(key);
int m = strlen(ciphertext);
int i, j, k;
int key_mat_inv;
int ciphertext_vec;
int plaintext_vec;
char plaintext[m+1];
plaintext[m] = '\0';
//将秘钥字符串转化为矩阵,并求出其逆矩阵
int flag = matrix_inv(key_mat, key_mat_inv, n);
if(flag == -1) {
printf("解密失败!该秘钥对应的矩阵不可逆。\n");
return;
}
//将密文字符串转化为向量并进行解密
for(i=0; i<m/3+1; i++) {
for(j=0; j<3; j++) {
ciphertext_vec[j] = (i*3+j<m ? ciphertext[i*3+j]-'a' : 25);
}
matrix_mul(key_mat_inv, ciphertext_vec, plaintext_vec, n);
for(j=0; j<3; j++) {
plaintext[i*3+j] = (plaintext_vec[j]%26 + 'a');
}
}
printf("解密结果为:%s\n", plaintext);
}
int main() {
char plaintext[100], key[10], ciphertext[100];
printf("请输入要进行的操作:\n");
printf("1:加密\n");
printf("2:解密\n");
printf("请选择:");
int choice;
scanf("%d", &choice);
if(choice == 1) {
printf("请输入明文:");
scanf("%s", plaintext);
printf("请输入秘钥(9个小写字母):");
scanf("%s", key);
encrypt(plaintext, key);
} else if(choice == 2) {
printf("请输入密文:");
scanf("%s", ciphertext);
printf("请输入秘钥(9个小写字母):");
scanf("%s", key);
decrypt(ciphertext, key);
} else {
printf("输入有误!\n");
}
return 0;
}
```
阅读全文