web-dev-qa-db-fra.com

Java à l'aide du cryptage clé symétrique de l'AES 256 et 128

Je suis nouveau dans la technologie des chiffres. J'ai trouvé ce code pour faire un cryptage symétrique.

byte[] key = //... secret sequence of bytes
byte[] dataToSend = ...
Cipher c = Cipher.getInstance("AES");
SecretKeySpec k = new SecretKeySpec(key, "AES");
c.init(Cipher.ENCRYPT_MODE, k);
byte[] encryptedData = c.doFinal(dataToSend);

Ça marche. Ici, je peux utiliser mon propre mot de passe. Et c'est ce dont j'avais besoin exactement. Mais je ne sais pas comment faire 128 ou 256 enctryption symétrique. Comment puis-je utiliser la clé 128 et 256 dans mon code?

12
Bhuban

La réponse pour 128 bits

La méthode suivante consiste à chiffrer une chaîne (valueEnc) avec cryptage AES:

private static final String ALGORITHM = "AES"; 

public String encrypt(final String valueEnc, final String secKey) { 

    String encryptedVal = null;

    try {
        final Key key = generateKeyFromString(secKey);
        final Cipher c = Cipher.getInstance(ALGORITHM);
        c.init(Cipher.ENCRYPT_MODE, key);
        final byte[] encValue = c.doFinal(valueEnc.getBytes());
        encryptedVal = new BASE64Encoder().encode(encValue);
    } catch(Exception ex) {
        System.out.println("The Exception is=" + ex);
    }

    return encryptedVal;
}

La méthode suivante va déchiffrer la chaîne cryptée AES (encryptedVal):

    public String decrypt(final String encryptedValue, final String secretKey) {

    String decryptedValue = null;

    try {

        final Key key = generateKeyFromString(secretKey);
        final Cipher c = Cipher.getInstance(ALGORITHM);
        c.init(Cipher.DECRYPT_MODE, key);
        final byte[] decorVal = new BASE64Decoder().decodeBuffer(encryptedValue);
        final byte[] decValue = c.doFinal(decorVal);
        decryptedValue = new String(decValue);
    } catch(Exception ex) {
        System.out.println("The Exception is=" + ex);
    }

    return decryptedValue;
}

Le secKey est une clé de 128 bits, qui est codée dans le BASE64Encoder. Les BASE64Decoder Dans la méthode suivante génère une clé de 128 bits appropriée

private Key generateKeyFromString(final String secKey) throws Exception {
    final byte[] keyVal = new BASE64Decoder().decodeBuffer(secKey);
    final Key key = new SecretKeySpec(keyVal, ALGORITHM);
    return key;
}
6
Technical

Vous pouvez utiliser un simple objet KeyGenerator comme celui-ci:

KeyGenerator generator = KeyGenerator.getInstance("AES/CTR/PKCS5PADDING");
generator.init(128);
SecretKey key = generator.generateKey();
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
...
3
Gergely Bacso

De - Java's Docs pour Cipher.init(...) :

public Final Void init (int Opmode, clé clé)

Joue: InvalidkeyException - Si la clé donnée est inappropriée pour l'initialisation de ce chiffre ou si ce chiffre est initialisé pour le décryptage et nécessite des paramètres d'algorithme qui ne peuvent pas être déterminés à partir de la clé donnée ou si la touche donnée a une touche qui dépasse le maximum admissible. Keysize (comme déterminé à partir des fichiers de stratégie de juridiction configurés).

Pour moi, cela signifie que, comme l'a dit Martijn Courteaux dans son commentaire, vous devez utiliser une clé de 256 bits (c'est-à-dire initialiser le Secretkeyspec avec une matrice d'octet contenant 32 octets), et le chiffre l'acceptera et l'utilisera, ou l'utilisera ou le rejetera). et jeter une exception si sa taille n'est pas acceptable.

Si vous obtenez une exception, c'est probablement parce que vous n'avez pas installé les fichiers Crypto de force illimitée (l'installation JDK par défaut permet 128 touches de bits telles que documentées dans ce type document de crypto spécifique ). Téléchargez le paquet de crypto de force illimitée ici .

1
JB Nizet
public class CipherUtils
{
    private static byte[] key = {
            0x74, 0x68, 0x69, 0x73, 0x49, 0x73, 0x41, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79
    };//"thisIsASecretKey";

    public static String encrypt(String strToEncrypt)
    {
        try
        {
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            final SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            final String encryptedString = Base64.encodeBase64String(cipher.doFinal(strToEncrypt.getBytes()));
            return encryptedString;
        }
        catch (Exception e)
        {
           e.printStackTrace();
        }
        return null;
    }
}
0
Technical