У меня есть пример шифрования с 3 партии мне нужно интегрировать с ...C# AES 128 CBC с -nosalt производить различные результаты, чем OpenSSL AES -128-CBC -nosalt
Я должен отправить их зашифрованными и они расшифровывают его на своем конце и выполняют необходимые операции.
Они предоставили мне пример того, как они ожидают, строка должна быть зашифрована ..
эхо -n [ «Строка для шифрования»] | OpenSSL ENC -AES-128-CBC -A -a -nosalt -К [EncryptionKey в Hex] -IV 30303030303030303030303030303030
песочница EncryptionKey Hex, что я даюсь с является 313233343536373839
В настоящее время я не могу для использования выше указанного ключа и IV, как ... как реализации AES в .Net бросает меня и ошибка, которая говорит: «Указанный ключ не является допустимым размером для этого алгоритма»
затем я просто заполнил ключ с помощью 0s для соответствия 32 байтам и усечения IV в соответствии с 16 байтами.
тогда я могу запустить код по крайней мере, но зашифрованная строка из моих C# код просто не могли получить расшифрованные на OpenSSL ..
Ниже мой код ..
public static string EncryptString(string plainText, string password)
{
byte[] key, iv;
//converting key to hex
byte[] ba = Encoding.ASCII.GetBytes("abcdef");
string encryptionKeyHex = BitConverter.ToString(ba);
encryptionKeyHex = encryptionKeyHex.Replace("-", "");
// Padding key hex with zeros to match the size that .Net algo expects
if (encryptionKeyHex.Length < 32)
{
while (encryptionKeyHex.Length < 32)
{
encryptionKeyHex += "0";
}
}
var keyBytes = Encoding.ASCII.GetBytes(encryptionKeyHex);
var ivBytes = Encoding.ASCII.GetBytes("3030303030303030"); // truncated the original IV specified in the question description to match the size.
iv = ivBytes;
key = keyBytes;
var amAes = new AesManaged();
amAes.Mode = CipherMode.CBC;
amAes.Padding = PaddingMode.PKCS7;
amAes.KeySize = 128;
amAes.BlockSize = 128;
amAes.Key = key;
amAes.IV = iv;
var icTransformer = amAes.CreateEncryptor();
var msTemp = new MemoryStream();
var csEncrypt = new CryptoStream(msTemp, icTransformer, CryptoStreamMode.Write);
var sw = new StreamWriter(csEncrypt);
sw.Write(plainText);
sw.Close();
sw.Dispose();
csEncrypt.Clear();
csEncrypt.Dispose();
byte[] bResult = msTemp.ToArray();
//var sha = new SHA1CryptoServiceProvider();
//var result = sha.ComputeHash(bResult);
string sResult = Convert.ToBase64String(bResult);
sResult = HttpUtility.UrlEncode(sResult);
if (System.Diagnostics.Debugger.IsAttached)
{
string debugDetails = "";
debugDetails += "==> INPUT : " + plainText + Environment.NewLine;
debugDetails += "==> SECRET : " + password + Environment.NewLine;
//debugDetails += "==> SALT : " + Program.ByteArrayToHexString(salt) + Environment.NewLine;
debugDetails += "==> KEY : " + Encoding.ASCII.GetString(amAes.Key) + " (" + amAes.KeySize.ToString() + ")" + Environment.NewLine;
debugDetails += "==> IV : " + Encoding.ASCII.GetString(amAes.IV) + Environment.NewLine;
debugDetails += "==> ENCRYPTED : " + sResult;
Console.WriteLine(debugDetails);
}
return sResult;
}
ВЫВОД:
==> INPUT: { "filter.accession_number.equals": "0987654321"}
==> SECRET: ==> KEY: 303132333435363738390000 00000000 (256)
==> IV: 3030303030303030
==> ENCRYPTED: B2uDRjnekFAlRDEKDldTs09lWiE4u16ZunVwDGi6gKm6YsaRlW4HU6eKJqfYZc7b
Update
Было замечено, что мы получаем разные результаты при шифровании на коробке окна чем на Linux Box, используя тот же метод.
На linux box с помощью openssl мы получаем ..
Команда: echo -n '{"filter.accession_number.equals": "0987654321"}' | OpenSSL ENC -AES-128-CBC -A -a -nosalt -К 313233343536373839 -iv 30303030303030303030303030303030
Результат: MTAusb6rYkxYf9/REbFq9M1XwR + 6Q58FfSJPTxDNwgs6z3jZ8ru + 7ysnKuy2p3ox
Это зашифрованная строка работает просто отлично .. я могу чтобы успешно расшифровать его.
Выдавая ту же команду в окне окна, чтобы openssl дает нам ..
Команда: echo -n '{"filter.accession_number.equals": "0987654321"}' | OpenSSL ENC -AES-128-CBC -A -a -nosalt -К 313233343536373839 -iv 30303030303030303030303030303030
Результат: Db9829q6QX6CPwLkE + rs6zqRJJQaGZ9xk7fbztaGqsKcHPcr7equz3yOJPLc + S6yvW4jXQTzoOk43F16GW7sPw ==
Эта строка не работает ...
Мне интересно, что значение 'amAes.KeySize' после установки ключа. Я задаюсь вопросом, сбрасывается ли он на 256 байт после того, как вы установили ключ, даже если вы установите его на 128 перед этим. Не могли бы вы распечатать его и поделиться со мной информацией? –
==> ВХОД: { "filter.accession_number.equals": "0987654321"} ==> секрету: ==> Ключ: 30313233343536373839000000000000 (256) ==> IV: 3030303030303030 ==> ENCRYPTED: B2uDRjnekFAlRDEKDldTs09lWiE4u16ZunVwDGi6gKm6YsaRlW4HU6eKJqfYZc7b –
Обновлено описание с выходом ... далее, извините, я не понимаю, где вы указываете мне, чтобы расшифровать ключ или IV? Я имею в виду, на каком этапе? я предполагаю, что он ожидает шестнадцатеричную кодированную строку, как в инструкции openssl, о которой я упомянул в описании ... –