Come viene calcolato il tag di autenticazione in AES-GCM-256

0

Ho un codice di esempio, che crittografa e decodifica una stringa usando AES-GCM-256.

Non riesco a capire come viene generato il tag di autenticazione sul lato del crittografico e come viene utilizzato sul lato del decrypter.

In realtà qui non sto generando un tag di autenticazione né sul lato crittografico né sulla convalida del lato decifratore, quindi viene eseguito internamente dalla libreria stessa.

private static String encrypt(String s, byte[] k) throws Exception {
        SecureRandom r = SecureRandom.getInstance("SHA1PRNG");
        // Generate 128 bit IV for Encryption
        byte[] iv = new byte[12]; r.nextBytes(iv);

        SecretKeySpec eks = new SecretKeySpec(k, "AES");
        Cipher c = Cipher.getInstance("AES/GCM/NoPadding");

        // Generated Authentication Tag should be 128 bits
        c.init(Cipher.ENCRYPT_MODE, eks, new GCMParameterSpec(128, iv));
        byte[] es = c.doFinal(s.getBytes(StandardCharsets.UTF_8));

        // Construct Output as "IV + CIPHERTEXT"
        byte[] os = new byte[12 + es.length];
        System.arraycopy(iv, 0, os, 0, 12);
        System.arraycopy(es, 0, os, 12, es.length);

        // Return a Base64 Encoded String
        return Base64.getEncoder().encodeToString(os);

    }

    private static String decrypt(String eos, byte[] k) throws Exception {
        // Recover our Byte Array by Base64 Decoding
        byte[] os = Base64.getDecoder().decode(eos);

        // Check Minimum Length (IV (12) + TAG (16))
        if (os.length > 28) {
            byte[] iv = Arrays.copyOfRange(os, 0, 12);
            byte[] es = Arrays.copyOfRange(os, 12, os.length);

            // Perform Decryption
            SecretKeySpec dks = new SecretKeySpec(k, "AES");
            Cipher c = Cipher.getInstance("AES/GCM/NoPadding");
            c.init(Cipher.DECRYPT_MODE, dks, new GCMParameterSpec(128, iv));

            // Return our Decrypted String
            return new String(c.doFinal(es), StandardCharsets.UTF_8);
        }
        throw new Exception();
    }
    
posta RE350 25.05.2016 - 07:04
fonte

1 risposta

1

Sì, viene eseguito internamente dal metodo doFinal . In base al Javadoc per Cipher class:

doFinal(byte[] input)

If an AEAD mode such as GCM/CCM is being used, the authentication tag is appended in the case of encryption, or verified in the case of decryption.

Pertanto, non è necessario aggiungere / verificare esplicitamente il tag auth durante il processo di crittografia / decrittografia.

    
risposta data 25.05.2016 - 10:31
fonte

Leggi altre domande sui tag