2015-10-18 1 views
0

Je l'extrait suivant qui décrypte une chaîne cryptée avec 3DES:décryptez un cryptogramme avec TripleDES KEY statique et IV à travers l'outil OpenSSL

private static byte[] KEY_192 = new byte[] 
{ 
    37, 19, 88, 164, 71, 3, 227, 30, 19, 
    174, 45, 84, 23, 253, 149, 108, 12, 
    107, 16, 192, 98, 22, 179, 200 
}; 

private static byte[] IV_192 = new byte[] 
{ 
    47, 108, 239, 71, 33, 98, 177, 13, 
    36, 51, 69, 88, 189, 17, 210, 14, 
    174, 230, 20, 60, 174, 100, 12, 22 
}; 

public static string DecryptTripleDES(string value) 
{ 
    if (!string.IsNullOrEmpty(value)) 
    { 
     System.Security.Cryptography.TripleDESCryptoServiceProvider cryptoProvider = new System.Security.Cryptography.TripleDESCryptoServiceProvider(); 
     byte[] buffer = System.Convert.FromBase64String(value); 
     System.IO.MemoryStream ms = new System.IO.MemoryStream(buffer); 
     System.Security.Cryptography.CryptoStream cs = new System.Security.Cryptography.CryptoStream(ms, cryptoProvider.CreateDecryptor(DataEncryptionEngine.KEY_192, DataEncryptionEngine.IV_192), System.Security.Cryptography.CryptoStreamMode.Read); 
     System.IO.StreamReader sr = new System.IO.StreamReader(cs); 
     return sr.ReadToEnd(); 
    } 
    return null; 
} 

Je suis en train de le reproduire avec OpenSSL ou Ruby, mais sans chance, un exemple de chaîne cryptée base64 codée est:

JDiLOoP3iIY= 

Lorsque j'essaie cela sous Linux, j'obtiens l'erreur suivante.

$ echo JDiLOoP3iIY = | openssl enc -d -des3 -a -K 371988164713227301917445842325314910812107161929822179200 -iv 471082397133981771336516988189172101417423020601741001222; chaîne hexadécimale est trop long invalide valeur hexadécimale iv

Que manque-t-il? Merci!

Edit: Si elle aide, c'est la fonction qui encrypte la chaîne:

public static string EncryptTripleDES(string value) 
{ 
    if (!string.IsNullOrEmpty(value)) 
    { 
     System.Security.Cryptography.TripleDESCryptoServiceProvider cryptoProvider = new System.Security.Cryptography.TripleDESCryptoServiceProvider(); 
     System.IO.MemoryStream ms = new System.IO.MemoryStream(); 
     System.Security.Cryptography.CryptoStream cs = new System.Security.Cryptography.CryptoStream(ms, cryptoProvider.CreateEncryptor(DataEncryptionEngine.KEY_192, DataEncryptionEngine.IV_192), System.Security.Cryptography.CryptoStreamMode.Write); 
     System.IO.StreamWriter sw = new System.IO.StreamWriter(cs); 
     sw.Write(value); 
     sw.Flush(); 
     cs.FlushFinalBlock(); 
     ms.Flush(); 
     return System.Convert.ToBase64String(ms.GetBuffer(), 0, System.Convert.ToInt32(ms.Length)); 
    } 
    return null; 
} 

Essayé ce sur rubis trop, même, je reçois 'mauvais Décrypter'

#!/usr/bin/env ruby 

require 'openssl' 
require 'base64' 

string = 'JDiLOoP3iIY=' 

def decrypt(cpass) 
    cipher = OpenSSL::Cipher::Cipher.new("des-ede-cbc") 
    cipher.decrypt 
    cipher.key = "251358A44703E31E13AE2D5417FD956C0C6B10C06216B3C8" 
    cipher.iv = "2F6CEF472162B10D24334558BD11D20EAEE6143CAE640C16" 
    return cipher.update(Base64.decode64(cpass)) + cipher.final 
end 

decrypted = decrypt(string) 

puts "decrypted string: #{decrypted}" 
+0

3DES a besoin 64 IVs de bits, et non pas 192 IVs bits. – CodesInChaos

+0

Je sais cela, mais voici comment est utilisé dans ce code ... – bsteo

Répondre

2
  1. La taille IV doit correspondre à la taille du bloc, pas à la taille de la clé. Donc 3DES a besoin de IVs 64 bits, pas de IVs 192 bits. Je suppose que votre code existant ignore simplement tout au-delà des 64 premiers bits. Essayez de le tronquer à 64 bits (16 caractères hexadécimaux) dans rubu/OpenSSL.

  2. Vous ne les avez pas convertis correctement en hexadécimal. Les valeurs en C# sont décimales, vous ne pouvez pas simplement les concaténer pour former une chaîne hexadécimale.

    de convertir en hexadécimal Je reçois:

    Key = 25-13-58-A4-47-03-E3-1E-13-AE-2D-54-17-FD-95-6C-0C-6B-10-C0-62-16-B3-C8 
    IV = 2F-6C-EF-47-21-62-B1-0D-24-33-45-58-BD-11-D2-0E-AE-E6-14-3C-AE-64-0C-16 
    

    donc je suppose que vous devez utiliser

    Key = 251358A44703E31E13AE2D5417FD956C0C6B10C06216B3C8 
    IV = 2F6CEF472162B10D 
    
  3. La sortie C# est codé en base64. Je ne vois rien de relatif à Base64 dans ton code de rubis.

  4. Je ne sais pas quel est le remplissage par défaut pour ruby, mais pour C# c'est le remplissage PKCS # 5/PKCS # 7 (ce sont deux noms pour la même chose).

Ce n'est pas sûr. L'utilisation d'un IV statique manque le point d'un IV, qui devrait être différent pour chaque message. Et il manque un MAC, donc il souffre d'attaques actives, y compris des oracles de remplissage. Et enfin, les chiffrements par blocs de 64 bits ne devraient pas chiffrer plus de quelques Go en utilisant une seule clé.

+0

Essayer de concaténer Je reçois mal décrypter: 'echo JDiLOoP3iIY = | openssl enc -d -des3 -a -K 251358A44703E31E13AE2D5417FD956C -iv 2F6CEF472162B10D24334558BD11D20E; ' – bsteo

+0

@bsteo Je ne suis pas familier avec l'outil openssl. Peut-être que c'est un rembourrage différent. C# utilise le remplissage PKCS # 5/PKCS # 7 par défaut. Votre IV est trop longue et votre clé trop courte. – CodesInChaos

+0

oui, et comme je lis sur internet il y a une certaine incompatibilité entre C# 'TripleDESCryptoServiceProvider' et d'autres" outils "comme OpenSSL ou PHP mcrypt. – bsteo

0

Grâce à CodesInChaos, j'ai résolu mon problème.

  1. OpenSSL:

    echo JDiLOoP3iIY= | openssl enc -d -des3 -a -K 251358A44703E31E13AE2D5417FD956C0C6B10C06216B3C8 -iv 2F6CEF472162B10D; 
    

sortie:

  1. Ruby:

    require 'openssl' 
    require 'base64' 
    
    string = 'JDiLOoP3iIY=' 
    
    def decrypt(cpass) 
        cipher = OpenSSL::Cipher::Cipher.new("des3") 
        cipher.decrypt 
        cipher.key = "37,19,88,164,71,3,227,30,19,174,45,84,23,253,149,108,12,107,16,192,98,22,179,200".split(',').map { |x| x.to_i }.pack('c*') 
        cipher.iv = "47,108,239,71,33,98,177,13".split(',').map { |x| x.to_i }.pack('c*') 
        return cipher.update(Base64.decode64(cpass)) + cipher.final 
    end 
    
    decrypted = decrypt(string) 
    
    puts "decrypted string: #{decrypted}" 
    

sortie:

chaîne décryptée: 792