我使用RSA(1024)來加密/解密字符串。加密是使用公鑰實現的,用C#編寫,解密由c實現。我加密字符串:使用c#加密數據並使用openssl api進行解密,爲什麼在解密數據的末尾會出現很多垃圾填充?
86afaecb-c211-4d55-8e90-2b715d6d64b9
和加密數據寫入一個文件。然後,我使用openssl api從文件中讀取加密數據並對其進行解密。但是,我得到的輸出:
86afaecb-c211-4d55-8e90-2b715d6d64b9oeheBjQ8fo1AmDnor1D3BLuPyq9wJBAOV + M/WVNYzYr PJBKoskOj + 4LaNpT + SpkfK81nsnQEbHbjgao4eHNU + 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'在'RSA_private_decrypt()'中以空終止?那'encrypt_len'具有合適的值?最重要的是 - 解密後的值總是一樣的垃圾,還是每次解密後都是隨機的? –
您的加密方法似乎沒有指定填充。您的解密方法指定OAEP填充。您可能會在此填充不匹配。 – rossum
您是否嘗試過使用rsa.Encrypt(testData,false);和RSA_PKCS1_PADDING改爲RSA_PKCS1_OAEP_PADDING?只是爲了驗證問題不是PKCS#1 v2。 – Alesanco