我想写一个程序来加密和传输文件。这是我的程序的一部分:
char buf[BUF_SIZE],decrypted[BUF_SIZE+EVP_MAX_BLOCK_LENGTH];
int cipher_size,decrypted_size;
while(1)
{
read(clnt_sock,(char*)&cipher_size,sizeof(cipher_size));
read(clnt_sock,buf,cipher_size);
des_decrypt((unsigned char *)buf,cipher_size,(unsigned char*)argv[2],
(unsigned char*)decrypted,&decrypted_size);
fwrite(buf,1,decrypted_size,fp);
}
void des_decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key, unsigned char *plaintext, int *plaintext_len) {
EVP_CIPHER_CTX *ctx;
int len;
if(!(ctx = EVP_CIPHER_CTX_new())) {
return;
}
if(1 != EVP_DecryptInit_ex(ctx, EVP_des_ecb(), NULL, key, NULL)) {
err("DES init error!");
return;
}
if(1 != EVP_DecryptUpdate(ctx, plaintext, plaintext_len, ciphertext, ciphertext_len)) {
err("Decrypt error!");
return;
}
if(1 != EVP_DecryptFinal_ex(ctx, plaintext + *plaintext_len, &len)) {
err("Final Decrypt error");
return;
}
*plaintext_len += len;
EVP_CIPHER_CTX_free(ctx);
}
但是des_decrypt
函数总是在第二个return
语句返回值plaintext_len
为零。我试着调试,发现EVP_DecrypInit_ex
的返回值总是1。
我只是想知道是什么原因导致了这个问题,以及如何解决它,谢谢!!
在Ubuntu 22.x上。
1条答案
按热度按时间1yjd4xko1#
如果您的OpenSSL版本大于3.0。您需要加载遗留提供程序。在此URL中:https://www.openssl.org/docs/man3.0/man7/EVP_CIPHER-DES.html
旧提供程序中提供了以下算法:
您需要加载旧版提供程序。
最终代码:
输出:12345678