При попытке дешифрования данных я получаю криптографическое исключение Padding is invalid and cannot be removed
. В сети много вопросов, а в StackOverflow об этой ошибке, но я не смог найти решение. Более конкретно, настройка Padding
на None
или явно определение BlockSize
, похоже, не помогла.Ошибка заполнения недопустима и не может быть удалена
У меня есть sub, который шифрует и расшифровывает немного файл XML
, размещенный на моем жестком диске. В качестве параметров sub получает местоположение файла и должен ли он шифровать или расшифровывать. Вот код:
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()
. Я отметил, что при шифровании (156) и расшифровке (160) длина data
была иной.
Возможный дубликат [CryptographicException: Заполнение недопустимы и не может быть удалено] (http://stackoverflow.com/questions/11762/cryptographicexception-padding-is-invalid-and-cannot-be-removed) – jbtule
Этот код является странно неполный, он никогда не читает из входного файла. Поэтому мы, вероятно, не рассматриваем реальную причину проблемы. –
Исключение для заполнения, вероятно, произойдет при расшифровке, если ваш ключ и iv не соответствуют вашему зашифрованному тексту, в этом случае вы пытаетесь расшифровать массив нулевых байтов длиной вашего зашифрованного текста, таким образом, они не совпадают. – jbtule