我使用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);
}
}
你在哪一行得到這個錯誤?無論密鑰長度或編碼如何,MD5散列總是128位長,因此不清楚如何得到這樣的錯誤。 – Groo 2011-05-09 17:06:49
@哈里:在什麼類/方法呢?在示例中我沒有看到一個「_cipher」字段。另外,'AESEncryption'是你寫的這個類的名字(包含'Encrypt'和'Decrypt'方法? – Groo 2011-05-09 17:16:15
如果您參考Bouncy Castle鏈接(BCEngine類),thr是一種名爲BouncyCastleCrypto(bool forEncrypt,byte [] input,string key)的方法。我得到錯誤行=> _cipher.Init(forEncrypt,new KeyParameter(keyByte)); – Hari 2011-05-09 17:21:19