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