VB.Net加密函数不使用Base64Encode进行解密

VB.Net加密函数不使用Base64Encode进行解密,vb.net,string,byte,Vb.net,String,Byte,我在解密方面遇到了一个问题,我的目标是能够在加密字符串上使用/不使用base64编码进行加密/解密。到目前为止,我可以使用base64进行加密/解密,也可以不使用base64进行加密,但不能不使用base64进行解密。我得到关于填充不正确的错误 提前谢谢 这是我的加密/解密函数: Public Function DoCryptWork(Type As String, Data As String) As String Dim Pass As String = Hasher.TextBo

我在解密方面遇到了一个问题,我的目标是能够在加密字符串上使用/不使用base64编码进行加密/解密。到目前为止,我可以使用base64进行加密/解密,也可以不使用base64进行加密,但不能不使用base64进行解密。我得到关于填充不正确的错误

提前谢谢

这是我的加密/解密函数:

Public Function DoCryptWork(Type As String, Data As String) As String

    Dim Pass As String = Hasher.TextBoxPassword.Text
    Dim Salt As String = Hasher.TextBoxSalt.Text
    Dim Vect As String = Hasher.TextBoxIntVector.Text

    Select Case Type

        Case "e"

            Try

                Dim PassPhrase As String = Pass
                Dim SaltValue As String = Salt
                Dim HashAlgorithm As String = My.Settings.HashAlgorithm
                Dim PasswordIterations As Integer = 2
                Dim InitVector As String = Vect
                Dim KeySize As Integer = 256
                Dim InitVectorBytes As Byte() = Encoding.ASCII.GetBytes(InitVector)
                Dim SaltValueBytes As Byte() = Encoding.ASCII.GetBytes(SaltValue)
                Dim PlainTextBytes As Byte() = Encoding.UTF8.GetBytes(Data)
                Dim Password As New PasswordDeriveBytes(PassPhrase, SaltValueBytes, HashAlgorithm, PasswordIterations)
                Dim KeyBytes As Byte() = Password.GetBytes(KeySize \ 8)
                Dim SymmetricKey As New RijndaelManaged()

                SymmetricKey.Mode = CipherMode.CBC

                Dim Encryptor As ICryptoTransform = SymmetricKey.CreateEncryptor(KeyBytes, InitVectorBytes)
                Dim MemoryStream As New MemoryStream()
                Dim CryptoStream As New CryptoStream(MemoryStream, Encryptor, CryptoStreamMode.Write)

                CryptoStream.Write(PlainTextBytes, 0, PlainTextBytes.Length)
                CryptoStream.FlushFinalBlock()

                Dim CipherTextBytes As Byte() = MemoryStream.ToArray()

                MemoryStream.Close()
                CryptoStream.Close()

                Dim CipherText As String = Nothing

                If My.Settings.Base64EncodeMD5Hash = True Then

                    CipherText = Convert.ToBase64String(CipherTextBytes)

                    Return CipherText

                Else

                    Dim TextCipher As New StringBuilder()

                    For n As Integer = 0 To CipherTextBytes.Length - 1

                        TextCipher.Append(CipherTextBytes(n).ToString("X2"))

                    Next n

                    CipherText = TextCipher.ToString()

                    Return CipherText

                End If

            Catch ex As Exception

                MsgBox("Encryption was unsuccessfull!", MsgBoxStyle.Critical, "Error")

                Return "Encryption was unsuccessfull!"

            End Try

        Case "d"

            Try

                Dim PassPhrase As String = Pass
                Dim SaltValue As String = Salt
                Dim HashAlgorithm As String = My.Settings.HashAlgorithm
                Dim PasswordIterations As Integer = 2
                Dim InitVector As String = Vect
                Dim KeySize As Integer = 256
                Dim InitVectorBytes As Byte() = Encoding.ASCII.GetBytes(InitVector)
                Dim SaltValueBytes As Byte() = Encoding.ASCII.GetBytes(SaltValue)
                Dim CipherTextBytes As Byte() = Nothing

                If My.Settings.Base64EncodeMD5Hash = True Then

                    CipherTextBytes = Convert.FromBase64String(Data)

                Else

                    Dim bytedata As Byte() = Encoding.UTF8.GetBytes(Data)

                    CipherTextBytes = bytedata

                End If

                Dim Password As New PasswordDeriveBytes(PassPhrase, SaltValueBytes, HashAlgorithm, PasswordIterations)
                Dim KeyBytes As Byte() = Password.GetBytes(KeySize \ 8)
                Dim SymmetricKey As New RijndaelManaged()

                SymmetricKey.Mode = CipherMode.CBC

                Dim Decryptor As ICryptoTransform = SymmetricKey.CreateDecryptor(KeyBytes, InitVectorBytes)
                Dim MemoryStream As New MemoryStream(CipherTextBytes)
                Dim CryptoStream As New CryptoStream(MemoryStream, Decryptor, CryptoStreamMode.Read)
                Dim PlainTextBytes As Byte() = New Byte(CipherTextBytes.Length - 1) {}
                Dim DecryptedByteCount As Integer = CryptoStream.Read(PlainTextBytes, 0, PlainTextBytes.Length)

                MemoryStream.Close()
                CryptoStream.Close()

                Dim PlainText As String = Encoding.UTF8.GetString(PlainTextBytes, 0, DecryptedByteCount)

                Return PlainText

            Catch Ex As Exception

                MsgBox("Decryption was unsuccessfull!" & vbNewLine & vbNewLine & Ex.ToString(), MsgBoxStyle.Critical, "Error")

                Return "Decryption was unsuccessfull!"

            End Try

        Case Else

            Return "Error! Invalid Case Selected  We should never see this but just to be safe we'll show this message if the wrong case is selected!"

    End Select

    Return True

End Function
我这样调用函数:

TextBoxOutput.Text = Encryption.DoCryptWork("e", TextBoxInput.Text) ' encrypt data.
TextBoxOutput.Text = Encryption.DoCryptWork("d", TextBoxInput.Text) ' decrypt data.

将字节转换为十六进制时,每个字节输出两个十六进制数字。当你把十六进制数转换回字节时,你把每一个十六进制数转换成一个字节,而不是每一对十六进制数

实际上,我只是再看一眼,发现你甚至没有保留前面的字节。此循环:

For n As Integer = 0 To Data.Length - 1
    CipherTextBytes = Convert.ToByte(Data(n))
Next n

在每次迭代中设置
CipherTextBytes
,这样每次都要替换上一个字节,所以最后只保留最后一位的字节。

“但是解密失败。”-你能详细说明一下吗?有错误消息吗?--另外,您是否尝试过使用调试器单步执行代码?我得到一个填充无效错误。我正在调试,但到目前为止还没有找到任何东西。谢谢@杰姆西林尼做得很好!你好!我以为我已经成功了,但事实上我没有。我提出了整个功能,以便您能够更好地理解我的最终目标。如果你能再看一眼,那就太棒了!和以前一样的问题。再次感谢你,杰森