2011-05-05 3 views
2

Je ne parviens pas convertir le code de C# à Python. Plus à Martijn's C# Blog est un excellent programme pour crypter/décrypter [ci-joint ci-dessous], mais je ne peux pas l'obtenir pour convertir directement la version python pyDes [exemple ci-dessous]Convert C# décryptage pour Python PyDes

public static string DecryptString(string Message, string Passphrase) 
    { 
     byte[] Results; 
     System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding(); 

     // Step 1. We hash the passphrase using MD5 
     // We use the MD5 hash generator as the result is a 128 bit byte array 
     // which is a valid length for the TripleDES encoder we use below 

     MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider(); 
     byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase)); 

     // Step 2. Create a new TripleDESCryptoServiceProvider object 
     TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider(); 

     // Step 3. Setup the decoder 
     TDESAlgorithm.Key = TDESKey; 
     TDESAlgorithm.Mode = CipherMode.ECB; 
     TDESAlgorithm.Padding = PaddingMode.PKCS7; 

     // Step 4. Convert the input string to a byte[] 
     byte[] DataToDecrypt = Convert.FromBase64String(Message); 

     // Step 5. Attempt to decrypt the string 
     try 
     { 
      ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor(); 
      Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length); 
     } 
     finally 
     { 
      // Clear the TripleDes and Hashprovider services of any sensitive information 
      TDESAlgorithm.Clear(); 
      HashProvider.Clear(); 
     } 

     // Step 6. Return the decrypted string in UTF8 format 
     return UTF8.GetString(Results); 
    } 

de PyDES:

from pyDes import * 


data = "Please encrypt my data" 
k = des("DESCRYPT", ECB, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5) 
d = k.encrypt(data) 
print "Encrypted: %r" % d 
print "Decrypted: %r" % k.decrypt(d) 
assert k.decrypt(d, padmode=PAD_PKCS5) == dat 

J'ai modifié l'original pyDes pour utiliser ECB au lieu de CBC. Aucune des chaînes correspond et je suis à la fin de ma corde. S'il vous plaît aider! Merci

Répondre

8

Indifférent --- figured it out.

Si vous changez cette ligne dans pyDes

print "Encrypted: %r" % d 

à

print "Encrypted: %r" % d.encode('base64') 

alors le code concorde exactement.

Pour comparer, exécutez le code d'origine à partir du site de Martijn: [Sortie]

Message: This world is round, not flat, don't believe them! 
Password: secret 
Encrypted string: pafHnI124lxzCr+93COqxfgOTan8x9oPzX4R/PDYkBnrjufk0/7mesG5tmS2AU 
Pxna3z0jY+7II= 
Decrypted string: This world is round, not flat, don't believe them! 

Et voici le code modifié de pyDes - vous devez rembourrer le mot de passe avec MD5Hash

import md5 
from pyDes import * 

Msg = "This world is round, not flat, don't believe them!" 
Password = "secret" 

m=md5.new() 
m.update(Password) 

k = triple_des(m.digest() , ECB,padmode=PAD_PKCS5) 
d = k.encrypt(Msg) 

print "Encrypted: %r" % d.encode('base64') 
print "Decrypted: %r" % k.decrypt(d) 
assert k.decrypt(d, padmode=PAD_PKCS5) == Msg 

avec la sortie:

Encrypted: 'pafHnI124lxzCr+93COqxfgOTan8x9oPzX4R/PDYkBnrjufk0/7mesG5tmS2AUPxna3z 
0jY+7II=\n' 
Decrypted: "This world is round, not flat, don't believe them!" 

J'espère que cela aide la personne suivante !!!! Merci -D