2013-07-31 26 views
4

我使用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); 
} 
+0

你確定'decrypt'在'RSA_private_decrypt()'中以空終止?那'encrypt_len'具有合適的值?最重要的是 - 解密後的值總是一樣的垃圾,還是每次解密後都是隨機的? –

+0

您的加密方法似乎沒有指定填充。您的解密方法指定OAEP填充。您可能會在此填充不匹配。 – rossum

+0

您是否嘗試過使用rsa.Encrypt(testData,false);和RSA_PKCS1_PADDING改爲RSA_PKCS1_OAEP_PADDING?只是爲了驗證問題不是PKCS#1 v2。 – Alesanco

回答

1

我通過在「decrypt = malloc(encrypt_len);」之後使用「memset(decrypt, 0, encrypt_len);」初始化解密來解決問題。 Thx大家。

0

的問題是,你應該使用解密的大小,而不是直接治療解密的輸出作爲一個空結尾的字符串。

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

相關問題