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
AES Encrypt String in VB.NET
提问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