我正在使用Bouncy Castle加密库。我有一个13个字符的键 string key =“wergt543jusft”; 要加密的文本是:string plain =“435625241526373”;
我使用以下方法将其转换为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());
AESE加密类有两种方法:
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
我的目标是使用所有编码类型为变量plian =“435625241526373”生成加密字符串,例如: 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 :(得分:1)
您需要确保密钥长度为128/192/256位。就像在getKeyMessageDigest
和Encrypt
方法中使用Decrypt
一样,您可以在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
来获取密钥,因为此方法为不同的编码返回不同的数组长度。