Как я могу использовать интерфейс ICryptoTransform в простом консольном приложении vb.net с одним модулем?

Это скроет вашу консоль. Внесите эти строки в свой код, чтобы сначала скрыть вашу консоль.

import win32gui, win32con

The_program_to_hide = win32gui.GetForegroundWindow()
win32gui.ShowWindow(The_program_to_hide , win32con.SW_HIDE)
0
задан Shodan 13 July 2018 в 22:24
поделиться

1 ответ

Как ответ Visual Vincent, ICryptoTransform не инициализируется с помощью «= new ICryptoTransform ()», но с использованием функции CreateEncryptor объекта алгоритма шифрования, такого как объект RijndaelManaged

Полный код следует, фиксируя выше проблемы использования интерфейса, однако этот код не работает полностью. Функция дешифрования не будет возвращать тот же самый открытый текст, что и в функцию шифрования по неизвестным причинам.

Текущий вывод консоли:

MyConsoleApplication.exe
Encrypting plaintext 'SALUT'
Output is : D9ehMNg+i+5/ZFVakNwSyQ==
Decrypting cyphertext 'D9ehMNg+i+5/ZFVakNwSyQ=='
Output is : NU??
>??,♫?#?4?q?

Код:

Imports System.Data.SqlClient
Imports System.IO
Imports System.Security.Cryptography

Public Module MyApplication
  Public Sub Main()
    Dim KEY_128 As Byte() = {42, 1, 52, 67, 231, 13, 94, 101, 123, 6, 0, 12, 32, 91, 4, 111, 31, 70, 21, 141, 123, 142, 234, 82, 95, 129, 187, 162, 12, 55, 98, 23}
    Dim IV_128 As Byte() = {234, 12, 52, 44, 214, 222, 200, 109, 2, 98, 45, 76, 88, 53, 23, 78}

    dim plaintext as string = "SALUT" 
    dim cyphertext as string, plaintext2 as string

    cyphertext = myEncrypt(plaintext,KEY_128 , IV_128)
    plaintext2 = myDecrypt(cyphertext,KEY_128 , IV_128)

    System.Console.Write("Encrypting plaintext '" & plaintext & "'" & vbcrlf & "Output is : " & cyphertext & vbcrlf)
    System.Console.Write("Decrypting cyphertext '" & cyphertext & "'" & vbcrlf & "Output is : " & plaintext2 & vbcrlf)

  End Sub

  public function myEncrypt(plaintext as string,KEY_128 As Byte(),IV_128 As Byte()) as string

    dim enc As System.Text.UTF8Encoding = new System.Text.UTF8Encoding()
    enc = New System.Text.UTF8Encoding

    Dim symmetricKey As RijndaelManaged = New RijndaelManaged()
    symmetricKey.Mode = CipherMode.CBC

    dim encryptor As ICryptoTransform
    encryptor = symmetricKey.CreateEncryptor(KEY_128, IV_128)

    Dim memoryStream As MemoryStream = New MemoryStream()
    Dim cryptoStream As CryptoStream = New CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)

    cryptoStream.Write(enc.GetBytes(plaintext), 0, plaintext.Length)
    cryptoStream.FlushFinalBlock()
    return Convert.ToBase64String(memoryStream.ToArray())
    memoryStream.Close()
    cryptoStream.Close()

  end function

  public function myDecrypt(cyphertext as string,KEY_128 As Byte(),IV_128 As Byte()) as string
    dim enc As System.Text.UTF8Encoding = new System.Text.UTF8Encoding()
    enc = New System.Text.UTF8Encoding

    Dim symmetricKey As RijndaelManaged = New RijndaelManaged()
    symmetricKey.Mode = CipherMode.CBC

    dim decryptor As ICryptoTransform
    decryptor = symmetricKey.CreateEncryptor(KEY_128, IV_128)

    Dim cypherTextBytes As Byte() = Convert.FromBase64String(cyphertext)
    Dim memoryStream As MemoryStream = New MemoryStream(cypherTextBytes)
    Dim cryptoStream As CryptoStream = New CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)
    Dim plainTextBytes(cypherTextBytes.Length) As Byte
    Dim decryptedByteCount As Integer = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length)
    memoryStream.Close()
    cryptoStream.Close()
    return enc.GetString(plainTextBytes, 0, decryptedByteCount)

  end function

End Module
0
ответ дан Shodan 17 August 2018 в 12:07
поделиться
  • 1
    Есть несколько вещей, чтобы обратить внимание на ... Прежде всего , у вас есть опечатка в вашей функции myDecrypt(): decryptor = symmetricKey.CreateEncryptor(KEY_128, IV_128) - вы должны были вызвать CreateDEcryptor() . Вот почему это не работает; вы снова шифруете его. || Во-вторых, , нет уверенности в том, что enc.GetBytes() вернет то же количество байтов, что и plaintext.Length. Поэтому вы должны поместить результат GetBytes() в массив байтовых переменных (Byte()), а затем проверить его длину . – Visual Vincent 14 July 2018 в 08:31
  • 2
    Наконец, RijndaelManaged, MemoryStream и CryptoStream все реализуют IDisposable. Вы вызываете метод Close() в myEncrypt, но эта часть кода никогда не будет выполняться, потому что функция выходит из Return . Вместо этого вы должны обернуть три из Using блоков в обеих ваших функциях (infact, вы всегда должны использовать блоки Using, когда это возможно, вместо вызова Close() или Dispose()). – Visual Vincent 14 July 2018 в 08:38
  • 3
    Кроме того, в качестве дополнительной заметки: знаете ли вы, что вы можете сократить все Dim variable As Type = New Type() до Dim variable As New Type()? Например, это: Dim symmetricKey As RijndaelManaged = New RijndaelManaged() можно сократить до этого: Dim symmetricKey As New RijndaelManaged(). – Visual Vincent 14 July 2018 в 08:41
  • 4
    благодарю вас за это богатство знаний, я рассмотрю все это, когда я встану завтра, спасибо снова – Shodan 14 July 2018 в 11:51
Другие вопросы по тегам:

Похожие вопросы: