2011-05-09 59 views
0

我使用Bouncy Castle加密庫。我有一個13字符的鍵,如 string key =「wergt543jusft」; 要加密的文本是:string plain =「435625241526373」;充氣城堡AES加密的編碼類型和關鍵問題

我使用以下方法將其轉換爲128位密鑰。

public string getKeyMessageDigest(string key) 
{ 
    byte[] ByteData = Encoding.ASCII.GetBytes(key); 

    //MD5 creating MD5 object. 
    MD5 oMd5 = MD5.Create(); 
    byte[] HashData = oMd5.ComputeHash(ByteData); 

    //convert byte array to hex format 
    StringBuilder oSb = new StringBuilder(); 
    for (int x = 0; x < HashData.Length; x++) 
    { 
     //hexadecimal string value 
     oSb.Append(HashData[x].ToString("x2")); 
    } 
    return Convert.ToString(oSb); 
} 

然後,我創建AESEncryption類的一個對象,我已經定義

AESEncryption aes = new AESEncryption(Encoding.ASCII, new Pkcs7Padding()); 

類AESEncryption有兩種方法:

public string Encrypt(string plain, string key) 
{ 
    string hashKey = getKeyMessageDigest(key); 
    BCEngine bcEngine = new BCEngine(new AesEngine(), _encoding); 
    bcEngine.SetPadding(_padding); 
    return bcEngine.Encrypt(plain, hashKey); 
} 

public string Decrypt(string plain, string key) 
{ 
    string hashKey = getKeyMessageDigest(key); 
    BCEngine bcEngine = new BCEngine(new AesEngine(), _encoding); 
    bcEngine.SetPadding(_padding); 
    return bcEngine.Decrypt(plain, hashKey); 
} 

,一切工作正常。

但是,當我將編碼類型更改爲ASCII以外的任何內容時,出現錯誤「密鑰長度不是128/192/256位」。我在我的代碼做了以下chnages要更改編碼類型:

public string getKeyMessageDigest(string key) 
{ 
    byte[] ByteData = Encoding.UTF32.GetBytes(key); 
    //MD5 creating MD5 object. 
    MD5 oMd5 = MD5.Create(); 
    byte[] HashData = oMd5.ComputeHash(ByteData); 

    //convert byte array to hex format 
    StringBuilder oSb = new StringBuilder(); 
    for (int x = 0; x < HashData.Length; x++) 
    { 
     //hexadecimal string value 
     oSb.Append(HashData[x].ToString("x2")); 
    } 
    return Convert.ToString(oSb); 
} 

AESEncryption aes = new AESEncryption(Encoding.UTF32, new Pkcs7Padding()); 

代碼的其餘部分保持不變。任何人都可以請指導?

預先感謝...

我的聯繫以下: http://elian.co.uk/post/2009/07/29/Bouncy-Castle-CSharp.aspx

我的目標是=「435625241526373」使用所有的編碼類型,例如,以產生加密的字符串的可變plian: ASCII,BigEndianUnicode,統一,UTF32 UTF7,UTF8

[從評論編輯] 唯一的例外是這種方法內拋出:

private byte[] BouncyCastleCrypto(bool forEncrypt, byte[] input, string key) 
{ 
    try 
    { 
     cipher = _padding == null ? 
      new PaddedBufferedBlockCipher(_blockCipher) : 
      new PaddedBufferedBlockCipher(_blockCipher, _padding); 

     byte[] keyByte = _encoding.GetBytes(key); 
     _cipher.Init(forEncrypt, new KeyParameter(keyByte)); 
     return _cipher.DoFinal(input); 

    } 
    catch (Org.BouncyCastle.Crypto.CryptoException ex) 
    { 
     throw new CryptoException(ex.Message); 
    } 
} 
+0

你在哪一行得到這個錯誤?無論密鑰長度或編碼如何,MD5散列總是128位長,因​​此不清楚如何得到這樣的錯誤。 – Groo 2011-05-09 17:06:49

+0

@哈里:在什麼類/方法呢?在示例中我沒有看到一個「_cipher」字段。另外,'AESEncryption'是你寫的這個類的名字(包含'Encrypt'和'Decrypt'方法? – Groo 2011-05-09 17:16:15

+0

如果您參考Bouncy Castle鏈接(BCEngine類),thr是一種名爲BouncyCastleCrypto(bool forEncrypt,byte [] input,string key)的方法。我得到錯誤行=> _cipher.Init(forEncrypt,new KeyParameter(keyByte)); – Hari 2011-05-09 17:21:19

回答

1

您需要確保您的密鑰長度爲128/192/256位。正如你所用getKeyMessageDigestEncryptDecrypt方法,你可以用它try/catch子句中創建你的關鍵的一個128位的散列值:

private byte[] BouncyCastleCrypto(bool forEncrypt, byte[] input, string key) 
{ 
    try 
    { 
     cipher = _padding == null ? 
      new PaddedBufferedBlockCipher(_blockCipher) : 
      new PaddedBufferedBlockCipher(_blockCipher, _padding); 

     // this line will make sure keyByte is 16 bytes long 
     byte[] keyByte = getKeyMessageDigest(key); 

     _cipher.Init(forEncrypt, new KeyParameter(keyByte)); 

     return _cipher.DoFinal(input);   
    } 
    catch (Org.BouncyCastle.Crypto.CryptoException ex) 
    { 
     throw new CryptoException(ex.Message); 
    } 
} 

此外,您不必擔心改變編碼在getKeyMessageDigest之內,編碼傳遞只是爲了確保實際數據的正確編碼,而不是密鑰。

無論輸入大小如何,MD5哈希總是包含16個字節。所以,唯一的問題是如果您使用Encoding.GetBytes來獲取密鑰,因爲此方法爲不同的編碼返回不同的數組長度。

+0

嗨Groo,非常感謝您的及時幫助。你的建議做到了。我對getKeyMessageDigest方法做了一些修改=> public byte [] getKeyMessageDigest(string key) byte [] ByteData = Encoding.Unicode.GetBytes(key); // MD5創建MD5對象。 MD5 oMd5 = MD5.Create(); byte [] HashData = oMd5.ComputeHash(ByteData); return HashData; } – Hari 2011-05-10 10:00:58