我有一个简单的 C 程序,它更像是一个“Echo”服务器,为此我想使用加密,并满足以下要求,
- 从客户端发送纯文本到服务器后,客户端将 使用“预定义密码”“加密此字符串”并准备好
- 服务器将接收纯文本,并使用预定义的加密该字符串 密码并将其发回
- 客户端收到密文后,与自己这边的密文进行比较,如果匹配则没有错误,否则显示错误
尝试了很多选择,但这里有其他要求,但一直失败,
- 没有外部库依赖项
- 加密文本应该可打印并可保存到文件(十六进制也可以)
- 此代码运行非常频繁(如聊天服务器)。因此需要尽可能快,但又不太容易猜测。
我能否获得一些完成此代码的帮助,加密文本需要采用纯 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/