2016-04-20 1 views
0

Je voudrais mettre en œuvre ce code qui est, le cryptage AES en mode CBC avec une ligne IV, mais il y a ce message d'erreur:cryptage AES en mode CBC avec une ligne IV

mauvaise longueur IV: doit être 16 octets

et le code est:

package implementaes; 

import javax.crypto.Cipher; 
import javax.crypto.KeyGenerator; 
import javax.crypto.SecretKey; 
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.SecretKeySpec; 

public class Aesaesaes 
{ 
    public static void main(String[] args) 
    { 
     try 
     { 
       //Lookup a key generator for the AES cipher 
         KeyGenerator kg = KeyGenerator.getInstance("AES"); 
      SecretKey key = kg.generateKey(); 

      SecretKeySpec keySpec = new 
         SecretKeySpec(key.getEncoded(), "AES");  
       //Lookup an instance of a AES cipher 
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 

       //initialize IV manually 

       byte[] ivBytes = new byte[] {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; 

       //create IvParameterSpecobject 

       IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);  

       //Initialize the cipher using the secter key 

      cipher.init(Cipher.ENCRYPT_MODE, keySpec,ivSpec); 

       String plainText = "This is a secret!"; 



      byte[] cipherText = cipher.doFinal(plainText.getBytes()); 

      System.out.println("Resulting Cipher Text:\n"); 
      for(int i=0;i<cipherText.length;i++) 
      { 
       System.out.print(cipherText[i] + " "); 
      } 
      System.out.println(""); 



     } catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

Comment puis-je le tri? Soit dit en passant, j'ai essayé:

byte[] ivBytes = new byte[] {0x00,0x00,0x00,0x00}; 

pour être 16 octets, mais ne fonctionne pas

Répondre

0

Les ivBytes que vous définissez est actuellement 8 octets:

byte[] ivBytes = new byte[] {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; 

Chaque membre du tableau ivBytes représente un octet. Vous avez besoin d'un tableau de 16 entrées:

byte[] ivBytes = new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 

MISE À JOUR Je pensais qu'il était évident que vous alliez fournir vos propres valeurs à la IV mais il est sans doute la peine de vous indiquer le commentaire de Dave qu'il est dans votre intérêt à ne pas initialiser le IV à tous les zéros. Voir how to pick an IV

+0

ok, merci beaucoup, je pensais que chaque 0X00 est 4 octets .... – nana

+0

Chaque cellule est seulement 8 bits de large. 0x00 est 0, et 0 correspond à ces 8 bits. Le fait que vous ayez choisi de représenter le 0 comme 0x00 dans Java ne changera pas la largeur de chaque cellule du tableau. – Tung

+0

Ou pour les zéros, faites juste '= new byte [16];' - cette forme alloue la taille spécifiée avec tous les éléments zéro (ou null si un tableau d'objets). @Tung Notez que l'utilisation d'une IV constante, y compris les zéros, est souvent non sécurisée en fonction de l'utilisation du cryptage; La raison pour laquelle la IV existe pour Radio-Canada est unique et imprévisible. OTOH vous avez jeté la clé, de sorte que vous l'avez fait aussi dur pour le destinataire légitime que pour l'adversaire. –