Padding is invalid and cannot be removed
データを復号化しようとすると、暗号化例外が発生します。このエラーについては、ネット上や StackOverflow で多くの質問がありますが、解決策が見つかりませんでした。より具体的には、 を に設定Padding
しNone
たり、 を明示的に定義したりしても、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)で の長さが異なることに気付きました。