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

标签 c encryption password-encryption

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

  1. 从客户端发送纯文本到服务器后,客户端将 使用“预定义密码”“加密此字符串”并准备好
  2. 服务器将接收纯文本,并使用预定义的加密该字符串 密码并将其发回
  3. 客户端收到密文后,与自己这边的密文进行比较,如果匹配则没有错误,否则显示错误

尝试了很多选择,但这里有其他要求,但一直失败,

  1. 没有外部库依赖项
  2. 加密文本应该可打印并可保存到文件(十六进制也可以)
  3. 此代码运行非常频繁(如聊天服务器)。因此需要尽可能快,但又不太容易猜测。

我能否获得一些完成此代码的帮助,加密文本需要采用纯 ASCII(或十六进制)格式。

以下是我现有代码的示例,

在客户端

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));    
}

最佳答案

如果您可以完全放松“无外部依赖项”的要求,则应该使用 libsodium 。我在这里详细描述了如何执行此操作:Simply encrypt a string in C 。对于聊天程序,您可能需要选项 3(公钥加密)。

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

您所做的任何缺乏实际加密算法的操作都只是混淆,即使对于低预算的攻击者来说也很容易读取。例如,移位(或凯撒)密码会泄露有关纯文本模式的信息。如果您的纯文本是语言,这尤其糟糕:只需发送几个(可能是 100 个)单词并“加密”,能够嗅探流量的攻击者就能够通过猜测正确的 key 来解密所有过去和 future 的通信。

关于c - 如何在C中加密和解密char[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40131661/

相关文章:

asp.net-core - Identity Core 的密码历史记录

c - 如何在不使用 for 循环的情况下获取 char * 变量的大小?

c - 你如何找到地址和数据总线的大小

android - Android API 24 及更低版本上的 PBKDF2WithHmacSHA256

objective-c - AFNetworking + RNCryptor - 在 JSON 解析之前解密数据

php - 数据库上的安全明文密码

php - password_verify 不验证哈希

c - iconv 库不正确地将 UTF-8 转换为 KOI8-R

c++ - 对于 C/C++ 程序及其插件 DLL,最好的免费内存泄漏检测器是什么?

android - keystore 与 key 链