使用c#加密数据,并使用opensslapi解密数据,这就是为什么在解密数据的末尾有很多垃圾填充的原因

本文关键字:数据 解密 填充 加密 opensslapi 为什么 使用 | 更新日期: 2023-09-27 18:25:34

I使用RSA(1024)加密/解密字符串。加密是用公钥实现的,用C#编写,解密是用C实现的。我加密字符串:

86afaecb-c211-4d55-8e90-2b715d6d64b9

并将加密后的数据写入文件。然后,我使用opensslapi从文件中读取加密数据并对其进行解密

86afaecb-c211-4d55-8e90-2b715d6d64b9oeheBjQ8fo1AmDnor1D3LuPyq9wJBAOV+M/WVNYzYrPJBKoskOj+4LaNpT+SpkfK81nsQEbHbjgao4EHNU+PmWl9

在原始字符串的末尾似乎有一些垃圾填充。为什么会发生?如何解决这个问题?

一些代码片段如下所示:

// Encrypt
{
    string plainData = “86afaecb-c211-4d55-8e90-2b715d6d64b9”;
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
    rsa.ImportParameters(paraPub);
    byte[] testData = Encoding.UTF8.GetBytes(plainData);
    byte[] encryptedData = rsa.Encrypt(testData, true);
    FileStream pFileStream = null;
    string fileName = "encryptedData.dat";
    pFileStream = new FileStream(fileName, FileMode.OpenOrCreate);
    pFileStream.Write(encryptedData, 0, encryptedData.Length);
    ...
}
// Decrypt
{
    char *encrypt = malloc(RSA_size(privateKey));
    FILE *out = fopen("encryptedData.dat", "r");
    int encrypt_len = fread(encrypt, sizeof(*encrypt), RSA_size(privateKey), out);
    fclose(out);
    decrypt = malloc(encrypt_len);
    if(RSA_private_decrypt(encrypt_len, 
                          (unsigned char*)encrypt, 
                          (unsigned char*)decrypt, 
                          privateKey, RSA_PKCS1_OAEP_PADDING) == -1) {
        // error handle
    }
    printf("Decrypted message: %s'n", decrypt);
}

使用c#加密数据,并使用opensslapi解密数据,这就是为什么在解密数据的末尾有很多垃圾填充的原因

我通过在"decrypt = malloc(encrypt_len);"之后使用"memset(decrypt, 0, encrypt_len);"初始化解密来解决问题。谢谢大家。

问题是应该使用解密后的大小,而不是直接将解密的输出视为以null结尾的字符串。

RSA_private_decrypt()返回恢复的明文的大小。