2012-05-28 155 views
4

有很多關於使用BouncyCastle進行RSA加密和解密的主題,但是我遇到了一些意外的行爲。C#BouncyCastle RSA加密和解密

我試圖加密64點字節的數據使用大小爲64字節

的私鑰我計算的RSA加密,阻止如下:

public byte[] Encrypt(byte[] data, AsymmetricKeyParameter key) 
{ 
    var engine = new RsaEngine(); 
    engine.Init(true, key); 
    var blockSize = engine.GetInputBlockSize(); 
    return engine.ProcessBlock(data, 0, blockSize); 
} 

我計算使用公鑰解密如下

public byte[] Decrypt(byte[] data, AsymmetricKeyParameter key) 
{ 
    var engine = new RsaEngine(); 
    engine.Init(false, key); 
    var blockSize = engine.GetInputBlockSize(); 
    return engine.ProcessBlock(data, 0, blockSize); 
} 

什麼我發現是,當我使用加密一個64字節的私鑰我的64個數據我得到一個64字節的加密數據塊。

但是,當我使用64字節公鑰解碼64字節數組時,我得到一個大小爲62字節的數據塊。奇怪的是,62字節數組中包含的值等於64字節原始數組的值(預加密),但是解碼數組缺少原始數據的第一個索引和最終索引。

我試過使用不同的鍵和不同的數據集併發生同樣的事情。

我一定在做錯事,但我看不見它。

乾杯。

+0

請不要輸入您的代碼。複製並粘貼確切的代碼,因爲上面甚至沒有編譯。 –

+0

這裏是一個提示:你認爲'engine.GetInputBlockSize();的值是什麼?這是另一個提示。值取決於RSA引擎是處於加密模式還是解密模式而不同。 –

+0

到目前爲止你做過這些了嗎?因爲我遇到了同樣的問題,可能需要您的建議:) – Roylee

回答

2

你的基本概念錯了。

  1. 512位RSA是非常弱的,使用至少1024位
  2. 私鑰不進行加密。它用於解密和簽名。公鑰用於加密和驗證。
  3. 填充對於RSA安全至關重要。典型的填充方案需要幾十個字節。
  4. 即使使用教科書RSA,RSA也只能使用小於模數的值。所以512位模數不能在任意的64字節/ 512位值上運行。但只限於511位。

你應該退後一步,並描述你實際想要達到的目標,這樣我們就可以找到適合你需求的方案。只有在這之後,您才應該擔心它的實施。

+0

我同意你的意見,但是: 1.)我正在使用的接口需要使用512位RSA密鑰。 2.)我正在使用的接口執行公鑰解密,因此需要私鑰加密。 3.)使用的填充是在加密之前預先計算的,因爲使用了自定義填充方案。 –