2010-11-03 31 views
4

Mon application .Net besoin de communiquer avec le système basé sur Linux qui utilise la ligne de commande suivante pour chiffrer leurs messages:Qu'est-ce que "openssl enc -a -e -salt -des3 -passpass: abc123" équivalent en .NET?

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

Comment aurait un code équivalent à chiffrer/déchiffrer des messages dans C# ressemblent? Je comprends que je devrais utiliser TripleDES dans CBC mode avec PKCS7 padding. Ce que je ne sais pas, c'est ce que je devrais utiliser block size et initialization vector (IV).

Aussi je suis confus comment devrais-je dériver la clé du mot de passe. Dois-je utiliser PBKDF1 ou PBKDF2 et quel sel dois-je utiliser?

Donc, ce qui semble être un travail assez standard se termine pour moi avec puzzle toute la nuit. Quelqu'un peut-il m'aider?

Répondre

6

Voici donc l'astuce:

> openssl enc -a -e -salt -des3 -P -pass pass:abc123 
salt=17685C0658F85BA4 
key=1CB6E5A0AA4953EC2323CBA021EF008C9193F5F29990DE87 
iv =9148EB5B2BF2E9B2 

Si je nourris TripleDES algorithme la sortie est presque identique à la sortie OpenSSL. La seule différence est 16 octets supplémentaires au début de la sortie openssl. Les huit premiers de ces octets sont "Salted__" et le second huit est le salt.

Le sel est aléatoire. Alors, comment puis-je dériver la clé et iv du mot de passe et du sel? PBKDF1 ou PBKDF2 ne sont pas admissibles.

Voici donc le deuxième tour:

A = MD5(pwd + SALT) 
B = MD5(A + PWD + SALT) 
KEY + IV = A + B 

signe plus signifie concaténation, Key est de 24 octets et IV est de 8 octets.

J'ai appris ces astuce de Deusty blog où il fait des choses similaires avec AES.