2

我需要使用RSA加密某些文本,然後使用私鑰恢復它。我的問題是,RSACryptoServiceProvider.Encrypt()每次輸出一個不同的值,即使使用相同的密鑰。這裏是我的代碼,我投入LINQpad測試:RSACryptoServiceProvider不會產生一致的輸出

CspParameters cp = new CspParameters(); 
cp.KeyContainerName = "MyKey"; 
cp.Flags = CspProviderFlags.UseMachineKeyStore | CspProviderFlags.UseExistingKey; 

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp); 

// using LINQpad to verify the key is loaded properly -- same every time 
rsa.ToXmlString(true).Dump(); 

byte[] rgb = new ASCIIEncoding().GetBytes("Hello world"); 
byte[] xx = rsa.Encrypt(rgb, false); 
string b64 = Convert.ToBase64String(xx); 

// this changes every time: 
b64.Dump(); 

我猜這個類必須使用別的東西,以及關鍵影響輸出,但我在努力尋找什麼。

+0

當你對數據進行解密,你每次都得到相同的結果? – robert

+0

嗯,我以爲我沒有。這就是爲什麼我把它全部回來看看加密文本,看看它是一樣的。但是在我更新我的答案之前,我無法重現問題 - 我想我在第二個參數Encrypt()中混合了填充類型。 – gordonmleigh

回答

1

每次對同一個明文進行加密時,密文的不同並不意味着它不能一致解密。
這確實是一個很好的加密算法的標誌,它能夠產生這種行爲,使其對各種攻擊更有彈性。

這是因爲加密邏輯在進程中引入了隨機性,例如通過在明文本身之前系統地添加一些隨機字節。只要解密邏輯知道在整個密文被解密後忽略這些字節,它就可以重現原始的明文。

我建議你把任何這個b64文本的實例提交給反向進程,並看到在所有情況下產生的「rgb」是「Hello world」。

1

不同的輸出是完全正常的。這是因爲您的數據正在被PKCS#1或OAEP填充 - 並且都在使用/添加一些隨機數據。

現在這不是你應該如何使用RSA。對你而言,最直接的原因很多,是因爲填充/塊大小限制了你可以加密的字節數(而且RSA太慢而無法考慮循環加密塊)。

我在描述如何可以混合對稱的(更好的速度,沒有大小限制)與非對稱加密的主題寫了一blog entry - 獲得兩全其美的:-)