Encryption

使用 GMAC 進行身份驗證而不加密消息

  • September 28, 2018

我對密碼學很陌生,並且有一個用於 AES 的 GCM 操作模式範例。

PFB 程式碼

   Cipher c = Cipher.getInstance ("AES/GCM/NoPadding");
   final int blockSize = 96;//c.getBlockSize();
   final byte[] ivData = new byte[blockSize];
   System.out.println("IV :- "+new String(ivData) );
   final SecureRandom rnd = SecureRandom.getInstance("SHA1PRNG");
   rnd.nextBytes(ivData);
   System.out.println("IV :- "+new String(ivData) );
   /**
    * 
    */
   GCMParameterSpec params = new GCMParameterSpec(blockSize , ivData);
   SecureRandom sr = new SecureRandom();
   byte[] aesKey = MessageDigest.getInstance("MD5").digest(
           "som3C0o7p@s5".getBytes());
   byte[] ciphertext;
   byte[] head = "Header information".getBytes();
   byte[] data = "Data to encrypt".getBytes();
   sr.nextBytes(aesKey);
   SecretKeySpec sks = new SecretKeySpec(aesKey, "AES");
   c.init(Cipher.ENCRYPT_MODE, sks, params);
   c.updateAAD(head);
   ciphertext = c.doFinal(data);
   System.out.println("done   "+ new String(ciphertext));

   c.init(Cipher.DECRYPT_MODE, sks, params);
   c.updateAAD(head);

   ciphertext = c.doFinal(ciphertext);
   System.out.println("done   "+ new String(ciphertext));

但我需要使用 GMAC 進行身份驗證。如何在不加密/解密的情況下使用 GMAC 進行身份驗證?任何指示或建議都會非常有幫助。

GMAC 是非常簡單的 GCM 模式,其中所有數據都作為 AAD(或其他經過身份驗證的數據)提供,或者如NIST SP 800-38D所說:

如果 GCM 輸入僅限於不加密的數據,則 GCM 的專門化稱為 GMAC,只是對輸入數據的身份驗證模式。

如果您無法訪問直接支持 GMAC 的加密提供程序(例如,Bouncy Castle 提供AES-GMACJCE Mac),您可以AES/GCM通過提供所有數據作為 AAD 和空消息進行加密來簡單地使用任何實現。

例如,將您的範例調整為僅執行 GMAC:

... as for AES/GCM ...
c.updateAAD(head);
c.updateAAD(data);
byte[] mac = c.doFinal();
System.out.println("GMAC: " + SomeHexEncoder.encode(mac));

如果您需要確定自己做對了,可以使用NIST CAVP 頁面中的GCM/GMAC 測試向量(所有帶有 a 的 都是 GMAC 測試向量)。PTlen = 0

引用自:https://crypto.stackexchange.com/questions/18164