2009-09-09 5 views
1

Je suis capable de chiffrer un fichier zip en utilisant rijndeal mais quand je déchiffre, j'obtiens une erreur qui dit "La longueur des données à déchiffrer est invalide" Im obtenant le tableau d'octets déchiffrer à partir d'un fichier. Voici comment j'obtiens le tableau d'octets.Rijndael Erreur de déchiffrement - La longueur des données à déchiffrer est invalide

Dim FStream As FileStream = File.OpenRead("<Filepath>") 
EncData = New Byte(FStream.Length) {} 
FStream.Read(EncData, 0, EncData.Length) 
Dim DecryptedBytes As Byte() = DataVault.RijndealController.Decrypt(EncData, Password) 

Une fois que je passe le tableau d'octets dans la méthode Décrypter je reçois l'erreur lorsque je tente de lire le CryptoStream.

Public Function Decrypt(ByVal Input As Byte(), ByVal Password As String) As Byte() 

Try 
    Dim PasswordBytes As Byte() = Encoding.UTF8.GetBytes(Password) 
    Dim initVectorBytes As Byte() = Encoding.ASCII.GetBytes("@0B4c3D4e5Y6r7H2") 
    Dim SaltValue As Byte() = Encoding.UTF8.GetBytes("[email protected]|u<") 


    Dim DerivedBytes As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(PasswordBytes,SaltValue, 4) 
    Dim keyBytes As Byte() = DerivedBytes.GetBytes(32) 

Dim symmetricKey As RijndaelManaged 
symmetricKey = New RijndaelManaged() 
symmetricKey.Mode = CipherMode.CBC 

Dim decryptor As ICryptoTransform 
decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes) 

Dim memoryStream As MemoryStream 
memoryStream = New MemoryStream(Input) 

Dim cryptoStream As CryptoStream 
cryptoStream = New CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read) 

Dim plainTextBytes As Byte() 
ReDim plainTextBytes(Input.Length) 


Dim decryptedByteCount As Integer 
While ((decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length)) > 0) 

End While 

memoryStream.Close() 
cryptoStream.Close() 

Return plainTextBytes 

Catch ex As Exception 
Return Nothing 
End Try 

End Function 

Aucune idée de ce que je fais mal?

Aussi voici le code qu'ils encrypte:

 Public Function EncryptBytes(ByVal Input As Byte(), ByVal Password As String) As Byte() 

     Try 
      Dim PasswordBytes As Byte() = Encoding.UTF8.GetBytes(Password) 
      Dim initVectorBytes As Byte() = Encoding.ASCII.GetBytes("@0B4c3D4e5Y6r7H2") 
      Dim SaltValue As Byte() = Encoding.UTF8.GetBytes("[email protected]|u<") 
      Dim InputStringBytes As Byte() = Input 

      Dim DerivedBytes As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(PasswordBytes, SaltValue, 4) 
      Dim keyBytes As Byte() = DerivedBytes.GetBytes(32) 


      Dim symmetricKey As RijndaelManaged 
      symmetricKey = New RijndaelManaged 
      symmetricKey.Mode = CipherMode.CBC 

      Dim encryptor As ICryptoTransform 
      encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes) 
      Dim MStream As New MemoryStream() 

      Dim cryptoStream As CryptoStream 
      cryptoStream = New CryptoStream(MStream, encryptor, CryptoStreamMode.Write) 
      cryptoStream.Write(InputStringBytes, 0, InputStringBytes.Length) 
      cryptoStream.FlushFinalBlock() 

      Dim cipherBytes As Byte() = MStream.ToArray() 
      MStream.Close() 
      cryptoStream.Close() 

      Return cipherBytes 

     Catch ex As Exception 

     End Try 
     Return Encoding.UTF8.GetBytes("0") 
    End Function 
+0

Voulez-vous dire Rijndael? C'est le nom normal ... –

+0

Pouvez-vous inclure le code qui crypte le fichier zip? – russau

+0

Oui i ment Rijndael – Thomas

Répondre

2

Remplacez votre code de flux de fichiers par System.IO.File.ReadAllBytes, System.IO.File.WriteAllBytes. Si cela fonctionne, vous savez que le flux de fichiers est à l'origine du problème.

+0

Cela a fait l'affaire. Une fois que j'ai utilisé Writeallbytes et readallbytes cela a bien fonctionné. Une idée pourquoi? – Thomas

+0

Est-il possible que vous passiez la mauvaise variable de longueur quelque part? – russau

2

Comment vous enregistrez les données cryptées? L'encodez-vous en utilisant du texte brut (par exemple ASCIi, UTF-8, etc.) ou l'encodez-vous avec quelque chose comme Base-64? Essayez de le chiffrer en un tableau d'octets, puis décryptez-le immédiatement. Si cela fonctionne et qu'il décrypte avec succès, vous avez un problème d'encodage.

+0

Je l'encode dans un tableau d'octets, puis l'écris dans un fichier en utilisant un flux de fichiers. – Thomas

0

Ce fixe il:

Public Function EncryptBytes(ByVal Input As Byte(), ByVal Password As String) As Byte() 

     Try 
      Dim PasswordBytes As Byte() = Encoding.UTF8.GetBytes(Password) 
      Dim initVectorBytes As Byte() = Encoding.ASCII.GetBytes("@0B4c3D4e5Y6r7H2") 
      Dim SaltValue As Byte() = Encoding.UTF8.GetBytes("[email protected]|u<") 
      Dim InputStringBytes As Byte() = Input 

      Dim DerivedBytes As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(PasswordBytes, SaltValue, 4) 
      Dim keyBytes As Byte() = DerivedBytes.GetBytes(32) 

      'Generate Rijndael Manager 
      Dim symmetricKey As RijndaelManaged 
      symmetricKey = New RijndaelManaged 
      symmetricKey.Mode = CipherMode.CBC 

      Dim encryptor As ICryptoTransform 
      encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes) 
      Dim MStream As New MemoryStream() 

      Dim cryptoStream As CryptoStream 
      cryptoStream = New CryptoStream(MStream, encryptor, CryptoStreamMode.Write) 
      cryptoStream.Write(InputStringBytes, 0, InputStringBytes.Length) 
      cryptoStream.FlushFinalBlock() 

      Dim cipherBytes As Byte() = MStream.ToArray() 
      MStream.Close() 
      cryptoStream.Close() 

      Return cipherBytes 

     Catch ex As Exception 

     End Try 
     Return Encoding.UTF8.GetBytes("0") 
    End Function 
+1

Cela a peut-être résolu votre problème, mais un bloc catch vide ne peut en introduire que de nouveaux. –