2011-05-09 66 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