2017-10-19 23 views
1

J'essaie d'écrire un programme Java simple qui cryptera le texte brut avec AES-256-CBC. Il est classe:AES-256-CBC en Java

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

public class AesCBC { 
    private byte[] key; 
    private byte[] iv; 

    private static final String ALGORITHM="AES"; 

    public AesCBC(byte[] key, byte[] iv) { 
     this.key = key; 
     this.iv = iv; 
    } 

    public byte[] encrypt(byte[] plainText) throws Exception{ 
     SecretKeySpec secretKey=new SecretKeySpec(key,ALGORITHM); 
     IvParameterSpec ivParameterSpec=new IvParameterSpec(iv); 
     Cipher cipher=Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE,secretKey,ivParameterSpec); 
     return cipher.doFinal(plainText); 
    } 

    public byte[] getKey() { 
     return key; 
    } 

    public void setKey(byte[] key) { 
     this.key = key; 
    } 

    public byte[] getIv() { 
     return iv; 
    } 

    public void setIv(byte[] iv) { 
     this.iv = iv; 
    } 
} 

Et il y a l'utilisation possible:

byte[] test="a".getBytes(); 

byte[] key=DatatypeConverter.parseHexBinary("b38b730d4cc721156e3760d1d58546ce697adc939188e4c6a80f0e24e032b9b7"); 
byte[] iv=DatatypeConverter.parseHexBinary("064df9633d9f5dd0b5614843f6b4b059"); 
AesCBC aes=new AesCBC(key,iv); 
try{ 
    String result=DatatypeConverter.printBase64Binary(aes.encrypt(test)); 
    System.out.println(result); 
}catch(Exception e){ 
    e.printStackTrace(); 
} 

Ma sortie est VTUOJJp38Tk+P5ikR4YLfw==, mais quand j'exécute cette commande:

/usr/bin/openssl enc -A -aes-256-cbc -base64 -K "b38b730d4cc721156e3760d1d58546ce697adc939188e4c6a80f0e24e032b9b7" -iv "064df9633d9f5dd0b5614843f6b4b059" <<< "a" 

je reçois quelque chose diffrent que dans Java programme (Y65q9DFdR3k1XcWhA2AO2Q==). Malheureusement je n'ai aucune idée pourquoi les résultats ne sont pas les mêmes puisque j'utilise le même algorithme avec la même clé et iv. Cela signifie-t-il que mon programme Java ne fonctionne pas correctement? Toute aide serait appréciée.

+0

Avez-vous essayé de décrypter la sortie Java en utilisant Java et/ou OpenSSL? Si vous cryptez à nouveau avec OpenSSL, obtenez-vous la même sortie? Selon la page d'aide openssl enc en bas (https://wiki.openssl.org/index.php/Enc), "toutes les options de salage sont également obsolètes". Je crois que si vous utilisez une clé, OpenSSL salera toujours vos résultats. – Jamie

Répondre

3

Les deux méthodes fonctionnent correctement, mais vous cryptez des choses différentes.

La syntaxe de chaîne de caractères (<<<) ajoute un saut de ligne à la chaîne. Ainsi, la sortie Java est le résultat du cryptage "a", et la sortie de la ligne de commande est le résultat du cryptage "a \ n" (c'est-à-dire le caractère a suivi d'une nouvelle ligne).

Essayez ceci de la ligne de commande:

printf "a" | /usr/bin/openssl enc -aes-256-cbc -base64 -K "b38b730d4cc721156e3760d1d58546ce697adc939188e4c6a80f0e24e032b9b7" -iv "064df9633d9f5dd0b5614843f6b4b059" 

le résultat est VTUOJJp38Tk+P5ikR4YLfw==, correspondant à votre résultat Java.

0

Le résultat Java est correct, voir AES CALCULATOR.

Ainsi, le cryptage de la ligne de commande openssl est incorrect, lisez attentivement la page man.

Notez que j'ai ajouté le remplissage PKCS # 7 manuellement aux données d'entrée.
également VTUOJJp38Tk+P5ikR4YLfw== dans l'hexagone est 55350E249A77F1393E3F98A447860B7F