在VB.Net中进行简单的加密/解密
我试图找出如何在VB.Net中加密/解密字符串.
我按照给出的示例给出了here并编写了以下代码(如下).有一个文本框,一个“加密”按钮和一个“解密”按钮.想法是在文本框中键入内容(“喜欢’hello world’”),单击“加密”,然后在文本框中看到加密版本.单击“解密”应该会将您带回原始字符串. 但是当我尝试加密时,当我尝试“FlushFinalBlock”时出现错误.错误是:“要加密的数据长度无效”. “解密”部分是黑暗中的总镜头,因为上面引用的示例仅涉及加密,而不是解密.我确定这是错的,但由于我无法“加密”工作,我还没有测试过. 谁能告诉我为什么这不起作用? Imports System.Data.SqlClient Imports System.IO Imports System.Security.Cryptography Public Class Form1 Private cryptObj As RijndaelManaged Private KEY_128 As Byte() = {42,1,52,67,231,13,94,101,123,6,12,32,91,4,111,31,70,21,141,142,234,82,95,129,187,162,55,98,23} Private IV_128 As Byte() = {234,44,214,222,200,109,2,45,76,88,53,23,78} Private enc As System.Text.UTF8Encoding = New System.Text.UTF8Encoding() Private Sub btnEncrypt_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles btnEncrypt.Click Dim sPlainText As String = Me.TextBox1.Text If Not String.IsNullOrEmpty(sPlainText) Then Dim bPlainText As Byte() = Me.enc.GetBytes(Me.TextBox1.Text) Dim ms As MemoryStream = New MemoryStream() Dim cs As CryptoStream = New CryptoStream(ms,cryptObj.CreateEncryptor(),CryptoStreamMode.Write) cs.Write(bPlainText,sPlainText.Length) cs.FlushFinalBlock() Me.TextBox1.Text = Me.enc.GetString(ms.ToArray()) End If End Sub Private Sub btnDecrypt_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles btnDecrypt.Click Dim sCipherText = Me.TextBox1.Text Dim ms As MemoryStream = New MemoryStream() Dim cs As CryptoStream = New CryptoStream(ms,cryptObj.CreateDecryptor(),CryptoStreamMode.Read) cs.Read(Me.enc.GetBytes(sCipherText),sCipherText.Length) Me.TextBox1.Text = Me.enc.GetString(ms.ToArray()) End Sub Private Sub Form1_Load(ByVal sender As Object,ByVal e As System.EventArgs) Handles Me.Load Me.cryptObj = New RijndaelManaged() Me.cryptObj.BlockSize = 128 Me.cryptObj.KeySize = 128 Me.cryptObj.Mode = CipherMode.ECB Me.cryptObj.Padding = PaddingMode.None Me.cryptObj.Key = KEY_128 Me.cryptObj.IV = IV_128 End Sub End Class
最终我找到了答案:
http://www.obviex.com/samples/Encryption.aspx 他的例子似乎有点过于复杂.我敢肯定它代表了一个更通用和灵活的情况,但我能够取消“saltPhrase”,“initVector”和“PasswordDeriveBytes”的使用,显然已被弃用了,但我也避免了它被命名为替换:Rfc2898DeriveBytes. 以下内容允许您输入任意长度的字符串,对其进行加密并重新解密. Imports System.Data.SqlClient Imports System.IO Imports System.Security.Cryptography Public Class Form1 Private enc As System.Text.UTF8Encoding Private encryptor As ICryptoTransform Private decryptor As ICryptoTransform Private Sub btnEncrypt_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles btnEncrypt.Click Dim sPlainText As String = Me.TextBox1.Text If Not String.IsNullOrEmpty(sPlainText) Then Dim memoryStream As MemoryStream = New MemoryStream() Dim cryptoStream As CryptoStream = New CryptoStream(memoryStream,Me.encryptor,CryptoStreamMode.Write) cryptoStream.Write(Me.enc.GetBytes(sPlainText),sPlainText.Length) cryptoStream.FlushFinalBlock() Me.TextBox1.Text = Convert.ToBase64String(memoryStream.ToArray()) memoryStream.Close() cryptoStream.Close() End If End Sub Private Sub btnDecrypt_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles btnDecrypt.Click Dim cypherTextBytes As Byte() = Convert.FromBase64String(Me.TextBox1.Text) Dim memoryStream As MemoryStream = New MemoryStream(cypherTextBytes) Dim cryptoStream As CryptoStream = New CryptoStream(memoryStream,Me.decryptor,CryptoStreamMode.Read) Dim plainTextBytes(cypherTextBytes.Length) As Byte Dim decryptedByteCount As Integer = cryptoStream.Read(plainTextBytes,plainTextBytes.Length) memoryStream.Close() cryptoStream.Close() Me.TextBox1.Text = Me.enc.GetString(plainTextBytes,decryptedByteCount) End Sub Private Sub Form1_Load(ByVal sender As Object,ByVal e As System.EventArgs) Handles Me.Load Dim KEY_128 As Byte() = {42,23} Dim IV_128 As Byte() = {234,78} Dim symmetricKey As RijndaelManaged = New RijndaelManaged() symmetricKey.Mode = CipherMode.CBC Me.enc = New System.Text.UTF8Encoding Me.encryptor = symmetricKey.CreateEncryptor(KEY_128,IV_128) Me.decryptor = symmetricKey.CreateDecryptor(KEY_128,IV_128) End Sub End Class (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |