所以,我在这里问一个加密和解密程序。
就是这样,我将在程序开始时请求一个键,如下所示:AgFvcD因此,在密钥之后,我将请求他们想要加密的消息:你好世界!
然后我想用ASCII码把它写成
我将取每个键(AgFvcD)字符的值,但作为十进制值,并将每个消息字符乘以十进制。
(* H) - (g * e) (F * l) - (v * l) (D * o)等等。即使我用数字(123)设置密钥,它仍然具有十进制ASCII值,而不是数字本身。
问题在于乘法,因为我想使用两个向量一个接收密钥,另一个将密钥乘以消息。但是我不知道怎么做向量乘法,即使密钥比消息短,它应该回到第一个密钥字符并继续下去,直到消息被全部加密。
明白了吗?
如果不能很好地解释,我会尽量说得更简单。
Thanks since then.
我代码:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <ctype.h>
void Encrypt(){
char text[256] = {0};
int textc[256] = {0};
char key[] = {0};
int keyc[] = {0};
int i;
system("cls");
printf("Type the encrypt key: ");
fgets(key, 256, stdin); //Recebe a chave de criptografia
printf("n*n"); //Avisa sobre o limite de caracteres
printf("Type the message: ");
fgets(text, 256, stdin); //Recebe a mensagem a ser criptografada
printf("Encrypting...n"); //Charme ; )
//sleep(3);
for(i=0; i<strlen(text); i++){
textc[i]=text[i];
key[i]= keyc[i];
printf("n %d n", textc[i]*keyc[i]);
}
system("Pause");
return Encrypt();
}
当我打印时,提示符上的一些字符得到内存垃圾,但其中大多数给我带来了正确的值,测试与加密密钥:AAA和消息:AAAAAAA
它会返回4225也就是65 * 65的结果
现在的问题是不能得到这些值…
这里有几个问题:
char key[] = {0};
int keyc[] = {0};
因为没有为这些数组指定大小,所以它为初始化的元素分配了足够的大小,这意味着每个数组的长度为1。当您写入键时,会超出这些数组的长度。所以你需要显式地设置尺寸:
char key[256] = {0};
int keyc[256] = {0};
当您使用fgets
时,尾随换行符被附加到字符串中,因此您需要将其剥离:
fgets(key, 256, stdin);
key[strlen(key)-1] = ' '; // strip the newline added by fgets
...
fgets(text, 256, stdin);
text[strlen(text)-1] = ' '; // strip the newline added by fgets
为了在键比消息短时重用键材料,您需要单独跟踪键索引,并在它变得太大时将其重置为零:
for(i=0,j=0; i<strlen(text); i++){
textc[i]=text[i];
keyc[i]= key[j]; // You had these mixed up. You were doing key[i] = keyc[i]
printf("n %d n", textc[i]*keyc[i]);
j++;
if (j >= strlen(key)) j=0;
}
为了效率起见,您可能希望在循环之前将strlen(text)
和strlen(key)
存储在单独的变量中,这样您就不必每次都重新计算它们。只要确保这样做,在之后删除fgets
添加的换行符。
还有一件事:去掉最后的return Encrypt()
调用。这使得函数递归地调用自己,没有转义子句,所以你得到了一个无限循环。