Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
加密/解密-C语言_C_Encryption - Fatal编程技术网

加密/解密-C语言

加密/解密-C语言,c,encryption,C,Encryption,所以,我来这里询问一个加密和解密程序 这就是交易,我会在程序开始时要求一把钥匙,比如: AgFvcD 因此,在密钥之后,我将请求他们要加密的消息: 你好,世界 然后我考虑使用ASCII码将其作为 我将每个键(AgFvcD)字符的值取为十进制值,并将每个消息字符的值乘为十进制值 (A*H)-(g*e)-(F*l)-(v*l)-(D*o)等等。。即使我用数字(123)设置键,它仍然具有十进制ASCII值,而不是数字本身 问题在于乘法,因为我想使用两个向量,一个接收密钥,另一个在消息上乘法密钥。 但我

所以,我来这里询问一个加密和解密程序

这就是交易,我会在程序开始时要求一把钥匙,比如: AgFvcD 因此,在密钥之后,我将请求他们要加密的消息: 你好,世界

然后我考虑使用ASCII码将其作为

我将每个键(AgFvcD)字符的值取为十进制值,并将每个消息字符的值乘为十进制值

(A*H)-(g*e)-(F*l)-(v*l)-(D*o)等等。。即使我用数字(123)设置键,它仍然具有十进制ASCII值,而不是数字本身

问题在于乘法,因为我想使用两个向量,一个接收密钥,另一个在消息上乘法密钥。 但我不知道如何进行向量乘法,即使密钥比消息短,它也应该返回到第一个密钥字符并继续,直到消息被全部加密

明白了吗

如果解释得不好,我会尽量简化

从那以后谢谢你

我的代码:

#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();
}
#包括
#包括
#包括
#包括
#包括
void Encrypt(){
字符文本[256]={0};
int textc[256]={0};
字符键[]={0};
int-keyc[]={0};
int i;
系统(“cls”);
printf(“键入加密密钥:”);
fgets(键,256,标准);//Recebe a chave de scriptografia
printf(“\n*\n”);//Avisa sobre o limite de caracteres
printf(“键入消息:”);
fgets(text,256,stdin);//receibe a mensage a ser scriptografada
printf(“加密…\n”);//Charme;)
//睡眠(3);

对于(i=0;i,这里有几个问题:

char key[] = {0};
int keyc[] = {0};
因为您没有为这些数组指定大小,所以它只为初始化的元素分配了足够的大小,这意味着每个数组的长度为1。当您写入密钥时,会超出这些数组的长度。因此,您需要显式设置大小:

char key[256] = {0};
int keyc[256] = {0};
使用
fgets
时,尾随的换行符会附加到字符串中,因此需要将其去掉:

fgets(key, 256, stdin);
key[strlen(key)-1] = '\0';   // strip the newline added by fgets
...
fgets(text, 256, stdin);
text[strlen(text)-1] = '\0';  // 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;
}
(i=0,j=0;i=strlen(key))j=0; }
为了提高效率,您可能希望在循环之前将
strlen(text)
strlen(key)
存储在单独的变量中,这样您就不会每次都重新计算它们。只需确保在删除由
fgets
添加的换行符后执行此操作


还有一件事:去掉
returnencrypt()
在末尾调用。函数本身递归调用,没有转义子句,因此得到一个无限循环。

查找模
%
运算符,C和理论上都是如此。对不起,%模如何帮助我?它只显示除法的其余部分,我确定吗?Sry,但你尝试了什么?你在哪里卡住了?什么解释cit(C)-您面临的编码问题?我在使A变为65和对另一个A进行乘法之间左右为难,当我得到键的末尾时,返回到开头并继续执行直到消息结束。您是否在问,在循环键中的字符时,如何返回到键的开头并继续循环(假设键的长度小于消息的长度)?dbush您帮了我很多忙,我唯一没有得到的一步是您在使用fgets时说的那一步,尾随的换行符会附加到字符串中,因此您需要去掉它:key[strlen(key)-1]='\0';text[strlen(text)-1]='\0';我需要把它放在哪里?因为一切都很好,但正如你所说的,但是fgets添加了键的最后一个空格,因此,键=(AA)乘以10(最后一个空格)@OtavioAraujo您想在调用
fgets
后立即这样做。我会更新我的答案。@OtavioAraujo也可以,如果您觉得有用的话,请随意。哦,当然,我是新来的,所以我对力学不太了解哈哈哈