0

Mornin'、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
4

2 に答える 2

1

PaddingModeをオーバーライドして設定しましたNone。なんで?PaddingModeをPaddingMode.PKCS7変更する正当な理由がなく、ブロック暗号でのパディングを理解していない限り、PaddingModeはデフォルト値のに残します。

于 2010-01-16T12:20:19.913 に答える
0

問題は、復号化ストリームに渡すデータの長さであるように見えます。これからの宣言を変更した場合theBytes

Dim theBytes(memEncStream.Length) As Byte

これに:

Dim theBytes(memEncStream.Length - 1) As Byte

その後、正常に動作します(少なくとも私にとっては正常に動作しました)。私はVBウィザードではありませんが、配列宣言は指定されたサイズより1バイト長いと思います(0からNだと思います)。その余分なバイトが復号化ストリームに渡されると、機能しなくなります。

そして、あなたはすぐにそれを見ると確信していますが、最終的な復号化されたテキストの印刷は完全に正しくありません。theBytesの代わりに印刷していendBytesます。

于 2010-01-16T17:01:44.957 に答える