Encryption
使用 GMAC 進行身份驗證而不加密消息
我對密碼學很陌生,並且有一個用於 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-GMAC
JCE 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