java - AEADBadTagException : Input too short - need tag. 如何传递标签?

标签 java security exception encryption cryptography

我有一个解密数据的方法:

private byte[] decrypt(byte[] sessionKey, byte[] initialisationVector, byte[] associatedData, byte[] cipherText, byte[] tag) {
    Key secret = new SecretKeySpec(sessionKey, "AES");

    Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
    cipher.init(Cipher.DECRYPT_MODE, secret,
                new GCMParameterSpec((GCM_AUTHENTICATION_TAG_SIZE) * Byte.SIZE, initialisationVector));
    cipher.updateAAD(associatedData);

    return cipher.doFinal(concatByteArrays(cipherText, tag));
}

concatByteArrays 是一个带有 Bytebuffer.allocate.put 方法的简单方法。 UPD:输入 -

    byte[] TEST_AES_KEY = new byte[]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
    int INITIALISATION_VECTOR_LENGTH = 12;
    int GCM_AUTHENTICATION_TAG_SIZE = 16;
    byte[] initialisationVector = Arrays.copyOfRange(receivedPacket, 0, INITIALISATION_VECTOR_LENGTH - 1);
    byte[] tag = Arrays.copyOfRange(receivedPacket, INITIALISATION_VECTOR_LENGTH, INITIALISATION_VECTOR_LENGTH + GCM_AUTHENTICATION_TAG_SIZE - 1);
    byte[] associatedData = Arrays.copyOfRange(receivedPacket, INITIALISATION_VECTOR_LENGTH + GCM_AUTHENTICATION_TAG_SIZE, receivedPacket.length - 1);
    byte[] cipherText = new byte[]{};


byte[] plainText = decrypt(key, initialisationVector, associatedData, cipherText, tag);

但出现错误:

javax.crypto.AEADBadTagException: Input too short - need tag
        at com.sun.crypto.provider.GaloisCounterMode.decryptFinal(GaloisCounterM
ode.java:524)
        at com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:104
8)
        at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:985)
        at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:847)
        at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
        at javax.crypto.Cipher.doFinal(Cipher.java:2164)

我不明白如何传递标签。 我有一个 python 代码,它可以工作:

decryptor = Cipher(algorithms.AES(key), modes.GCM(iv, tag), backend).decryptor()

decryptor.authenticate_additional_data(aad)

return decryptor.update(ciphertext) + decryptor.finalize()

最佳答案

愚蠢的错误。我忘记了 arrays.copyof 中的最后一个参数是独占的,并且从 receivePacket 中获取了错误的字节数组。

    byte[] initialisationVector = Arrays.copyOfRange(receivedPacket, 0, INITIALISATION_VECTOR_LENGTH);
    byte[] tag = Arrays.copyOfRange(receivedPacket, INITIALISATION_VECTOR_LENGTH, INITIALISATION_VECTOR_LENGTH + GCM_AUTHENTICATION_TAG_SIZE);
    byte[] associatedData = Arrays.copyOfRange(receivedPacket, INITIALISATION_VECTOR_LENGTH + GCM_AUTHENTICATION_TAG_SIZE, receivedPacket.length);

关于java - AEADBadTagException : Input too short - need tag. 如何传递标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60263011/

相关文章:

java - java客户端/服务器应用程序没有输出

security - 安全网关 : Limit access to Bluemix app

.net - finally 不在 .NET try-finally block 中执行时的条件

java - 为什么我没有正确捕获这个异常?

Javascript eval() 异常 - 行号

java - Form Action属性错误struts2

java - 静态同步方法与所有代码都在同步块(synchronized block)中的静态方法

java - 如何将自己的证书安装到系统证书存储中?

java - 递归地将节点添加到自定义 TreeMap

php - 如何防止PHP中的SQL注入(inject)?