Vecteur d’initialisation DES en C #

J’essaie de déchiffrer (à l’aide de l’algorithme DES) des données provenant d’un tiers en code C #. Il y a beaucoup d’exemples ici et ailleurs qui m’ont aidé. Le problème est que je ne sais pas quoi utiliser pour le “vecteur d’initialisation”.

La tierce partie a fourni un outil à utiliser sur la ligne de commande (DES.EXE, qui, à mon avis, est une version prête à l’emploi de la bibliothèque libdes v4.01) qui nécessite uniquement la fourniture d’une clé de cryptage. Donc, je peux bien décrypter avec l’outil. Cependant, je préférerais ne pas générer de processus pour exécuter l’outil à partir de mon code.

Ma question est de savoir comment générer / trouver ce vecteur d’initialisation. Je suis sûr à 99,9% que cela peut être fait en consultant d’autres publications, mais je ne peux pas le comprendre. J’ai parlé à la troisième partie et ils ont dit qu’ils n’appuyaient pas cette approche. Toute aide serait grandement appréciée.

J’ai passé quelque temps (~ 2 jours) à résoudre le même problème. “Réécriture” des.exe en C #. À la fin, j’ai eu les sources libdes et inversé la logique.

Les vecteurs d’initialisation sont tous des zéros (8). C’est-à-dire que le nouvel octet [8] devrait faire l’affaire.

Cependant, l’astuce peut consister à convertir un mot de passe de chaîne en clé longue de 8 octets. Si vous utilisez le simple DES (pas le sortingple DES), ce code peut faire l’affaire:

public class LibDesPasswordConvertor { public byte[] PasswordToKey(ssortingng password) { if (password == null) throw new ArgumentNullException("password"); if (password == "") throw new ArgumentException("password"); var key = new byte[8]; for (int i = 0; i < password.Length; i++) { var c = (int)password[i]; if ((i % 16) < 8) { key[i % 8] ^= (byte)(c << 1); } else { // reverse bits eg 11010010 -> 01001011 c = (((c << 4) & 0xf0) | ((c >> 4) & 0x0f)); c = (((c << 2) & 0xcc) | ((c >> 2) & 0x33)); c = (((c << 1) & 0xaa) | ((c >> 1) & 0x55)); key[7 - (i % 8)] ^= (byte)c; } } AddOddParity(key); var target = new byte[8]; var passwordBuffer = Encoding.ASCII.GetBytes(password).Concat(new byte[8]).Take(password.Length + (8 - (password.Length % 8)) % 8).ToArray(); var des = DES.Create(); var encryptor = des.CreateEncryptor(key, key); for (int x = 0; x < passwordBuffer.Length / 8; ++x) { encryptor.TransformBlock(passwordBuffer, 8 * x, 8, target, 0); } AddOddParity(target); return target; } private void AddOddParity(byte[] buffer) { for (int i = 0; i < buffer.Length; ++i) { buffer[i] = _oddParityTable[buffer[i]]; } } private static byte[] _oddParityTable = { 1, 1, 2, 2, 4, 4, 7, 7, 8, 8, 11, 11, 13, 13, 14, 14, 16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31, 32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47, 49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62, 64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79, 81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94, 97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110, 112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127, 128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143, 145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158, 161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174, 176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191, 193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206, 208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223, 224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239, 241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254}; } 

(Certaines parties du code libdes ont été réutilisées, même si je devais trouver moi-même la partie "sum de contrôle" du DES).

Le dernier piège est que libdes utilise un mécanisme de remplissage non standard. C'est presque comme l'ISO, mais le dernier octet n'est pas le nombre d'octets ajoutés mais 8 - ce nombre. J'ai défini la propriété Padding sur None et géré moi-même le remplissage.

Voir http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation pour une description des différents modes de fonctionnement utilisés dans les chiffrements par blocs. Vous n’avez pas besoin d’un vecteur d’initialisation (IV) si vous utilisez le mode ECB qui ne fait que chiffrer le message bloc par bloc. Peut-être devrez-vous vérifier dans votre bibliothèque DES le paramétrage du mode ECB / la désactivation des autres.

S’ils n’utilisent pas le mode BCE, vous avez besoin de l’IV, vous ne pouvez pas le “deviner”. Dans la plupart des cas, la perfusion intraveineuse n’a pas à être secrète. Il n’est donc pas difficile de la déplacer.