Что будет "openssl enc -a -e -salt -des3 -pass pass:abc123" эквивалентным в.NET?
Мое приложение.Net должно взаимодействовать с системой на основе Linux, которая использует следующую командную строку для шифрования своих сообщений:
openssl enc -a -e -salt -des3 -pass pass:abc123
Как будет выглядеть эквивалентный код для шифрования / дешифрования сообщений в C#?
Я понимаю, что я должен использовать TripleDES в режиме CBC с отступом PKCS7. Я не знаю, какой размер блока и вектор инициализации (IV) мне следует использовать.
Также я запутался, как мне получить ключ из пароля. Должен ли я использовать PBKDF1 или PBKDF2 и какую соль мне следует использовать?
Так что то, что кажется стандартной работой, заканчивается для меня загадкой на всю ночь. Кто-нибудь может мне помочь?
1 ответ
Итак, вот фокус:
> openssl enc -a -e -salt -des3 -P -pass pass:abc123
salt=17685C0658F85BA4
key=1CB6E5A0AA4953EC2323CBA021EF008C9193F5F29990DE87
iv =9148EB5B2BF2E9B2
Если я использую алгоритм TripleDES, результат будет почти таким же, как у openssl. Единственная разница - дополнительные 16 байтов в начале вывода openssl. Первые восемь из этих байтов - это текст "Salted__", а вторые восемь - это соль.
Соль случайная. Так как мне получить ключ и iv из пароля и соли? PBKDF1 и PBKDF2 не соответствуют требованиям.
Итак, вот второй трюк:
A = MD5(pwd + SALT)
B = MD5(A + PWD + SALT)
KEY + IV = A + B
Знак плюс означает конкатенацию, длина ключа 24 байта, длина IV - 8 байтов.
Я узнал об этом трюке из блога Deusty, где он делает подобные вещи с AES.