使用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);
}
我通过在"decrypt = malloc(encrypt_len);
"之后使用"memset(decrypt, 0, encrypt_len);
"初始化解密来解决问题。谢谢大家。
问题是应该使用解密后的大小,而不是直接将解密的输出视为以null结尾的字符串。
RSA_private_decrypt()
返回恢复的明文的大小。