Ключевое слово в защите информации
ключевое слово
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Ozzy  
#1 Оставлено : 28 марта 2018 г. 0:35:22(UTC)
Ozzy

Статус: Участник

Группы: Участники
Зарегистрирован: 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, то поведение в первом примере никак не меняется, а во втором - ответ становиться одинаковым у всех вызовов, но неправильным.

Прошу помочь советом. Уверен, распостранённая "подножка". Поиск по форуму результатов не дал.
Offline cross  
#2 Оставлено : 28 марта 2018 г. 12:42:27(UTC)
Анатолий Беляев

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
Вы не правильно используете обьект. У вас теряется задание вектора инициализации.
https://www.cryptopro.ru...page/symalgo_sample.html - вот тут есть правильный пример .
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
Offline Ozzy  
#3 Оставлено : 29 марта 2018 г. 12:27:57(UTC)
Ozzy

Статус: Участник

Группы: Участники
Зарегистрирован: 26.12.2011(UTC)
Сообщений: 22
Откуда: Москва

Автор: cross Перейти к цитате
Вы не правильно используете обьект. У вас теряется задание вектора инициализации.
https://www.cryptopro.ru...page/symalgo_sample.html - вот тут есть правильный пример .


Т.е. между двумя подряд вызовами Encrypt или Decrypt куда-то теряется вектор инициализации?
Offline Андрей Писарев  
#4 Оставлено : 29 марта 2018 г. 12:38:16(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,104
Мужчина
Российская Федерация

Сказал «Спасибо»: 615 раз
Поблагодарили: 2378 раз в 1870 постах
Автор: Ozzy Перейти к цитате
Автор: cross Перейти к цитате
Вы не правильно используете обьект. У вас теряется задание вектора инициализации.
https://www.cryptopro.ru...page/symalgo_sample.html - вот тут есть правильный пример .


Т.е. между двумя подряд вызовами Encrypt или Decrypt куда-то теряется вектор инициализации?


При Encrypt - запомнить
При Decrypt - восстановить

Техническую поддержку оказываем тут
Наша база знаний
Offline Ozzy  
#5 Оставлено : 29 марта 2018 г. 12:40:29(UTC)
Ozzy

Статус: Участник

Группы: Участники
Зарегистрирован: 26.12.2011(UTC)
Сообщений: 22
Откуда: Москва

Если сделать так, как это показано в примере, то работать будет.

Напомню, что Я в начале писал про эту ситуацию: когда создаёшь объект симметричного шифрования, зашифровываешь данные, экспортируешь ключ, вытаскиваешь вектор инициализации и DeversData (которая в общем случае == null), потом на основе этого создаёшь новый объект симметричного шифрования, дешифруешь данные, то расшифрованные данные совпадают с исходными. Точно так же, как в примере.

Но если зашифровать первым объектом исходные данные два раза (один раз зашифровать, результат выкинуть, потоом ещё раз зашифровать исходные данные), то при расшифровке уже получится не то, что зашифровывалось.

В добавок, если повторять итерации расшифровки одних и тех же зашифрованных данных, то каждый раз будет новый разультат.

И всё это результат того эффекта, который Я описал в первом сообщении.

Такое ощущение, что объект симметричного шифрования можно использовать только один раз после создания - дальше он начинает "нести чушь"
Offline Ozzy  
#6 Оставлено : 29 марта 2018 г. 12:58:38(UTC)
Ozzy

Статус: Участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Андрей Писарев  
#7 Оставлено : 29 марта 2018 г. 12:59:00(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,104
Мужчина
Российская Федерация

Сказал «Спасибо»: 615 раз
Поблагодарили: 2378 раз в 1870 постах
Автор: Ozzy Перейти к цитате

Такое ощущение, что объект симметричного шифрования можно использовать только один раз после создания - дальше он начинает "нести чушь"


После вызова функций - его значение изменяется.
Поэтому необходимо запоминать и восстанавливать (инициализировать сохранненным значением)
Техническую поддержку оказываем тут
Наша база знаний
Offline Ozzy  
#8 Оставлено : 29 марта 2018 г. 13:02:46(UTC)
Ozzy

Статус: Участник

Группы: Участники
Зарегистрирован: 26.12.2011(UTC)
Сообщений: 22
Откуда: Москва

Автор: Андрей Писарев Перейти к цитате
Автор: Ozzy Перейти к цитате

Такое ощущение, что объект симметричного шифрования можно использовать только один раз после создания - дальше он начинает "нести чушь"


После вызова функций - его значение изменяется.
Поэтому необходимо запоминать и восстанавливать (инициализировать сохранненным значением)


Но восстановление, т.е. импорт, происходит с применением асимметричного шифрования. А если так, то чтобы один раз расшифровать данные, надо сделать две криптографические операции: импортировать ключ с использование ассиметричного шифрования, расшифровать данные с помощью симметричного ключа. Так?
Offline cross  
#9 Оставлено : 29 марта 2018 г. 13:09:58(UTC)
Анатолий Беляев

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
Да, импорт ключа, востановление IV, расшифровка.
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
Offline Ozzy  
#10 Оставлено : 29 марта 2018 г. 13:26:34(UTC)
Ozzy

Статус: Участник

Группы: Участники
Зарегистрирован: 26.12.2011(UTC)
Сообщений: 22
Откуда: Москва

Автор: Андрей Писарев Перейти к цитате
После вызова функций - его значение изменяется.


Изменяется значение ключа? Хотелось бы осознать цель реализации такого поведения. Можно ли как-то экспортировать/импортировать ключ без использования сертификта и ассиметричного шифрования?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.