VB.Net中的简单加密/解密 [英] simple encrypting / decrypting in VB.Net

查看:215
本文介绍了VB.Net中的简单加密/解密的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图找出如何加密/解密VB.Net中的一个字符串。



我遵循了一个给定的例子:这里,并写下面的代码(如下)。有一个文本框,一个加密按钮和一个解密按钮。这个想法是在文本框中输入一些东西(likehello world),点击加密,看到加密版本出现在文本框中。然后点击解密就可以回到原来的字符串。



但是当我尝试加密时,当我尝试FlushFinalBlock时,我会收到一个错误。错误是:要加密的数据的长度无效。



解密部分是黑暗中的总镜头,如上所述,加密,不解密。我确定这是错误的,但由于我没有得到加密的工作,我还没有测试它。



任何人都可以告诉我为什么这不' t工作?

 导入System.Data.SqlClient 
导入System.IO
导入System.Security。密码学

公共类Form1

私有cryptObj作为RijndaelManaged
私钥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,23}
私人IV_128 As Byte()= {234,12,52,44,214,222,200,109,2,98,45,76,88,53,23,78}
私人enc As System.Text.UTF8Encoding = New System.Text.UTF8Encoding()

Private Sub btnEncrypt_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)处理btnEncrypt.Click
Dim sPlainText As String = Me.TextBox1.Text
如果不是String.IsNullOrEmpty(sPlainText)然后
Dim bPlainText As Byte()= Me.enc.GetBytes(M e.TextBox1.Text)
Dim ms As MemoryStream = New MemoryStream()
Dim cs As CryptoStream = New CryptoStream(ms,cryptObj.CreateEncryptor(),CryptoStreamMode.Write)
cs.Write (bPlainText,0,sPlainText.Length)
cs.FlushFinalBlock()
Me.TextBox1.Text = Me.enc.GetString(ms.ToArray())
如果
End Sub

Private Sub btnDecrypt_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)处理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),0, 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)处理Me.Load
Me.cryptObj =新建RijndaelManaged()
Me.crypt Obj.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

结束类


解决方案

最终我在这里找到答案:



http://www.obviex.com/samples/Encryption.aspx



<他的例子似乎有点过于复杂。我相信它代表了一个更加通用和灵活的情况,但是我能够消除saltPhrase,initVector以及使用PasswordDeriveBytes,这显然是被弃用的,但是我也避免了以下可以让您输入任何长度的字符串,对其进行加密,然后重新解密。


$ p

b $ b

 导入System.Data.SqlClient 
导入System.IO
导入System.Security.Cryptography

公共类Form1

私钥作为System.Text.UTF8Encoding
私有加密器作为ICryptoTransform
私有解密器作为ICryptoTransform

Private Sub btnEncrypt_Click(ByVal sender As System.Object ,ByVal e As System.EventArgs)处理btnEncrypt.Click
Dim sPlainText As String = Me.TextBox1.Text
如果不是String.IsNullOrEmpty(sPlainText)然后
Dim memoryStream As MemoryStream = New MemoryStream ()
Dim cryptoStream As CryptoStream = New CryptoStream(memoryStream,Me.encryptor,CryptoStreamMode.Write)
cryptoStream.Write(Me.enc.GetBytes(sPlainText),0,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)处理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 decryptptedByteCount As Integer = cryptoStream.Read(plainTextBytes,0,plainTextBytes.Length)
memoryStream.Close()
cryptoStream.Clo se()
Me.TextBox1.Text = Me.enc.GetString(plainTextBytes,0,decryptptedByteCount)
End Sub

Private Sub Form1_Load(ByVal sender As Object,ByVal e作为System.EventArgs)处理Me.Load
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 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

结束类


I'm trying to figure out how to encrypt / decrypt a string in VB.Net.

I followed the example given here and wrote the following code (below). There's a text box, an "encrypt" button, and a "decrypt" button. The idea is to type something into the text box ("like 'hello world'"), click "encrypt", and see the encrypted version appear in the text box. Clicking "decrypt" should then take you back to the original string.

But when I try to encrypt I get an error when I try to "FlushFinalBlock". The error is: "Length of the data to encrypt is invalid".

The "decrypt" part is a total shot in the dark, as the example quoted above only deals with encryption, not decryption. I'm sure it's wrong, but since I can't get "encrypt" to work I haven't tested it yet.

Can anyone tell me why this doesn't work?

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, 0, 12, 32, 91, 4, 111, 31, 70, 21, 141, 123, 142, 234, 82, 95, 129, 187, 162, 12, 55, 98, 23}
  Private IV_128 As Byte() = {234, 12, 52, 44, 214, 222, 200, 109, 2, 98, 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, 0, 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), 0, 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

解决方案

Ultimately I found the answer here:

http://www.obviex.com/samples/Encryption.aspx

His example seems a little over-complicated. I'm sure it represents a more general and flexible case, but I was able to do away with the "saltPhrase", the "initVector", and the use of "PasswordDeriveBytes", which apparently is deprecated anyway, but I also avoided its nastily named replacement: Rfc2898DeriveBytes.

The following lets you enter a string of any length, encrypt it, and re-decrypt it.

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), 0, 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, 0, plainTextBytes.Length)
    memoryStream.Close()
    cryptoStream.Close()
    Me.TextBox1.Text = Me.enc.GetString(plainTextBytes, 0, 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, 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 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

这篇关于VB.Net中的简单加密/解密的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆