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

时间:2019-03-02 16:44:52

标签: 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程序,用于使用密钥对数据进行加密和解密。 问题是,该程序不能将数字作为输入。如何编辑它以便我们可以将数字作为输入并对其进行加密?无需更改密钥,只需将message更改为数字。 而且,在解密数据时,输出Message Retrieved也必须是数字。

1 个答案:

答案 0 :(得分:1)

注意:不是Vigenère(不是Vernam)吗?

如果是Vigenère,您只需要正确定义什么是您输入的字母。实际上,您的代码输入了字母小写字母(a-z),因此Vigenère代码类似于:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
  <thead>
    <tr>
      <th><a id="name" class="filter-link" href="#">Name<i class="fas fa-sort"></i></a></th>
      <th><a id="modified" class="filter-link filter-link-number" href="#">Modified<i class="fas fa-sort"></i></a></th>
      <th><a id="size" class="filter-link filter-link-number" href="#">Size<i class="fas fa-sort"></i></a></th>
      <th><a id="share" class="filter-link filter-link-number" href="#">Share<i class="fas fa-sort"></i></a></th>
      <th><a id="view" class="filter-link filter-link-number" href="#">View<i class="fas fa-sort"></i></a></th>

    </tr>
  </thead>
</table>

只需在代码中的任意位置添加数字:

<TimePicker xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/time_picker"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.design.widget.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/date_ok"
    android:layout_gravity="end"
    android:layout_marginEnd="15dp"
    android:layout_marginTop="20dp"
    android:clickable="true"
    app:fabSize="mini"
    android:onClick="onTimeOkClick"
    />

<android.support.design.widget.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/return_to_date"
    android:layout_gravity="start"
    android:layout_marginTop="20dp"
    android:layout_marginStart="15dp"
    android:clickable="true"
    app:fabSize="mini"
    android:onClick="onReturnToDateClick"/>

---编辑---

您可能需要添加另一个小层,以定义输入字母。因此,定义一个包含给定顺序的所有字母的数组(选择一个),说:

 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 ... ,您可以将加密的字母k计算为:

l