Тип кодирования и проблема с ключами в Bouncy castle AES Encryption - PullRequest
0 голосов
/ 09 мая 2011

Я использую криптографические библиотеки 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());

Класс 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, 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); 
    } 
} 

1 Ответ

1 голос
/ 09 мая 2011

Вы должны убедиться, что ваш ключ имеет длину 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 для получения ключа, поскольку этот метод возвращает разные длины массивов для разных кодировок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...