C: 无法解密 Openssl 消息

标签 c encryption file-io openssl rsa

我是密码学新手,所以我决定创建一个简单的程序,打开一个文件加密数据,将其放入etest.txt,然后打开该文件解密并将其放入detest.txt。我知道这听起来很奇怪,但它是出于教育目的。这是我的代码。

#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <stdio.h>
#include <string.h>

int main(void) {
size_t pri_len;            // Length of private key
size_t pub_len;            // Length of public key
char   *pri_key;           // Private key
char   *pub_key;           // Public key
char   *msg = malloc(256);  // Message to encrypt
char   *encrypt = NULL;    // Encrypted message
char   *decrypt = NULL;    // Decrypted message
char   *err;               // Buffer for any error messages

// Generate key pair
RSA *keypair = RSA_generate_key(2048, 3, NULL, NULL);
 FILE *in   = fopen("test.txt", "rb");
 FILE *out  = fopen("etest.txt", "wb");

 if(in == NULL)
 {
    printf("in Error is %d (%s).\n", errno, strerror(errno));
 }
 if(out == NULL)
 {
    printf("out Error is %d (%s).\n", errno, strerror(errno));
 }

encrypt = malloc(RSA_size(keypair));
for(;;)
{
    //213 because of padding
    memset(msg, '\0', 256);
    memset(encrypt, '\0', 256);
    fread(msg, 213, 1, in);

    if((RSA_public_encrypt(strlen(msg), (unsigned char*)msg, (unsigned char*)encrypt,
                                         keypair, RSA_PKCS1_OAEP_PADDING)) == -1) {
        ERR_load_crypto_strings();
        ERR_error_string(ERR_get_error(), err);
        fprintf(stderr, "Error encrypting message: %s\n", err);           
    }

     if(fwrite(encrypt, 256, 1, out) != 1)
     {
       printf("fwrite Error is %d (%s).\n", errno, strerror(errno));
     }

    if(feof(in))
    {
        break;
    }      
}

fclose(in);
fclose(out);

in   = fopen("etest.txt", "rb");
out  = fopen("dtest.txt", "wb");

 if(in == NULL)
 {
    printf("in Error is %d (%s).\n", errno, strerror(errno));
 }
 if(out == NULL)
 {
    printf("out Error is %d (%s).\n", errno, strerror(errno));
 }

decrypt = malloc(RSA_size(keypair));

for(;;)
{
     //I use malloc because if i didnt it would from file and if it filled the msg and if this function would execute second time it would not overwrite the whole buffer and would cause problem
     memset(decrypt, '\0', 256);
     memset(msg, '\0', 256);

     fread(msg, 256, 1, in);


     if(RSA_private_decrypt(256, (unsigned char*)msg, (unsigned char*)decrypt,
                           keypair, RSA_PKCS1_OAEP_PADDING) == -1) {
        ERR_load_crypto_strings();
        ERR_error_string(ERR_get_error(), err);
        fprintf(stderr, "Error decrypting message: %s\n", err);
    }

    fwrite(decrypt, 256, 1, out);

    if(feof(in))
    {
      break;
    }
}

fclose(in);
fclose(out);
RSA_free(keypair);
return 0;

}

当我运行代码时,它给我返回错误:解密消息时出错:错误:0407A079:rsa例程:RSA_padding_check_PKCS1_OAEP:oaep解码错误但如果我删除此代码memset(msg, '\0', 256); 它表明一切工作正常,但它会导致问题,因为 msg 缓冲区被第二个 fread() 函数覆盖的前几个字节覆盖。 抱歉,如果我的问题听起来很愚蠢。希望你能帮忙。谢谢。

最佳答案

您正在使用 fwrite(decrypt, 256, 1, out); 这是错误的。size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) code> 第二个参数是要读取的每个元素的大小(以字节为单位),第三个参数是元素的数量,每个元素的大小为 size 字节。

关于C: 无法解密 Openssl 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34025222/

相关文章:

C到arm汇编代码转换

c - 尝试打印 NULL 时的两种情况,一种有效,其他 SegFaults

algorithm - 如何在 OpenSSL 中为 X.509 证书使用不同的加密算法?

java - 如何从 EJB 3 访问文件系统?

c++ - c/c++ for windows 中的 DNS 服务器

c - C语言程序运行时出现错误

java - javax.crypto 编码的字符串在 python 中的河豚解密

Android - 在sqlite数据库中存储敏感数据

c++ - 在 OpenCV 中读取嵌套的 XML

java - 如何创建文件并写入文件?