Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
Объект симметричного шифрвоания генерирует непонятные последовательности
Статус: Участник
Группы: Участники
Зарегистрирован: 26.12.2011(UTC) Сообщений: 22 Откуда: Москва
|
Добрый день. Стоит задача обмениваться клиенту (JS) и серверу (.NET) сообщениями, зашифровыанными с помощью симметричного ключа шифрования. Для полной совместимости в впоросе экспорта/импорта симметричного ключа между клиентом и сервером, на сервере используется класс SymmetricAlgorithm из CADESCOM. При разработке обрнаружилось, что с этим классом тест "зашифровка-расшифровка" не проходит. Т.е. если зашифровать данные, а потом этим же объектом расшифровать, то результат не будет соответствовать исходным данным. После экспериментов выяснилось, что один и тот же объект симметричного шифрования SymmetricAlgorithm при последовательных вызовах метода шифрования, каждый раз даёт разные результаты. тоже самое при дешифровании. Код:string testData = Convert.ToBase64String(Encoding.UTF8.GetBytes("foo"));
var oSymAlg = new SymmetricAlgorithmClass();
oSymAlg.GenerateKey();
var encrypted1 = oSymAlg.Encrypt(testData, true);
var encrypted2 = oSymAlg.Encrypt(testData, true);
var encrypted3 = oSymAlg.Encrypt(testData, true);
Console.WriteLine(encrypted1);
Console.WriteLine(encrypted2);
Console.WriteLine(encrypted3);
// Консоль:
// F5CFE9
// 4157CF
// 299497
Код:
string testData = Convert.ToBase64String(Encoding.UTF8.GetBytes("foo"));
var oSymAlg = new SymmetricAlgorithmClass();
oSymAlg.GenerateKey();
var encrypted = oSymAlg.Encrypt(testData, true);
var decoded1 = oSymAlg.Decrypt(encrypted, true);
var decoded2 = oSymAlg.Decrypt(encrypted, true);
var decoded3 = oSymAlg.Decrypt(encrypted, true);
Console.WriteLine(decoded1);
Console.WriteLine(decoded2);
Console.WriteLine(decoded3);
// Консоль:
// Jvr5
// Y53C
// bBzW
Если взять результат первого шифрования, экспортировать ключ, а потом восстановить объект SymmetricAlgorithm, то при первом дешифровании получается правильный результат. При дальнейших вызовах дешифрования с теми же параметрами у того же объекта генерируются какие-то неправильный результаты, как показано во втором примере. Если в качестве второго параметра (isFinal) в методах устаналвивать false, то поведение в первом примере никак не меняется, а во втором - ответ становиться одинаковым у всех вызовов, но неправильным. Прошу помочь советом. Уверен, распостранённая "подножка". Поиск по форуму результатов не дал.
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 24.11.2009(UTC) Сообщений: 965 Откуда: Crypto-Pro
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 174 раз в 152 постах
|
|
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 26.12.2011(UTC) Сообщений: 22 Откуда: Москва
|
Автор: cross  Т.е. между двумя подряд вызовами Encrypt или Decrypt куда-то теряется вектор инициализации?
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,104   Сказал «Спасибо»: 615 раз Поблагодарили: 2378 раз в 1870 постах
|
Автор: Ozzy  Автор: cross  Т.е. между двумя подряд вызовами Encrypt или Decrypt куда-то теряется вектор инициализации? При Encrypt - запомнить При Decrypt - восстановить |
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 26.12.2011(UTC) Сообщений: 22 Откуда: Москва
|
Если сделать так, как это показано в примере, то работать будет.
Напомню, что Я в начале писал про эту ситуацию: когда создаёшь объект симметричного шифрования, зашифровываешь данные, экспортируешь ключ, вытаскиваешь вектор инициализации и DeversData (которая в общем случае == null), потом на основе этого создаёшь новый объект симметричного шифрования, дешифруешь данные, то расшифрованные данные совпадают с исходными. Точно так же, как в примере.
Но если зашифровать первым объектом исходные данные два раза (один раз зашифровать, результат выкинуть, потоом ещё раз зашифровать исходные данные), то при расшифровке уже получится не то, что зашифровывалось.
В добавок, если повторять итерации расшифровки одних и тех же зашифрованных данных, то каждый раз будет новый разультат.
И всё это результат того эффекта, который Я описал в первом сообщении.
Такое ощущение, что объект симметричного шифрования можно использовать только один раз после создания - дальше он начинает "нести чушь"
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 26.12.2011(UTC) Сообщений: 22 Откуда: Москва
|
Хорошо, зайдём с другой стороны. Вот пример, в котором шифрование и дешифрование выполняются одним объектом. И, на всякий случай, Я вывел вектор инициализации, чтобы убедиться, что он никуда не теряется. Код:
string testData = Convert.ToBase64String(Encoding.UTF8.GetBytes("foo"));
var oSymAlg = new SymmetricAlgorithmClass();
oSymAlg.GenerateKey();
Console.WriteLine("VI before encrypt: " + oSymAlg.IV);
var encrypted = oSymAlg.Encrypt(testData, true);
Console.WriteLine("VI after encrypt: " + oSymAlg.IV);
var decrypted = oSymAlg.Decrypt(encrypted, true);
Console.WriteLine("Encrypted: " + encrypted);
var decryptedStr = Encoding.UTF8.GetString(Convert.FromBase64String(decrypted));
Console.WriteLine("Decrypted: " + decryptedStr);
// Console
// VI before encrypt: 86 63 0B B3 D0 B8 6D 3E
// VI after encrypt: 86 63 0B B3 D0 B8 6D 3E
// Encrypted: 502462
// Decrypted: Y�'
Вывод: вектор инициализации у одного и того же объекта при выполнении криптографических операций никуда не теряется - он остаётся неизменным. при этом один и тот же объект симметричного шифрования, зашифровав данные, не может тут же их расшифровать. Так ведь не должно быть? Отредактировано пользователем 29 марта 2018 г. 12:59:57(UTC)
| Причина: Не указана
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,104   Сказал «Спасибо»: 615 раз Поблагодарили: 2378 раз в 1870 постах
|
Автор: Ozzy  Такое ощущение, что объект симметричного шифрования можно использовать только один раз после создания - дальше он начинает "нести чушь" После вызова функций - его значение изменяется. Поэтому необходимо запоминать и восстанавливать (инициализировать сохранненным значением) |
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 26.12.2011(UTC) Сообщений: 22 Откуда: Москва
|
Автор: Андрей Писарев  Автор: Ozzy  Такое ощущение, что объект симметричного шифрования можно использовать только один раз после создания - дальше он начинает "нести чушь" После вызова функций - его значение изменяется. Поэтому необходимо запоминать и восстанавливать (инициализировать сохранненным значением) Но восстановление, т.е. импорт, происходит с применением асимметричного шифрования. А если так, то чтобы один раз расшифровать данные, надо сделать две криптографические операции: импортировать ключ с использование ассиметричного шифрования, расшифровать данные с помощью симметричного ключа. Так?
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 24.11.2009(UTC) Сообщений: 965 Откуда: Crypto-Pro
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 174 раз в 152 постах
|
Да, импорт ключа, востановление IV, расшифровка. |
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 26.12.2011(UTC) Сообщений: 22 Откуда: Москва
|
Автор: Андрей Писарев  После вызова функций - его значение изменяется. Изменяется значение ключа? Хотелось бы осознать цель реализации такого поведения. Можно ли как-то экспортировать/импортировать ключ без использования сертификта и ассиметричного шифрования?
|
|
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
Объект симметричного шифрвоания генерирует непонятные последовательности
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close