如何在C中加密和解密char []?

时间:2016-10-19 12:40:01

标签: c encryption password-encryption

我有一个简单的C程序,它更像是一个“Echo”服务器,为此我想使用加密,具有以下要求,

  1. 从客户端发送纯文本到服务器后,客户端将 “使用”预定义密码“加密此字符串”并保持准备
  2. 服务器将接收纯文本,并使用预定义加密此字符串 密码并将其发回
  3. 客户端将收到加密文本,将其与加密文本进行比较,如果两者都匹配,则无错误,否则显示错误
  4. 尝试了很多选项,但是这里有其他要求,这些要求一直在失败,

    1. 没有外部libs依赖
    2. 加密文字应该是可打印的,并且可以保存为文件(HEX也可以)
    3. 此代码运行频繁(如聊天服务器)。所以需要尽可能快,但不容易猜到。
    4. 我可以在完成此代码时获得一些帮助,加密文本需要使用纯ASCII(或HEX)。

      以下是我现有代码的示例

      在客户端

      char *randomAllowchar = "abcdefghijklmnopqrstuvwxyz";
      char plainStrToServer[30];      
      
      // generating 20 char random string           
      for (n = 0;n < 20;n++) {  
          key = rand() % 26;          
          plainStrToServer[n] = randomAllowchar[key];
      }
      
      ... other code to send this plainStrToServer to server side
      
      // Receiving response from server
      char server_reply[200];
      if( recv(sock , server_reply , 200 , 0) < 0){
          ...
      }
      
      // comparing if server response matched with sent string
      if (strcmp(plainStrToServer,server_reply) != 0) { 
          // Error 
      }
      

      在服务器端

      char buffer[30];
      int rc1;
      
      while (1) { 
          rc1 = read(fd, buffer, sizeof(buffer));
          // write back original received message back to client
          write(fd , buf, strlen(buffer));    
      }
      

1 个答案:

答案 0 :(得分:0)

如果您可以放松“无外部依赖关系”要求,则应使用libsodium。我在这里详细介绍了如何做到这一点:Simply encrypt a string in C。对于聊天程序,您可能需要选项3(公钥加密)。

这里的原因是:您无法合理地期望以安全的方式自己实现任何当前强大的加密算法。 Libsodium是一个相对较小的依赖项,它安全地实现了目前被认为是快速和安全的算法的高级抽象。

您执行简短实际加密算法的任何操作都只是模糊处理,即使对于低预算的攻击者也很容易阅读。例如,移位(或凯撒)密码泄漏有关纯文本中的模式的信息。如果您的纯文本是语言,这尤其糟糕:只有少数(可能100个)单词被发送和“加密”,可以嗅探流量的攻击者将能够通过猜测正确的密钥来解密所有过去和未来的通信。