我正在尝试将其他经过身份验证的数据(AAD)添加到Android上的AES-GCM。我看到Cipher notes的Java 7版本关于使用GCMParameterSpec
和updateAAD(...)
方法,但鉴于Android是基于Java 6的,我完全没有想法。我正在使用Spongycastle作为加密库
GCMParameterSpec s = new GCMParameterSpec(...);
cipher.init(..., s);
cipher.updateAAD(...); // AAD
答案 0 :(得分:4)
感谢@andrey - 我发现了一个更完整的样本也构成了BC mailing list
public void testGCM() {
try {
byte iv[] = "123456789012".getBytes();
byte inMsg[] = "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
.getBytes();
byte aad[] = "123456789012123456789012123456789012345678901234567890123456"
.getBytes();
byte key[] = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb".getBytes();
System.out.println("inMsgLen===" + inMsg.length);
// encrypt
AEADParameters parameters = new AEADParameters(
new KeyParameter(key), 128, iv, aad);
GCMBlockCipher gcmEngine = new GCMBlockCipher(new AESFastEngine());
gcmEngine.init(true, parameters);
byte[] encMsg = new byte[gcmEngine.getOutputSize(inMsg.length)];
int encLen = gcmEngine.processBytes(inMsg, 0, inMsg.length, encMsg,
0);
encLen += gcmEngine.doFinal(encMsg, encLen);
System.out.println("encLen===" + encLen);
// decrypt
gcmEngine.init(false, parameters);
byte[] decMsg = new byte[gcmEngine.getOutputSize(encMsg.length)];
int decLen = gcmEngine.processBytes(encMsg, 0, encMsg.length,
decMsg, 0);
decLen += gcmEngine.doFinal(decMsg, decLen);
System.out.println("decLen===" + decLen);
System.out.println("MSG===" + new String(decMsg));
} catch (Exception e) {
e.printStackTrace();
}
}
答案 1 :(得分:2)
来自BC mailing list:
我们这方面的监督似乎意味着JCE提供商没有 目前公开了一种设置AAD的机制(也适用于其他 AEAD密码:CCM,EAX)。
在轻量级API中,AAD通过一个传递给密码(
.init
)AEADParameters
的实例(字段'associatedText')。
使用轻量级API,您还可以通过AEADBlockCipher界面公开的processAADBytes()
方法提供AAD数据。