Что будет эквивалентно «openssl enc -a -e -salt -des3 -pass pass: abc123» в .NET? - PullRequest
4 голосов
/ 03 ноября 2010

Мое приложение .Net должно взаимодействовать с системой на базе Linux, которая использует следующую командную строку для шифрования своих сообщений:

openssl enc -a -e -salt -des3 -pass pass:abc123

Как будет выглядеть эквивалентный код для шифрования / дешифрования сообщений в c #?

Я понимаю, что должен использовать TripleDES в режиме CBC с PKCS7 дополнением . Чего я не знаю, так это размер блока и вектор инициализации (IV) , который мне следует использовать.

Также я запутался, как мне получить ключ из пароля. Должен ли я использовать PBKDF1 или PBKDF2 и какую соль мне следует использовать?

Так что, казалось бы, вполне стандартная работа заканчивается для меня загадкой на всю ночь. Кто-нибудь может мне помочь?

1 Ответ

6 голосов
/ 05 ноября 2010

Итак, вот хитрость:

> 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 blog , где он делает подобные вещи с AES.

...