AES 256 bits/SRC/PKCS5Padding avec Château Gonflable

J'ai du mal à la cartographie de la JDK suivant la JCE code de cryptage pour les Châteaux pleins d'entrain de la Lumière-poids de l'API:

public String dec(String password, String salt, String encString) throws Throwable {
    //AES algorithm with CBC cipher and PKCS5 padding
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");

    //Construct AES key from salt and 50 iterations 
    PBEKeySpec pbeEKeySpec = new PBEKeySpec(password.toCharArray(), toByte(salt), 50, 256);
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC");
    SecretKeySpec secretKey = new SecretKeySpec(keyFactory.generateSecret(pbeEKeySpec).getEncoded(), "AES");

    //IV seed for first block taken from first 32 bytes
    byte[] ivData = toByte(encString.substring(0, 32));
    //AES encrypted data
    byte[] encData = toByte(encString.substring(32));

    cipher.init( Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec( ivData ) );

    return new String( cipher.doFinal( encData ) );
}

Ci-dessus fonctionne très bien, mais n'est pas très portable en raison de l'Oracle de la restriction sur le niveau de cryptage. J'ai fait plusieurs tentatives de portage pour les Châteaux pleins d'entrain de la Lumière-poids de l'API, mais sans succès.

public String decrypt1(String password, String salt, String encString) throws Exception {

    byte[] ivData = toByte(encString.substring(0, 32));
    byte[] encData = toByte(encString.substring(32));

    PKCS12ParametersGenerator gen = new PKCS12ParametersGenerator(new SHA256Digest());
    gen.init(password.getBytes(), toByte(salt), 50);
    CBCBlockCipher cbcBlockcipher = new CBCBlockCipher(new RijndaelEngine(256));
    CipherParameters params = gen.generateDerivedParameters(256, 256);

    cbcBlockcipher.init(false, params);

    PaddedBufferedBlockCipher aesCipher = new PaddedBufferedBlockCipher(cbcBlockcipher, new PKCS7Padding());
    byte[] plainTemp = new byte[aesCipher.getOutputSize(encData.length)];
    int offset = aesCipher.processBytes(encData, 0, encData.length, plainTemp, 0);
    int last = aesCipher.doFinal(plainTemp, offset);
    byte[] plain = new byte[offset + last];
    System.arraycopy(plainTemp, 0, plain, 0, plain.length);
    return new String(plain);
}

Au-dessus de la tentative de résultats dans un org.bouncycastle.crypto.DataLengthException: dernier bloc incomplet dans le déchiffrement.

J'ai cherché des exemples en ligne, mais il n'y a pas beaucoup d'exemples de fournir vos propres IV de données pour AES 256 bits avec CBC en utilisant PKCS5/PKCS7 comme rembourrage.

NB: Le toByte fonction convertit une Chaîne en un tableau d'octets en utilisant base64 ou similaire.

OriginalL'auteur Casper Bang | 2011-04-12