一、主要函数解析
1、Creat_Key(char* s,int L, char Matrix[5][5]) 生成密钥Matrix矩阵 2、Encrypt(char Matrix[5][5],int L, char* s, char *s0, bool reverse) 根据密钥矩阵加密或解密 加密:s为明文,s0为密文字符串存储位置,reverse=0 解密:s为密文,s0为明文字符串存储位置,reverse=1
二、注意事项
1、字符串只能含有字母 2、已禁用字母j/J 3、字符均以大写形式处理(已自动转换,输入时大小写均可)
三、演示图
4、代码
#include <stdio.h>
#include <stdlib.h>
void Creat_Key(char* s,int L, char Matrix[5][5]) {
if (s == NULL) {
printf("字符串s为空!");
return;
}
int alphabet[26];
for (int i = 0; i < 26; i++) {
alphabet[i] = 1;
}
alphabet['J' - 65] = -1;
for (int i = 0; i < L; i++) {
alphabet[s[i] - 65] = 0;
}
int flag = 0;
for (int i = 0; i < L; i++) {
if (alphabet[s[i] - 65] == 0) {
Matrix[flag / 5][flag % 5] = s[i];
alphabet[s[i] - 65] = -1;
flag++;
}
}
for (int i = 0; i < 26; i++) {
if (alphabet[i] == 1) {
Matrix[flag / 5][flag % 5] = i + 65;
flag++;
}
}
}
void F(char* s,int L) {
for(int i=0;i<L;i++){
if(s[i]>='a') s[i]-='a'-'A';
}
}
void Find(char Matrix[5][5], char c,char c0,int *p) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (Matrix[i][j] == c) {
p[0] = i;
p[1] = j;
}
if (Matrix[i][j] == c0) {
p[2] = i;
p[3] = j;
}
}
}
}
void Encrypt(char Matrix[5][5],int L, char* s, char *s0, bool reverse) {
if (s == NULL) {
printf("字符串s为空!");
return;
}
char* ret=s0;
int Temp[2][2];
for (int i = 0; i < L; i += 2) {
int p0[4];
Find(Matrix, s[i],s[i+1],p0);
Temp[0][0] = p0[0];
Temp[0][1] = p0[1];
Temp[1][0] = p0[2];
Temp[1][1] = p0[3];
if (Temp[0][0] == Temp[1][0]) {
ret[i] = Matrix[Temp[0][0]][((Temp[0][1] + 1 - reverse * 2)+5) % 5];
ret[i + 1] = Matrix[Temp[1][0]][((Temp[1][1] + 1 - reverse * 2)+5) % 5];
}
else {
if (Temp[0][1] == Temp[1][1]) {
ret[i] = Matrix[((Temp[0][0] + 1 - reverse * 2)+5) % 5][Temp[0][1]];
ret[i + 1] = Matrix[((Temp[1][0] + 1 - reverse * 2)+5) % 5][Temp[1][1]];
}
else {
if ((Temp[0][0] - Temp[1][0]) * (Temp[0][1] - Temp[1][1]) * (2 * (!reverse + 1) - 3) > 0) {
ret[i] = Matrix[Temp[0][0]][Temp[1][1]];
ret[i + 1] = Matrix[Temp[1][0]][Temp[0][1]];
}
else {
ret[i] = Matrix[Temp[1][0]][Temp[0][1]];
ret[i + 1] = Matrix[Temp[0][0]][Temp[1][1]];
}
}
}
}
}
void Printf(char* p,int Begin, int End){
for(int i=Begin;i<=End;i++){
printf("%c",p[i]);
}
}
int main(){
int L;
printf("请输入密钥生成字符串长度:");
scanf("%d",&L);
printf("\n");
char *K_S = (char *)malloc(sizeof(char)*(L+1));
printf("请输入密钥生成字符串:");
scanf("%s",K_S);
printf("\n");
F(K_S,L);
char Matrix[5][5];
printf("密码表编制:\n");
printf("密码表如下:\n");
Creat_Key(K_S, L, Matrix);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
printf("%c ", Matrix[i][j]);
}
printf("\n");
}
printf("\n");
int L0;
printf("请输入明文长度:");
scanf("%d",&L0);
printf("\n");
char *C_S = (char *)malloc(sizeof(char)*(L0+1));
printf("请输入明文:");
scanf("%s",C_S);
printf("\n");
F(C_S, L0);
char *s2=(char *)malloc(L0);
Encrypt(Matrix, L0, C_S,s2, 0);
printf("\n加密:\n明文:");
Printf(C_S,0,L0-1);
printf(" -> 密文:");
Printf(s2,0,L0-1);
printf("\n");
char *s3=(char *)malloc(L0);
Encrypt( Matrix, L0, s2,s3, 1);
printf("\n解密:\n密文:");
Printf(s2,0,L0-1);
printf(" -> 明文:");
Printf(s3,0,L0-1);
printf("\n");
system("pause");
return 0;
}
|