1

Padding is invalid and cannot be removedデータを復号化しようとすると、暗号化例外が発生します。このエラーについては、ネット上や StackOverflow で多くの質問がありますが、解決策が見つかりませんでした。より具体的には、 を に設定PaddingNoneたり、 を明示的に定義したりしても、BlockSize効果がないように思われました。

XMLハードドライブに配置された小さなファイルを暗号化および復号化するサブがあります。パラメータとして、サブルーチンはファイルの場所と、暗号化または復号化する必要があるかどうかを受け取ります。コードは次のとおりです。

Private Sub LicenceEncryptOrDecrypt(LizenzDatei As String, EncryptOrDecrypt As String) 

    Dim Rijndael As RijndaelManaged = New RijndaelManaged

    Dim passPhrase As String = "SuperPassword"
    Dim hashAlgorithm As String = "SHA1"
    Dim passwordIterations As Integer = 3
    Dim keySize As Integer = 128

    Dim initVector As String = "16charLongString"
    Rijndael.IV = Encoding.ASCII.GetBytes(initVector)

    Dim saltValue As String = "DoYouWantSomeSalt"
    Dim saltValueBytes As Byte() = Encoding.ASCII.GetBytes(saltValue)

    Dim password As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(passPhrase, saltValueBytes)

    Rijndael.Key = password.GetBytes(keySize / 8)

    Rijndael.Padding = PaddingMode.None


    Dim transform As ICryptoTransform
    Dim tempFile As String


        Select Case EncryptOrDecrypt
            Case "Encrypt"
                transform = Rijndael.CreateEncryptor(Rijndael.Key, Rijndael.IV)
                tempFile = LizenzDatei + ".enc"
            Case "Decrypt"
                transform = Rijndael.CreateDecryptor(Rijndael.Key, Rijndael.IV)
                tempFile = LizenzDatei + ".dec"
            Case Else
                Debug.Print(">< EncryptOrDecrypt: Falshes parameter. Ende Sub.")
                Success = False
        End Select


        Using inFS As FileStream = New FileStream(LizenzDatei, FileMode.Open)
            Dim data() As Byte = New Byte(inFS.Length - 1) {}

            Using outFS As FileStream = New FileStream(tempFile, FileMode.Create)
                Using outStreamEncrypted As CryptoStream = New CryptoStream(outFS, transform, CryptoStreamMode.Write)
                    outStreamEncrypted.Write(data, 0, data.Length)
                    outStreamEncrypted.FlushFinalBlock()
                    outStreamEncrypted.Close()
                End Using
                outFS.Close()
            End Using
            inFS.Close()
        End Using

    File.Delete(LizenzDatei)
    File.Move(tempFile, LizenzDatei)

End Sub

の行でエラーが発生しますoutStreamEncrypted.FlushFinalBlock()data暗号化 (156) と復号化 (160)で の長さが異なることに気付きました。

4

1 に答える 1

0

コメントとRijndael Decryption error-Length of the data to decrypt is invalidという質問に基づいて、エラーが入力に起因することに気付きましたFileStream。入力ファイルは実際には読み取られませんでした。

ラインの交換

Using inFS As FileStream = New FileStream(LizenzDatei, FileMode.Open)
Dim data() As Byte = New Byte(inFS.Length - 1) {}

Dim data() As Byte = System.IO.File.ReadAllBytes(LizenzDatei)

私の問題を解決しました。

みんなありがとう!

于 2013-03-26T08:57:36.137 に答える