充气城堡AES加密中的编码类型和密钥问题

本文关键字:类型 编码 密钥 问题 城堡 AES 加密 | 更新日期: 2023-09-27 17:56:07

我正在使用Bouncy Castle加密库。我有一个 13 个字符的键,类似于字符串键 = "Wergt543JUSFT";要加密的文本是:字符串纯 = "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());

类 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 位"。我在代码中进行了以下操作来更改编码类型:

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,Unicode,UTF32UTF7,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); 
    } 
} 

充气城堡AES加密中的编码类型和密钥问题

您需要确保密钥长度为 128/192/256 位。正如您在 EncryptDecrypt 方法中使用getKeyMessageDigest一样,您可以在 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 来获取密钥,因为此方法为不同的编码返回不同的数组长度。