与硬编码输入相比,使用 fgets 从用户获取密钥时无法打印密钥流

Posted

技术标签:

【中文标题】与硬编码输入相比,使用 fgets 从用户获取密钥时无法打印密钥流【英文标题】:Cannot print key-stream when using fgets to get key from user compared to hard coding inputs 【发布时间】:2020-02-29 23:52:09 【问题描述】:

我正在尝试使用 fgets 而不是使用一个程序对数组进行硬编码,该程序采用明文和密钥输入并返回密钥流和加密文本。使用 fgets 从用户那里扫描密钥以某种方式将输出更改为不打印密钥流,而只打印密钥本身。我唯一改变的不是用数组对密钥字符串进行硬编码,而是让用户使用 fgets 输入密钥。

硬编码(sn-p):

#include <stdio.h>
#include <string.h>

int main(void)

   char msg[] = "THECRAZYPROGRAMMER";
   char key[] = "HELLO";
   int msgLen = strlen(msg), keyLen = strlen(key), i, j;
   char newKey[msgLen], encryptedMsg[msgLen], decryptedMsg[msgLen];

   //generating new key
   for(i = 0, j = 0; i < msgLen; ++i, ++j)
      if(j == keyLen)
         j = 0;

    newKey[i] = key[j];
   

   newKey[i] = '\0';
   printf("Original Message: %s", msg);
   printf("\nKey: %s", key);
   printf("\nNew Generated Key: %s", newKey);

fgets (sn-p):

#include <stdio.h>
#include <string.h>
int main(void)

   char msg[512];
   char key[512];
   int msgLen = strlen(msg), keyLen = strlen(key), i, j;
   char newKey[msgLen], encryptedMsg[msgLen], decryptedMsg[msgLen];

   fgets(msg, 512, stdin);
   fgets(key, 512, stdin);

   //generating new key
   for(i = 0, j = 0; i < msgLen; ++i, ++j)
      if(j == keyLen)
         j = 0;

    newKey[i] = key[j];
   

   newKey[i] = '\0';
   printf("Original Message: %s", msg);
   printf("\nKey: %s", key);
   printf("\nNew Generated Key: %s", newKey);

【问题讨论】:

【参考方案1】:

查看下面的代码,它对您的 fgets 代码进行了一些修改。

#include <stdio.h>
#include <string.h>
int main(void)

   char msg[512];
   char key[512];

   fgets(msg, 512, stdin);
   fgets(key, 512, stdin);

  int msgLen = strlen(msg), keyLen = strlen(key), i, j;
   char newKey[msgLen], encryptedMsg[msgLen], decryptedMsg[msgLen];

   //generating new key
   for(i = 0, j = 0; i < msgLen; ++i, ++j)
      if(j == keyLen - 1)
         j = 0;

    newKey[i] = key[j];
   

   newKey[i] = '\0';
   printf("Original Message: %s", msg);
   printf("\nKey: %s", key);
   printf("\nNew Generated Key: %s", newKey);

我改变了两件事。首先,在您调用fgets 之后,我将获得msgLenkeyLen 的代码移动到了,这样您就不会占用未初始化内存的strlen。其次,我更正了if (j == keylen - 1) 行中的一个错误,因此fgets 的换行符不包含在您的输出中。

【讨论】:

以上是关于与硬编码输入相比,使用 fgets 从用户获取密钥时无法打印密钥流的主要内容,如果未能解决你的问题,请参考以下文章

与硬编码值相比,Oracle SQL In Subquery 花费了太多时间

从 fgets() 输入中删除尾随换行符

从 fgets() 输入中删除尾随换行符

XML 与硬编码接口?

fgets() 多次使用时 C 程序崩溃

从RSA编码的AES密钥生成AES密钥