VB.NET 中的 AES 加密字符串

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5987186/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-09 15:30:10  来源:igfitidea点击:

AES Encrypt String in VB.NET

vb.netaes

提问by CodeMouse92

I have a program based in Visual Basic 2010.

我有一个基于 Visual Basic 2010 的程序。

I want to use a custom keyword and AES encryption to generate registration keys on our company website, that will unlock the software regardless of whether or not the software is connected to the internet.

我想使用自定义关键字和 AES 加密在我们公司的网站上生成注册密钥,无论软件是否连接到互联网,这都会解锁软件。

To do this, I want to encrypt certain user information (and a validation code) into an AES encrypted string using a utility I'll build on my website. Then, I want my program to decrypt the string into the user information and validation code, then use that information to validate the registration key.

为此,我想使用将在我的网站上构建的实用程序将某些用户信息(和验证码)加密为 AES 加密字符串。然后,我希望我的程序将字符串解密为用户信息和验证码,然后使用该信息来验证注册密钥。

Which brings me to the question - how do I encrypt and decrypt a string in AES programatically? Is there a code template I can use somewhere, or a built in method?

这让我想到了一个问题 - 如何以编程方式加密和解密 AES 中的字符串?是否有我可以在某处使用的代码模板或内置方法?

回答by Shane Gowland

A quick Google Search brings up the following functions: I've not tested whether the output they produce is correct, however they do appear to compile correctly.

一个快速的谷歌搜索带来了以下功能: 我没有测试它们产生的输出是否正确,但是它们似乎可以正确编译。

Public Function AES_Encrypt(ByVal input As String, ByVal pass As String) As String
        Dim AES As New System.Security.Cryptography.RijndaelManaged
        Dim Hash_AES As New System.Security.Cryptography.MD5CryptoServiceProvider
        Dim encrypted As String = ""
        Try
            Dim hash(31) As Byte
            Dim temp As Byte() = Hash_AES.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(pass))
            Array.Copy(temp, 0, hash, 0, 16)
            Array.Copy(temp, 0, hash, 15, 16)
            AES.Key = hash
            AES.Mode = Security.Cryptography.CipherMode.ECB
            Dim DESEncrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateEncryptor
            Dim Buffer As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(input)
            encrypted = Convert.ToBase64String(DESEncrypter.TransformFinalBlock(Buffer, 0, Buffer.Length))
            Return encrypted
        Catch ex As Exception
        End Try
    End Function

Public Function AES_Decrypt(ByVal input As String, ByVal pass As String) As String
        Dim AES As New System.Security.Cryptography.RijndaelManaged
        Dim Hash_AES As New System.Security.Cryptography.MD5CryptoServiceProvider
        Dim decrypted As String = ""
        Try
            Dim hash(31) As Byte
            Dim temp As Byte() = Hash_AES.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(pass))
            Array.Copy(temp, 0, hash, 0, 16)
            Array.Copy(temp, 0, hash, 15, 16)
            AES.Key = hash
            AES.Mode = Security.Cryptography.CipherMode.ECB
            Dim DESDecrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateDecryptor
            Dim Buffer As Byte() = Convert.FromBase64String(input)
            decrypted = System.Text.ASCIIEncoding.ASCII.GetString(DESDecrypter.TransformFinalBlock(Buffer, 0, Buffer.Length))
            Return decrypted
        Catch ex As Exception
        End Try
    End Function

Sourced from: http://www.l33thackers.com/Thread-VB-NET-AES-Encryption

来源:http://www.l33thackers.com/Thread-VB-NET-AES-Encryption

回答by Ussiane Lepsiq

Edit: Thanks to Artjom B.for notifying me for a mistake in decryption of AES-CBC that occured due to my false assumption that the IV strings always end with == (in Base64) which is wrong. Thanks to Kankyfor bringing this topic up and thanks to Miseryfor offering a solution to it in this link. Note that I didn't check his/her fix myself, but hopefully it is correct.

编辑:感谢Artjom B.通知我解密 AES-CBC 时出错,这是由于我错误地假设 IV 字符串总是以 ==(在 Base64 中)结尾,这是错误的。感谢Kanky提出这个主题,感谢Misery此链接中提供解决方案。请注意,我没有亲自检查他/她的修复,但希望它是正确的。

Below are two solutions for encrypting strings with AES. First one uses CBC mode with an auto-generated IV and is more secure. The use of IV with CBC mode ensures that even the same plaintext-key pairs result in distinct ciphertexts and thus makes it more secure. Second one uses ECB more and shouldn't be used for repetitive plaintext encryption. AES.Key is generated by hashing the input key string with SHA256; so you don't have to worry about pseudorandomness of your key.

以下是使用 AES 加密字符串的两种解决方案。第一个使用 CBC 模式和自动生成的 IV,更安全。将 IV 与 CBC 模式一起使用可确保即使是相同的明文-密钥对也会产生不同的密文,从而使其更加安全。第二个更多地使用ECB,不应该用于重复的明文加密。AES.Key 是通过使用 SHA256 散列输入的密钥字符串生成的;所以你不必担心你的密钥的伪随机性。

This one is AES-CBC. IV is auto-generated by the built-in function and concatenated with the ciphertext and returned as the output of the encryption algorithm. Decryption algorithm splits this concatenated text to recover the IV and the actual ciphertext.

这是AES-CBC。IV 由内置函数自动生成并与密文连接并作为加密算法的输出返回。解密算法拆分此连接文本以恢复 IV 和实际密文。

Private Function AESE(ByVal plaintext As String, ByVal key As String) As String
    Dim AES As New System.Security.Cryptography.RijndaelManaged
    Dim SHA256 As New System.Security.Cryptography.SHA256Cng
    Dim ciphertext As String = ""
    Try
        AES.GenerateIV()
        AES.Key = SHA256.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(key))

        AES.Mode = Security.Cryptography.CipherMode.CBC
        Dim DESEncrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateEncryptor
        Dim Buffer As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(plaintext)
        ciphertext = Convert.ToBase64String(DESEncrypter.TransformFinalBlock(Buffer, 0, Buffer.Length))

       Return Convert.ToBase64String(AES.IV) & Convert.ToBase64String(DESEncrypter.TransformFinalBlock(Buffer, 0, Buffer.Length))

    Catch ex As Exception
        Return ex.Message
    End Try
End Function

Private Function AESD(ByVal ciphertext As String, ByVal key As String) As String
    Dim AES As New System.Security.Cryptography.RijndaelManaged
    Dim SHA256 As New System.Security.Cryptography.SHA256Cng
    Dim plaintext As String = ""
    Dim iv As String = ""
    Try
        Dim ivct = ciphertext.Split({"=="}, StringSplitOptions.None)
        iv = ivct(0) & "=="
        ciphertext = If(ivct.Length = 3, ivct(1) & "==", ivct(1))

        AES.Key = SHA256.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(key))
        AES.IV = Convert.FromBase64String(iv)
        AES.Mode = Security.Cryptography.CipherMode.CBC
        Dim DESDecrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateDecryptor
        Dim Buffer As Byte() = Convert.FromBase64String(ciphertext)
        plaintext = System.Text.ASCIIEncoding.ASCII.GetString(DESDecrypter.TransformFinalBlock(Buffer, 0, Buffer.Length))
        Return plaintext
    Catch ex As Exception
        Return ex.Message
    End Try
End Function

This one below is AES-ECB mode. It doesn't use an IV. The same plaintexts always result in the same ciphertexts (under the same key of course) and vice versa.

下面这个是AES-ECB模式。它不使用 IV。相同的明文总是产生相同的密文(当然在相同的密钥下),反之亦然。

Private Function AESE(ByVal input As Byte(), ByVal key As String) As Byte()
    Dim AES As New System.Security.Cryptography.RijndaelManaged
    Dim SHA256 As New System.Security.Cryptography.SHA256Cng
    Dim ciphertext As String = ""
    Try
        AES.Key = SHA256.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(key))
        AES.Mode = Security.Cryptography.CipherMode.ECB
        Dim DESEncrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateEncryptor
        Dim Buffer As Byte() = input
        Return DESEncrypter.TransformFinalBlock(Buffer, 0, Buffer.Length)
    Catch ex As Exception
    End Try
End Function

Private Function AESD(ByVal input As Byte(), ByVal key As String) As Byte()
    Dim AES As New System.Security.Cryptography.RijndaelManaged
    Dim SHA256 As New System.Security.Cryptography.SHA256Cng
    Try
        AES.Key = SHA256.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(key))
        AES.Mode = Security.Cryptography.CipherMode.ECB
        Dim DESDecrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateDecryptor
        Dim Buffer As Byte() = input
        Return DESDecrypter.TransformFinalBlock(Buffer, 0, Buffer.Length)
    Catch ex As Exception
    End Try
End Function

回答by user3034017

Below are two examples for AES and 3DES encryption. These use byte arrays as the input and output but you can easily modify to handle strings. As a good practice you should always generate the initialization vector (IV) and prepend it to the output file for decrypting. This helps protect your KEY from brute force attacks. It's also better to use CBC rather than EBC for the cipher mode.

以下是 AES 和 3DES 加密的两个示例。这些使用字节数组作为输入和输出,但您可以轻松修改以处理字符串。作为一个好习惯,您应该始终生成初始化向量 (IV) 并将其添加到输出文件以进行解密。这有助于保护您的 KEY 免受暴力攻击。对于密码模式,最好使用 CBC 而不是 EBC。

Imports System.Security.Cryptography
Imports System.Text

Public Class CAes
    '************************************************************************************************
    'Functions for AES Encryption
    '************************************************************************************************
    Public Function AES_Encrypt(ByVal value As Byte(), ByVal key As String) As Byte()
        Dim AES As New RijndaelManaged
        Dim SHA256 As New SHA256Cng
        Dim output() As Byte

        AES.GenerateIV()
        Dim iv() As Byte = AES.IV
        AES.Key = SHA256.ComputeHash(ASCIIEncoding.ASCII.GetBytes(key))

        AES.Mode = CipherMode.CBC
        Dim AESEncrypter As ICryptoTransform = AES.CreateEncryptor
        Dim Buffer As Byte() = value
        output = AESEncrypter.TransformFinalBlock(Buffer, 0, Buffer.Length)

        'Copy the IV as the first 16 bytes of the output then copy encrypted bytes
        Dim ivAndOutput(output.Length - 1 + 16) As Byte
        Array.Copy(iv, ivAndOutput, 16)
        Array.Copy(output, 0, ivAndOutput, 16, output.Length)

        Return ivAndOutput

    End Function

    Public Function AES_Decrypt(ByVal value As Byte(), ByVal key As String) As Byte()
        Dim AES As New RijndaelManaged
        Dim SHA256 As New SHA256Cng
        Dim output() As Byte
        Dim iv(15) As Byte
        Dim Buffer(value.Length - 1 - 16) As Byte

        'Extract first 16 bytes of input stream as IV.  Copy remaining bytes into encrypted buffer
        Array.Copy(value, iv, 16)
        Array.Copy(value, 16, Buffer, 0, value.Length - 16)

        AES.Key = SHA256.ComputeHash(ASCIIEncoding.ASCII.GetBytes(key))
        AES.IV = iv
        AES.Mode = CipherMode.CBC
        Dim AESDecrypter As ICryptoTransform = AES.CreateDecryptor
        output = AESDecrypter.TransformFinalBlock(Buffer, 0, Buffer.Length)
        Return output

    End Function
End Class

Public Class C3Des

    '************************************************************************************************
    'Functions for 3DES Encryption
    '************************************************************************************************
    Public Function DES_Encrypt(ByVal value As Byte(), ByVal key As String) As Byte()
        Dim m As MD5 = New MD5CryptoServiceProvider
        Dim d As TripleDES = New TripleDESCryptoServiceProvider
        Dim encryptBytes() As Byte
        d.Key = m.ComputeHash(Encoding.Unicode.GetBytes(key))
        d.GenerateIV()
        Dim c As ICryptoTransform = d.CreateEncryptor
        Dim input() As Byte = value
        encryptBytes = c.TransformFinalBlock(input, 0, input.Length)
        Dim outBytes(encryptBytes.Length + d.IV.Length - 1) As Byte
        Array.Copy(d.IV, outBytes, d.IV.Length)
        Array.Copy(encryptBytes, 0, outBytes, 8, encryptBytes.Length)
        Return outBytes
    End Function

    Public Function DES_Decrypt(ByVal value As Byte(), ByVal key As String) As Byte()
        Dim m As MD5 = New MD5CryptoServiceProvider
        Dim d As TripleDES = New TripleDESCryptoServiceProvider
        Dim encryptBytes(value.Length - 9), iv(7) As Byte
        Array.Copy(value, 0, iv, 0, 8)
        Array.Copy(value, 8, encryptBytes, 0, value.Length - 8)
        d.Key = m.ComputeHash(Encoding.Unicode.GetBytes(key))
        d.IV = iv
        Dim b As Byte() = encryptBytes
        Dim c As ICryptoTransform = d.CreateDecryptor
        Dim output() As Byte = c.TransformFinalBlock(b, 0, b.Length)
        Return output
    End Function
End Class

回答by Will Pepponi

You can use CBC mode to encrypt files with relative ease. Use uuencode/uudecode to convert a binary file to a text representation and back. See relative info here: http://www.nullskull.com/a/237/uuencode-and-uudecode-in-vbnet-and-c.aspxand here: https://social.msdn.microsoft.com/Forums/vstudio/en-US/5d4eaed8-1984-4639-aebb-bb2afddbfb8a/how-to-uuencodeuudecode-file-in-vbnet?forum=vbgeneral

您可以使用 CBC 模式相对轻松地加密文件。使用 uuencode/uudecode 将二进制文件转换为文本表示并返回。在此处查看相关信息:http: //www.nullskull.com/a/237/uuencode-and-uudecode-in-vbnet-and-c.aspx和此处:https: //social.msdn.microsoft.com/Forums /vstudio/en-US/5d4eaed8-1984-4639-aebb-bb2afddbfb8a/how-to-uuencodeuudecode-file-in-vbnet?forum=vbgeneral