我有一个简单的C程序,它更像是一个“Echo”服务器,为此我想使用加密,具有以下要求,
尝试了很多选项,但是这里有其他要求,这些要求一直在失败,
我可以在完成此代码时获得一些帮助,加密文本需要使用纯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));
}
答案 0 :(得分:0)
如果您可以放松“无外部依赖关系”要求,则应使用libsodium。我在这里详细介绍了如何做到这一点:Simply encrypt a string in C。对于聊天程序,您可能需要选项3(公钥加密)。
这里的原因是:您无法合理地期望以安全的方式自己实现任何当前强大的加密算法。 Libsodium是一个相对较小的依赖项,它安全地实现了目前被认为是快速和安全的算法的高级抽象。
您执行简短实际加密算法的任何操作都只是模糊处理,即使对于低预算的攻击者也很容易阅读。例如,移位(或凯撒)密码泄漏有关纯文本中的模式的信息。如果您的纯文本是语言,这尤其糟糕:只有少数(可能100个)单词被发送和“加密”,可以嗅探流量的攻击者将能够通过猜测正确的密钥来解密所有过去和未来的通信。