c - 这是 Vernam 密码的 C 代码,如何将数字而不是字符串作为输入消息?

标签 c

#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/

相关文章:

c - c中变量机制的作用域

c - 解析 Shell 的命令行参数

c - fgets() 在输入时创建另一个字符串副本?

c - 堆C数据存储

c++ - 链接错误 C++ Libcurl

C语言,邻接矩阵

c - 无法使阶乘函数在 C 中工作

c - c中绝对最快的for循环是什么?

python - 安装 Distance python 库时 Clang 链接器问题

链接器可以内联函数吗?