Преобразование C # расшифровки в Python PyDes - PullRequest
3 голосов
/ 05 мая 2011

У меня проблемы с преобразованием кода из C # в Python.В Блог Мартина C # - отличная программа для шифрования / дешифрования [прилагается ниже], но я не могу заставить ее конвертировать напрямую в версию 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 );
    }

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

Я изменил исходные pyDes для использования ECB вместо CBC.Ни одна из струн не совпадает, и я в конце своей веревки.Пожалуйста помоги!Спасибо

1 Ответ

9 голосов
/ 06 мая 2011

Неважно --- разобрался.

Если вы измените эту строку в pyDes

print "Encrypted: %r" % d

на

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

, тогда код точно совпадет.

Для сравнения запуститеОригинальный код с сайта Мартин: [Вывод]

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!

А вот модифицированный код из pyDes - вам нужно дополнить пароль с помощью 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

с выводом:

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

Надеюсь, это поможет следующему человеку !!!!Спасибо -D

...