加密/解密- C语言



所以,我在这里问一个加密和解密程序。

就是这样,我将在程序开始时请求一个键,如下所示: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()调用。这使得函数递归地调用自己,没有转义子句,所以你得到了一个无限循环。

最新更新