Comment déchiffrer un fichier en C # qui a été chiffré sur Unix / Solaris en utilisant AES-128

J’ai reçu un fichier chiffré sur une machine Unix Solaris 10 / SunOS 5.10 en utilisant la méthode $ encrypt. Je crois que cela a été fait en utilisant un algorithme aes.

Je dois déchiffrer ce fichier en utilisant C # sur une machine Windows. J’ai reçu une clé symésortingque de 16 octets mais je ne sais pas comment procéder.

Plusieurs exemples de code que j’ai trouvés mentionnent un IV, une taille de bloc, un remplissage, un mode de chiffrement, etc. Je crois que j’ai été fourni avec tout ce dont j’aurais besoin pour décrypter cela sur Unix (bien que je n’aie pas les moyens de le tester) – mais il faut que cela fonctionne sous Windows avec C #.

Les fichiers seront fournis périodiquement (avec la même clé), donc j’ai besoin d’une solution qui fonctionnera de manière continue.

Toute aide serait grandement appréciée.

Merci.

METTRE À JOUR:

Grâce à @Maarten (voir les commentaires), j’ai maintenant une solution de travail:

RijndaelManaged objAlgorithm = new RijndaelManaged(); //set the mode, padding and block size objAlgorithm.Padding = PaddingMode.PKCS7; objAlgorithm.Mode = CipherMode.CBC; objAlgorithm.KeySize = 128; objAlgorithm.BlockSize = 128; byte[] key = File.ReadAllBytes(@"PATH_TO_KEY_FILE"); byte[] inputBytes = File.ReadAllBytes(@"PATH_TO_INPUT"); byte[] format = new byte[4]; byte[] iterations = new byte[4]; byte[] IV = new byte[objAlgorithm.BlockSize / 8]; byte[] salt = new byte[16]; byte[] cipherText = new byte[inputBytes.Length - format.Length - iterations.Length - IV.Length - salt.Length]; // Split the input array Array.Copy(inputBytes, 0, format, 0, format.Length); Array.Copy(inputBytes, format.Length, iterations, 0, iterations.Length); Array.Copy(inputBytes, (format.Length + iterations.Length), IV, 0, IV.Length); Array.Copy(inputBytes, (format.Length + iterations.Length + IV.Length), salt, 0, salt.Length); Array.Copy(inputBytes, (format.Length + iterations.Length + IV.Length + salt.Length), cipherText, 0, cipherText.Length); Byte[] outputBytes = cipherText; ssortingng plaintext = ssortingng.Empty; using (MemoryStream memoryStream = new MemoryStream(outputBytes)) { using (CryptoStream cryptoStream = new CryptoStream(memoryStream, objAlgorithm.CreateDecryptor(key, IV), CryptoStreamMode.Read)) { using (StreamReader srDecrypt = new StreamReader(cryptoStream)) { try { int iReadBytes = cryptoStream.Read(outputBytes, 0, outputBytes.Length); //plaintext = Encoding.UTF8.GetSsortingng(outputBytes,0,outputBytes.Length); byte[] finalBytes = new byte[iReadBytes]; Array.Copy(outputBytes, 0, finalBytes, 0, iReadBytes); File.WriteAllBytes(DirectoryPath + strOriginalFileName.Replace(".out", ".xml"), finalBytes); } catch (Exception ex) { //Handle Error } } } } 

Vous devrez utiliser AES avec le remplissage CBC et le remplissage PKCS # 7, source sur docs.oracle.com/…./encrypt-1.html :

Algorithmes

Les algorithmes pris en charge sont affichés avec leurs tailles de clé minimale et maximale dans l’option -l . Ces algorithmes sont fournis par le cadre cryptographique. Chaque algorithme pris en charge est un alias du mécanisme PKCS # 11, qui est la version la plus couramment utilisée et la moins ressortingctive d’un type d’algorithme particulier. Par exemple, des est un alias de CKM_DES_CBC_PAD et arcfour est un alias de CKM_RC4 . Les variantes d’algorithme sans remplissage ni ECB ne sont pas sockets en charge.

Cela vous indique d’attendre également un remplissage de CBC et PKCS # 7 pour AES.

De plus, vous devez parsingr la structure de texte chiffré qui est sortie par encrypt (elle a été définie comme une interface stable, ce qui signifie qu’elle ne doit pas changer entre les versions d’ encrypt :

Le fichier de sortie de encrypt et le fichier d’entrée pour decrypt contiennent les informations suivantes:

  • Numéro de version du format de sortie, 4 octets dans l’ordre des octets du réseau. La version actuelle est 1.

  • Itérations utilisées dans la fonction de génération de clé, 4 octets dans l’ordre des octets du réseau.

  • IV (ivlen bytes) [1]. Les données iv sont générées par des octets aléatoires égaux à une taille de bloc.

  • Données de sel utilisées dans la génération de clés (16 octets).

  • Chiffrer les données textuelles.

Comme les itérations et le sel ne sont pas requirejs pour le déchiffrement à l’aide d’un fichier de clés, je m’attends à ce qu’ils soient absents ou mis à zéro.

Cela devrait être assez d’informations pour décrypter dans n’importe quel environnement que vous contrôlez.

Tout d’abord, parlez à la personne qui fournit le fichier crypté et obtenez-lui plus de détails.

A défaut, faire des hypothèses et essayer de voir ce qui se passe.

Vous pouvez probablement supposer que l’IV est ajouté au texte de référence. Vous pouvez probablement supposer que le mode CBC a été utilisé ou éventuellement le mode GCM. Supposez le remplissage PKCS7 initialement. Le déchiffrement avec NoPadding vous permettra de voir quel rembourrage a été utilisé si PKCS7 ne fonctionne pas.

Veillez à ne pas utiliser les valeurs par défaut du système car les parameters par défaut de la machine source peuvent être différents des vôtres. Spécifiez explicitement tout, y compris le codage de fin de ligne pour le texte, car Unix diffère de Microsoft. Même de petits détails peuvent interférer avec le déchiffrement.