2 votes

Cryptage/décryptage AES : explication du château gonflable java ?

Quelqu'un peut-il m'expliquer ce que fait ce programme en soulignant les principaux points ? Je regarde le code et je suis complètement perdu. J'ai juste besoin d'explications sur les phases de cryptage/décryptage. Je pense qu'il génère une clé AES 192 à un moment donné, mais je ne suis pas sûr à 100%. Je ne sais pas non plus à quoi servent les octets/ivOctets.

import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.IvParameterSpec;

public class RandomKey
{
    public static void main(String[] args) throws Exception
    {
    byte[] input = new byte[] { 
                        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 
                        0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
                        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };

    byte[] ivBytes = new byte[] { 
                        0x00, 0x00, 0x00, 0x01, 0x04, 0x05, 0x06, 0x07,
                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };

    //initializing a new initialization vector  
    IvParameterSpec ivSpec  = new IvParameterSpec(ivBytes);
    //what does this actually do?
    Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding", "BC");
    //what does this do?
    KeyGenerator generator = KeyGenerator.getInstance("AES","BC");
    //I assume this generates a key size of 192 bits
    generator.init(192);
    //does this generate a random key?
    Key encryptKey = generator.generateKey();

    System.out.println("input: " +toHex(input));

    //encryption phase
    cipher.init(Cipher.ENCRYPT_MODE, encryptKey, ivSpec);
    //what is this doing?
    byte[] cipherText = new byte[cipher.getOutputSize(input.length)];
    //what is this doing?
    int ctLength = cipher.update(input, 0, input.length, cipherText,0);

    //getting the cipher text length i assume?
    ctLength += cipher.doFinal (cipherText, ctLength );
    System.out.println ("Cipher: " +toHex(cipherText) + " bytes: " + ctLength);

    //decryption phase
    cipher.init(Cipher.DECRYPT_MODE, encryptKey, ivSpec);
    //storing the ciphertext in plaintext i'm assuming?
    byte[] plainText = new byte[cipher.getOutputSize(ctLength)];
    int ptLength = cipher.update(cipherText, 0, ctLength, plainText, 0);
    //getting plaintextLength i think?
    ptLength= cipher.doFinal (plainText, ptLength);
    System.out.println("plain: " + toHex(plainText, ptLength));  

    }

private static String digits = "0123456789abcdef";

public static String toHex(byte[] data, int length)
{
    StringBuffer buf = new StringBuffer();

    for (int i=0; i!= length; i++)
    {
        int v = data[i] & 0xff;

        buf.append(digits.charAt(v >>4));
        buf.append(digits.charAt(v & 0xf));
    }
    return buf.toString();

}

public static String toHex(byte[] data)
{
    return toHex(data, data.length);
}
}

2voto

rossum Points 7191
 //what does this actually do?
 Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding", "BC");

Il utilise le fournisseur Bouncy Castle ("BC") pour obtenir une instance du chiffrement AES, configurée en mode compteur (CTR) et sans remplissage (NoPadding). Voir Wikipedia pour Modes de fonctionnement de Block Cypher y Rembourrage . La Javadoc vous aidera également.

//what does this do?
KeyGenerator generator = KeyGenerator.getInstance("AES","BC");

Encore une fois, ceci utilise le fournisseur Bouncy Castle pour configurer un générateur de clés pour AES. Vous pouvez lire la Javadoc pour en savoir plus.

//what is this doing?
byte[] cipherText = new byte[cipher.getOutputSize(input.length)];

Il met en place un tableau d'octets suffisamment grand pour contenir la sortie chiffrée.

//what is this doing?
int ctLength = cipher.update(input, 0, input.length, cipherText,0);

C'est lui qui fait le chiffrage. Consultez la Javadoc de la fonction update() méthode pour une bonne explication.

//getting the cipher text length i assume?
ctLength += cipher.doFinal (cipherText, ctLength );

Non. Regarde ça += Il est mise à jour de la longueur du texte chiffré. Encore une fois, lisez la Javadoc pour connaître les différences entre l'option update() y doFinal() méthodes.

1voto

Fz3 Points 28

Avez-vous essayé de regarder ici ?

http://docs.oracle.com/javase/6/docs/api/javax/crypto/Cipher.html

http://docs.oracle.com/javase/6/docs/api/javax/crypto/KeyGenerator.html

Le code que vous avez est un exemple de code assez direct de la façon de crypter et de décrypter des données d'octet en Java.

Une fois que vous aurez lu la documentation de la classe, vous pourrez mieux formuler vos questions sur le comportement de ce code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X