接收“输入不是完整的块”;错误,尝试了我在谷歌上能找到的一切。 .NET 中的 Rjindael 加密

发布于 2024-08-18 14:00:16 字数 2496 浏览 5 评论 0原文

早上好,我正在尝试使用 System.Security.Cryptography.RjindaelManaged 进行基本加密。我用谷歌搜索了这个错误,但找不到问题所在,或者我做错了什么。我想做的就是加密一个字符串,然后解密一个字符串。

以下是我的代码,任何帮助将不胜感激。

Imports System.Security.Cryptography
Imports System.Text
Public rj As New RijndaelManaged
    Try
        rj.Padding = PaddingMode.None
        rj.GenerateKey()
        rj.GenerateIV()
        Dim curProvider As New AesCryptoServiceProvider
        Dim curEncryptor As ICryptoTransform
        Dim memEncStream As New MemoryStream
        Dim cryptoEncStream As CryptoStream
        curEncryptor = curProvider.CreateEncryptor(rj.Key, rj.IV)
        cryptoEncStream = New CryptoStream(memEncStream, curEncryptor, CryptoStreamMode.Write)
        Dim startingBytes() As Byte = Encoding.ASCII.GetBytes("This is a test")
        Debug.Print("before length: " & startingBytes.Length)
        Debug.Print("before text: " & Encoding.ASCII.GetString(startingBytes))
        EcryptoEncStream.Write(startingBytes, 0, startingBytes.Length)
        cryptoEncStream.FlushFinalBlock()
        memEncStream.Position = 0
        Dim theBytes(memEncStream.Length) As Byte
        memEncStream.Read(theBytes, 0, memEncStream.Length)
        memEncStream.Flush()
        memEncStream.Close()
        cryptoEncStream.Close()
        Debug.Print("How long? " & theBytes.Length)
        Debug.Print("Data: " & Encoding.ASCII.GetString(theBytes))
        Dim curDecryptor As ICryptoTransform
        curDecryptor = curProvider.CreateDecryptor(rj.Key, rj.IV)
        Dim memDecStream As New MemoryStream
        Dim cryptoDecStream As CryptoStream
        curDecryptor = curProvider.CreateDecryptor(rj.Key, rj.IV)
        cryptoDecStream = New CryptoStream(memDecStream, curDecryptor, CryptoStreamMode.Write)
        Dim endingBytes() As Byte = theBytes
        Debug.Print("before length: " & theBytes.Length)
        Debug.Print("before text: " & Encoding.ASCII.GetString(theBytes))
        cryptoDecStream.Write(theBytes, 0, theBytes.Length)
        cryptoDecStream.FlushFinalBlock()
        memDecStream.Position = 0
        Dim endBytes(memDecStream.Length) As Byte
        memDecStream.Read(theBytes, 0, memDecStream.Length)
        memDecStream.Flush()
        memDecStream.Close()
        cryptoEncStream.Close()
        Debug.Print("How long? " & endBytes.Length)
        Debug.Print("Data: " & Encoding.ASCII.GetString(endBytes))
    Catch ex As Exception
        Debug.Print(ex.ToString)
    End Try

Mornin', I'm trying to just get basic encryption working using System.Security.Cryptography.RjindaelManaged. I have google for this error and cannot find the problem, or what I am doing wrong. All I am attempting to do is encrypt a string, and then decrypt a string.

Following is my code, and any help would be appreciated.

Imports System.Security.Cryptography
Imports System.Text
Public rj As New RijndaelManaged
    Try
        rj.Padding = PaddingMode.None
        rj.GenerateKey()
        rj.GenerateIV()
        Dim curProvider As New AesCryptoServiceProvider
        Dim curEncryptor As ICryptoTransform
        Dim memEncStream As New MemoryStream
        Dim cryptoEncStream As CryptoStream
        curEncryptor = curProvider.CreateEncryptor(rj.Key, rj.IV)
        cryptoEncStream = New CryptoStream(memEncStream, curEncryptor, CryptoStreamMode.Write)
        Dim startingBytes() As Byte = Encoding.ASCII.GetBytes("This is a test")
        Debug.Print("before length: " & startingBytes.Length)
        Debug.Print("before text: " & Encoding.ASCII.GetString(startingBytes))
        EcryptoEncStream.Write(startingBytes, 0, startingBytes.Length)
        cryptoEncStream.FlushFinalBlock()
        memEncStream.Position = 0
        Dim theBytes(memEncStream.Length) As Byte
        memEncStream.Read(theBytes, 0, memEncStream.Length)
        memEncStream.Flush()
        memEncStream.Close()
        cryptoEncStream.Close()
        Debug.Print("How long? " & theBytes.Length)
        Debug.Print("Data: " & Encoding.ASCII.GetString(theBytes))
        Dim curDecryptor As ICryptoTransform
        curDecryptor = curProvider.CreateDecryptor(rj.Key, rj.IV)
        Dim memDecStream As New MemoryStream
        Dim cryptoDecStream As CryptoStream
        curDecryptor = curProvider.CreateDecryptor(rj.Key, rj.IV)
        cryptoDecStream = New CryptoStream(memDecStream, curDecryptor, CryptoStreamMode.Write)
        Dim endingBytes() As Byte = theBytes
        Debug.Print("before length: " & theBytes.Length)
        Debug.Print("before text: " & Encoding.ASCII.GetString(theBytes))
        cryptoDecStream.Write(theBytes, 0, theBytes.Length)
        cryptoDecStream.FlushFinalBlock()
        memDecStream.Position = 0
        Dim endBytes(memDecStream.Length) As Byte
        memDecStream.Read(theBytes, 0, memDecStream.Length)
        memDecStream.Flush()
        memDecStream.Close()
        cryptoEncStream.Close()
        Debug.Print("How long? " & endBytes.Length)
        Debug.Print("Data: " & Encoding.ASCII.GetString(endBytes))
    Catch ex As Exception
        Debug.Print(ex.ToString)
    End Try

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

寒江雪… 2024-08-25 14:00:16

您已覆盖 PaddingMode 并将其设置为 None。为什么?将 PaddingMode 保留为其默认值 PaddingMode.PKCS7,除非您有充分的理由更改它并且您了解分组密码中的填充。

You have overridden the PaddingMode and set it None. Why? Leave the PaddingMode to its default value of PaddingMode.PKCS7 unless you have a good reason to change it and you understand padding in a block cipher.

心安伴我暖 2024-08-25 14:00:16

问题似乎出在您传递给解密流的数据长度。如果您将 theBytes 的声明从: 更改为

Dim theBytes(memEncStream.Length) As Byte

Dim theBytes(memEncStream.Length - 1) As Byte

那么它运行良好(至少对我来说是这样)。我根本不是VB向导,但我认为数组声明比给定大小长一个字节(我认为是0到N)。将额外的字节传递给解密流后,它就不起作用了。

我相信您很快就会看到它,但是您打印的最终解密文本不太正确。它正在打印 theBytes 而不是 endBytes

It appears that the problem is the length of the data that you are passing to the decryption stream. If you change the declaration of theBytes from this:

Dim theBytes(memEncStream.Length) As Byte

To this:

Dim theBytes(memEncStream.Length - 1) As Byte

Then it runs fine (at least it did for me). I'm not a VB wizard at all, but I think the array declaration is one byte longer than the given size (I think it is 0 to N). With that extra byte passed to the decryption stream, it does not work.

And I'm sure you will see it soon enough, but your printing of the final decrypted text is not quite right. It is printing theBytes instead of endBytes.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文