Шифрование и дешифрование строк в Python для соответствия старому коду VB.NET - PullRequest
0 голосов
/ 31 октября 2019

В течение нескольких лет я запускаю приложение 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))

, но этот код не запускается.

Так что мой вопрос двоякий:

  1. Почему моя установка Python взрывается с ошибкой exit code -1073740791 на линии data.encrypt? Я испортил синтаксис?

  2. Можно ли полностью повторить предыдущее шифрование и дешифрование с результатами сопоставления каждый раз, и если да, то как мне это сделать?

Старый код 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
...