2010-01-16 8 views
0

Mornin ', j'essaye juste d'obtenir le cryptage de base fonctionnant using System.Security.Cryptography.RjindaelManaged. J'ai google pour cette erreur et ne peux pas trouver le problème, ou ce que je fais mal. Tout ce que je tente de faire est de chiffrer une chaîne, puis décrypter une chaîne.Réception de l'erreur «L'entrée n'est pas un bloc complet», j'ai essayé tout ce que je peux trouver sur google. Chiffrement de Rjindael dans .NET

Voici mon code, et toute aide serait appréciée.

Imports System.Security.Cryptography 
Imports System.Text 
Public rj As New RijndaelManaged 
    Try 
     rj.Padding = PaddingMode.None 
     rj.GenerateKey() 
     rj.GenerateIV() 
     Dim curProvider As New AesCryptoServiceProvider 
     Dim curEncryptor As ICryptoTransform 
     Dim memEncStream As New MemoryStream 
     Dim cryptoEncStream As CryptoStream 
     curEncryptor = curProvider.CreateEncryptor(rj.Key, rj.IV) 
     cryptoEncStream = New CryptoStream(memEncStream, curEncryptor, CryptoStreamMode.Write) 
     Dim startingBytes() As Byte = Encoding.ASCII.GetBytes("This is a test") 
     Debug.Print("before length: " & startingBytes.Length) 
     Debug.Print("before text: " & Encoding.ASCII.GetString(startingBytes)) 
     EcryptoEncStream.Write(startingBytes, 0, startingBytes.Length) 
     cryptoEncStream.FlushFinalBlock() 
     memEncStream.Position = 0 
     Dim theBytes(memEncStream.Length) As Byte 
     memEncStream.Read(theBytes, 0, memEncStream.Length) 
     memEncStream.Flush() 
     memEncStream.Close() 
     cryptoEncStream.Close() 
     Debug.Print("How long? " & theBytes.Length) 
     Debug.Print("Data: " & Encoding.ASCII.GetString(theBytes)) 
     Dim curDecryptor As ICryptoTransform 
     curDecryptor = curProvider.CreateDecryptor(rj.Key, rj.IV) 
     Dim memDecStream As New MemoryStream 
     Dim cryptoDecStream As CryptoStream 
     curDecryptor = curProvider.CreateDecryptor(rj.Key, rj.IV) 
     cryptoDecStream = New CryptoStream(memDecStream, curDecryptor, CryptoStreamMode.Write) 
     Dim endingBytes() As Byte = theBytes 
     Debug.Print("before length: " & theBytes.Length) 
     Debug.Print("before text: " & Encoding.ASCII.GetString(theBytes)) 
     cryptoDecStream.Write(theBytes, 0, theBytes.Length) 
     cryptoDecStream.FlushFinalBlock() 
     memDecStream.Position = 0 
     Dim endBytes(memDecStream.Length) As Byte 
     memDecStream.Read(theBytes, 0, memDecStream.Length) 
     memDecStream.Flush() 
     memDecStream.Close() 
     cryptoEncStream.Close() 
     Debug.Print("How long? " & endBytes.Length) 
     Debug.Print("Data: " & Encoding.ASCII.GetString(endBytes)) 
    Catch ex As Exception 
     Debug.Print(ex.ToString) 
    End Try 
+0

où sont vos utilisations? –

Répondre

0

Il semble que le problème réside dans la longueur des données que vous transmettez au flux de déchiffrement. Si vous modifiez la déclaration de theBytes de ceci:

Dim theBytes(memEncStream.Length) As Byte 

à ceci:

Dim theBytes(memEncStream.Length - 1) As Byte 

Ensuite, il fonctionne très bien (au moins il l'a fait pour moi). Je ne suis pas du tout un expert VB, mais je pense que la déclaration du tableau est un octet plus long que la taille donnée (je pense que c'est 0 à N). Avec cet octet supplémentaire passé au flux de décryptage, cela ne fonctionne pas.

Et je suis sûr que vous le verrez assez tôt, mais votre impression du texte décrypté final n'est pas tout à fait raison. Il imprime theBytes au lieu de endBytes.

1

Vous avez remplacé le mode de remplissage et défini None. Pourquoi? Laissez le PaddingMode à sa valeur par défaut de PaddingMode.PKCS7 sauf si vous avez une bonne raison de le changer et vous comprenez le remplissage dans un chiffrement de bloc.