В течение нескольких лет я запускаю приложение VB.Net, в котором используются функции для шифрования и дешифрования строк. Эти функции с благодарностью взяты из блога WordPress, который больше не доступен.
Проблема сейчас в том, что я делаю новую версию приложения на основе Python, но у нас есть базы данных, полные строк, которые былизашифрованный с использованием старой версии VB.NET, который мне нужно будет иметь возможность расшифровать. Поэтому мне нужны функции Python, которые будут расшифровывать и шифровать, чтобы дать точно одинаковые результаты!
В старом коде отправка strText = "Secret message."
и strEncrKey = "Terribly"
в encryptString()
приведет к этомузашифрованная, дружественная к базе данных строка: dqCMClFoMs3B9AjoFGs+cQ==
(Затем этот процесс можно было бы изменить с помощью decryptString()
)
Я все еще новичок в Python и совершенно новичок во всем, что связано сшифрование или преобразование байтов, поэтому я не знаю, как реплицировать эквивалент функции 'createEncryptor' из кода VB.NET.
Вот мой код Python в его нынешнем виде. Он использует pyDes (import pydes
) вверху кода:
defaultKey = "Terribly"
charset = "utf-8"
data = pyDes.des(defaultKey)
print("pyDes initialised.")
text_to_encode = "Secret message."
encrypted = data.encrypt(text_to_encode.encode(charset))
print("encrypted:", repr(encrypted))
decrypted = data.decrypt(encrypted).decode(charset)
print("decrypted:", repr(decrypted))
, но этот код не запускается.
Так что мой вопрос двоякий:
Почему моя установка Python взрывается с ошибкой exit code -1073740791
на линии data.encrypt
? Я испортил синтаксис?
Можно ли полностью повторить предыдущее шифрование и дешифрование с результатами сопоставления каждый раз, и если да, то как мне это сделать?
Старый код VB.NET, который долгое время не изменялся, выглядит следующим образом:
Public Function stringEncrypt(ByVal strText As String, ByVal strEncrKey As String) As String
' from http://ntcnet.wordpress.com/2007/11/27/encryptdecrypt-string-vbnet/
If strText.Length = 0 Then Return ""
Dim IV() As Byte = {&H12, &H34, &H56, &H78, &H90, &HAB, &HCD, &HEF}
Try
Dim bykey() As Byte = System.Text.Encoding.UTF8.GetBytes(Left(strEncrKey, 8))
Dim InputByteArray() As Byte = System.Text.Encoding.UTF8.GetBytes(strText)
Dim des As New DESCryptoServiceProvider
Dim ms As New MemoryStream
Dim cs As New CryptoStream(ms, des.CreateEncryptor(bykey, IV), CryptoStreamMode.Write)
cs.Write(InputByteArray, 0, InputByteArray.Length)
cs.FlushFinalBlock()
Return Convert.ToBase64String(ms.ToArray())
Catch ex As Exception
Return ex.Message
End Try
End Function
Public Function stringDecrypt(ByVal strText As String, ByVal sDecrKey As String) As String
' from http://ntcnet.wordpress.com/2007/11/27/encryptdecrypt-string-vbnet/
If strText.Length = 0 Then Return ""
Dim IV() As Byte = {&H12, &H34, &H56, &H78, &H90, &HAB, &HCD, &HEF}
Dim inputByteArray(strText.Length) As Byte
Try
Dim byKey() As Byte = System.Text.Encoding.UTF8.GetBytes(Left(sDecrKey, 8))
Dim des As New DESCryptoServiceProvider
inputByteArray = Convert.FromBase64String(strText)
Dim ms As New MemoryStream
Dim cs As New CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write)
cs.Write(inputByteArray, 0, inputByteArray.Length)
cs.FlushFinalBlock()
Dim encoding As System.Text.Encoding = System.Text.Encoding.UTF8
Return encoding.GetString(ms.ToArray())
Catch ex As Exception
Return ex.Message
End Try
End Function