#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
也必须是数字。
答案 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