2013-03-25 2 views
1

При попытке дешифрования данных я получаю криптографическое исключение 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 была иной.

+0

Возможный дубликат [CryptographicException: Заполнение недопустимы и не может быть удалено] (http://stackoverflow.com/questions/11762/cryptographicexception-padding-is-invalid-and-cannot-be-removed) – jbtule

+0

Этот код является странно неполный, он никогда не читает из входного файла. Поэтому мы, вероятно, не рассматриваем реальную причину проблемы. –

+0

Исключение для заполнения, вероятно, произойдет при расшифровке, если ваш ключ и iv не соответствуют вашему зашифрованному тексту, в этом случае вы пытаетесь расшифровать массив нулевых байтов длиной вашего зашифрованного текста, таким образом, они не совпадают. – jbtule

ответ

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) 

решить мою проблему.

Спасибо всем!

Смежные вопросы