2010-06-17 6 views
1

i Team,C# exception de cryptage

J'ai le code de cryptage suivant en C#. Je reçois une exception comme Specified initialization vector (IV) does not match the block size for this algorithm.

Pourriez-vous s'il vous plaît me dire quel est le chaînon manquant ici?

//Key and IV for RSA Encryption 
byte[] ketByte = Encoding.UTF8.GetBytes("C3CA193570B26E5C3CBB50FD805A01S2"); 
byte[] IVByte = Encoding.UTF8.GetBytes("C3FG563570FG565C3CBB50FD805A01S2"); 

//Read image 
Image sourceImg = Image.FromFile(@"D:\ImageSource\Cha1.bmp"); 

//Convert to Byte[] 
byte[] byteArray = ImageToByteArray(sourceImg); 

//Encrypt 
byte[] encryptedByteArray = EncryptByte(byteArray, ketByte, IVByte); 



public static byte[] EncryptByte(byte[] palinData, byte[] Key, byte[] theInitializationVector) 
     { 
      System.IO.MemoryStream ms = new System.IO.MemoryStream(); 
      System.Security.Cryptography.Rijndael algorithm = System.Security.Cryptography.Rijndael.Create(); 

      algorithm.Key = Key; 
      algorithm.IV = theInitializationVector; //Exception 

      System.Security.Cryptography.CryptoStream cStream = new System.Security.Cryptography.CryptoStream(ms,algorithm.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write); 

      cStream.Write(palinData, 0, palinData.Length); 
      cStream.Close(); 

      byte[] encryptedData = ms.ToArray(); 
      return encryptedData; 
     } 

Merci

Lijo

+0

duplication possible de [Le vecteur d'initialisation spécifié (IV) ne correspond pas à la taille de bloc pour cet algorithme.] (Http://stackoverflow.com/questions/944833/specified-initialization-vector-iv-does-not-match -le-block-size-for-this-algor) –

Répondre

1

Votre vecteur d'initialisation n'est pas la bonne taille, IVs sont généralement 16 octets.

Essayez de réduire de moitié la taille de votre vecteur:

byte[] IVByte = Encoding.UTF8.GetBytes("C3FG563570FG565C"); 
+0

Vous avez probablement raison, mais il devrait vraiment demander à l'objet ciper pour sa taille de bloc, et en utilisant cela (en code) –

+0

Et encodage UTF-8 ne fait vraiment pas sens ici, pas que je te reproche d'essayer de donner à l'OP une réponse qu'il peut comprendre immédiatement. –

+0

Je n'ai qu'une connaissance limitée du cryptage. Pourriez-vous s'il vous plaît dire pourquoi encodage UTF-8 n'a pas de sens? Et j'ai une question générale.Supposons que je code et crypte comme ceci, sous la moindre chance qu'une seconde personne puisse voir le contenu du fichier (s'il n'a pas la clé)? – Lijo

2

De SymmetricAlgorithm.IV Property documentation:

La taille de la propriété IV doit être la même que la propriété BlockSize.

Et la propriété BlockSize:

Obtient ou définit la taille du bloc, en bits, de l'opération cryptographique.

je ne sais pas combien de bits UTF-8 sous forme codée « C3CA193570B26E5C3CBB50FD805A01S2 » est, mais il est presque certainement pas correct (Savez-vous combien d'octets un caractères UTF-8 prend? Je ne t). Vous ne connaissez pas non plus le blocus du chiffre de Rijendal, et vous ne devriez pas le faire.

Vous devriez certainement utiliser à la place PasswordDeriveBytes:

PasswordDeriveBytes pdb = 
     new PasswordDeriveBytes("C3CA193570B26E5C3CBB50FD805A01S2", null); 

IVByte = pdb.GetBytes(algorithm.BlockSize/8); //divide by 8 for bits to bytes 

Enfin, d'un point de sécurité de vue: alors que le Key est secret, le vecteur (IV) Initialisation est pas. Le IV est généralement public, envoyé avec les données cryptées. En d'autres termes, votre IV ne doit pas être le même que le Clé.

0

Qu'attendez-vous

byte[] ketByte = Encoding.UTF8.GetBytes("C3CA193570B26E5C3CBB50FD805A01S2"); 
byte[] IVByte = Encoding.UTF8.GetBytes("C3FG563570FG565C3CBB50FD805A01S2"); 

font? Parce qu'ils ne chargent pas ces valeurs hexadécimales dans le tableau d'octets. Ils créent un tableau de 32 octets contenant les valeurs ASCII de chaque caractère.