#include <stdio.h>
char arr[26][26];
char message[22], key[22], emessage[22], retMessage[22];
int findRow(char);
int findColumn(char);
int findDecRow(char, int);
int main() {
int i = 0, j, k, r, c;
clrscr();
k = 47;
for (i = 0; i < 10; i++) {
k++;
for (j = 0; j < 10; j++) {
arr[i][j] = k++;
if (k == 59)
k = 48;
}
}
printf("\nEnter message\n");
gets(message);
printf("\nEnter the key\n");
gets(key);
// Encryption
for (i = 0; key[i] != NULL; i++) {
c = findRow(key[i]);
r = findColumn(message[i]);
emessage[i] = arr[r][c];
}
emessage[i] = '\0';
printf("\n Encrypted message is:\n\n");
for (i = 0; emessage[i] != NULL; i++)
printf("%c", emessage[i]);
//decryption
for (i = 0; key[i] != NULL; i++) {
c = findColumn(key[i]);
r = findDecRow(emessage[i], c);
retMessage[i] = arr[r][0];
}
retMessage[i] = '\0';
printf("\n\nMessage Retrieved is:\n\n");
for (i = 0; retMessage[i] != NULL; i++)
printf("%c", retMessage[i]);
getch();
return (0);
}
int findRow(char c) {
int i;
for (i = 0; i < 26; i++) {
if (arr[0][i] == c)
return (i);
}
}
int findColumn(char c) {
int i;
for (i = 0; i < 26; i++) {
if (arr[i][0] == c)
return (i);
}
}
int findDecRow(char c, int j) {
int i;
for (i = 0; i < 26; i++) {
if (arr[i][j] == c)
return (i);
}
}
这是一个 Vernam Cipher 程序,用于使用 key 加密和解密数据。
问题是,这个程序不能接受数字作为输入。如何编辑它以便我们可以将数字作为输入并对其进行加密?无需更改 key,只需将 message
更改为数字即可。
而且输出,即 Message Retrieved
也必须是数字,因为我们正在解密数据。
最佳答案
注意:这不是 Vigenère(不是 Vernam)吗?
如果是 Vigenère,您只需正确定义您的输入字母表即可。实际上你的代码有输入字母小写字母(a-z),所以维吉尼亚代码是这样的:
abcdefghijklmnopqrstuvwxyz
aabcdefghijklmnopqrstuvwxyz
bbcdefghijklmnopqrstuvwxyza
ccdefghijklmnopqrstuvwxyzab
...
只需在代码中任意位置添加数字即可:
abcdefghijklmnopqrstuvwxyz0123456789
aabcdefghijklmnopqrstuvwxyz0123456789
bbcdefghijklmnopqrstuvwxyz0123456789a
ccdefghijklmnopqrstuvwxyz0123456789ab
...
--- 编辑 ---
您可能需要添加另一个小层来定义输入字母表。因此,定义一个包含给定顺序的所有考虑的字母的数组(选择一个)说:
Alphabet[] = "0123456789abcdefghijklmnopqrstuvwxyz";
现在假设您有一个函数,给定一个字母将给出其在字母表中的排名:例如 rank(l)
,例如 rank('b')=11
。
现在计算(不需要这样的结构,但让我们像你一样这样做)你的排列:
Perms[][]
00 01 02 03 04 05 .... 35
00 00 01 02 03 04 05 .... 35
01 01 02 03 04 05 .... 35 00
02 02 03 04 05 .... 35 00 01
...
现在,对于给定的 key 字母 k
和消息字母 l
,您可以将加密字母 e
计算为:
e = Alphabet[Perms[rank(l)][rank[k]]
关于c - 这是 Vernam 密码的 C 代码,如何将数字而不是字符串作为输入消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54960717/