Шифрование текста с помощью Security.Cryptography на ironpython

Я пытаюсь заставить работать шифрование в sharpdevelop с помощью IronPython для шифрования текста, но получаю следующую ошибку:

«Указанный ключ не является допустимым размером для этого алгоритма».

Я пробовал использовать все три кодировки, пробовал разный размер ключа, например 128, 256, 1024 и ничего.

Это код, который я использую:

import System.Security.Cryptography
from System.Text import UTF8Encoding, ASCIIEncoding, UnicodeEncoding

self.MD5 = System.Security.Cryptography.MD5CryptoServiceProvider()
self.DES = System.Security.Cryptography.DESCryptoServiceProvider()
self.UTF8Encode = UTF8Encoding()
self.ASCIIEncode = ASCIIEncoding()
self.Unicode = UnicodeEncoding()

def MD5Hash(self, value):
    return self.MD5.ComputeHash(self.Unicode.GetBytes(value))

def Encrypt(self, StringInput, Key):
    self.DES.Key = self.MD5Hash(Key)
    DES.Mode = CipherMode.ECB()
    buffer = self.UTF8Encode.GetBytes(StringInput)
    return System.Convert.ToBase64String(self.DES.CreateEncryptor().TransformFinalBlock(buffer, 0, len(buffer)))

def Button1Click(self, sender, e):
    self._textBox2.Text = self.Encrypt(self._textBox1.Text, 'keys')

person Victor Santiago    schedule 26.09.2015    source источник


Ответы (2)


DES - это не тройной DES. DES - это блочный шифр с размером блока 64 бита и размером ключа 56 бит, обычно представленный как 64 бита, где один бит каждого байта является четностью. Конечно, вам больше не следует использовать DES, вместо этого вы должны использовать AES. DES можно взломать в очень короткие сроки.

На самом деле вам не следует использовать MD5 или ECB. Возможно, вам стоит ознакомиться с вашей криптографией, прежде чем начинать код.

person Maarten Bodewes    schedule 26.09.2015
comment
После вашего совета я смог заставить его работать с помощью AES. Спасибо. - person Victor Santiago; 26.09.2015

Окончательный рабочий код:

import System.Security.Cryptography
from System.Text import ASCIIEncoding

self.AES = System.Security.Cryptography.AesCryptoServiceProvider()
self.ASCIIEncode = ASCIIEncoding()

def Encrypt(self, StringInput, key, salt):
    saltArray = self.ASCIIEncode.GetBytes(salt)
    rfcKey = System.Security.Cryptography.Rfc2898DeriveBytes(key, saltArray, 10000)
    self.AES.Key = rfcKey.GetBytes(self.AES.KeySize / 8)
    self.AES.IV = rfcKey.GetBytes(self.AES.BlockSize /8)
    buffer = self.ASCIIEncode.GetBytes(StringInput)
    return System.Convert.ToBase64String(self.AES.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length))

def Decrypt(self, EncryptedString, key, salt):
    saltArray = self.ASCIIEncode.GetBytes(salt)
    rfcKey = System.Security.Cryptography.Rfc2898DeriveBytes(key, saltArray, 10000)
    self.AES.Key = rfcKey.GetBytes(self.AES.KeySize / 8)
    self.AES.IV = rfcKey.GetBytes(self.AES.BlockSize /8)
    buffer = System.Convert.FromBase64String(EncryptedString)
    return self.ASCIIEncode.GetString(self.AES.CreateDecryptor().TransformFinalBlock(buffer, 0, buffer.Length))
person Victor Santiago    schedule 26.09.2015
comment
Просто совет - вместо использования MD5 для получения необходимых байтов для ключа (что небезопасно) используйте что-нибудь, основанное на PBKDF2. Он предоставляется в .NET как Rfc2898DeriveBytes класс. - person Jeff Hardy; 26.09.2015
comment
Я изменился и теперь использую PBKDF2. Спасибо Джефф Харди - person Victor Santiago; 27.09.2015