检测JAVA使用AES / GCM不正确的密钥(Detecting incorrect key us

2019-06-27 16:47发布

我使用AES加密/解密的一些文件GCM使用BouncyCastle的模式。
虽然我证明解密错键也没有例外。
我应该如何检查,关键是不正确的?
我的代码是这样的:

    SecretKeySpec   incorrectKey = new SecretKeySpec(keyBytes, "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
    Cipher          cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");
    byte[] block = new byte[1048576];
    int i;

    cipher.init(Cipher.DECRYPT_MODE, incorrectKey, ivSpec);

    BufferedInputStream fis=new BufferedInputStream(new ProgressMonitorInputStream(null,"Decrypting ...",new FileInputStream("file.enc")));
    BufferedOutputStream ro=new BufferedOutputStream(new FileOutputStream("file_org"));        
    CipherOutputStream dcOut = new CipherOutputStream(ro, cipher);

    while ((i = fis.read(block)) != -1) {
        dcOut.write(block, 0, i);
    }

    dcOut.close();
    fis.close();

谢谢

Answer 1:

有没有方法可以检测GCM模式不正确的密钥。 如果认证标签验证,这意味着你用右键你可以检查的。 问题是,如果认证标签不正确,那么这可能表明每个以下(或所有的组合,直至并包括全面替代对密文和认证标记的)的:

  1. 一个不正确的钥匙被使用;
  2. 加密的数据的计数器模式在运输过程中被改变;
  3. 附加认证的数据被改变;
  4. 认证标签本身在运输过程中被改变。

你可以做的就是发送更多数据来识别所使用的密钥。 这可能是一个可读标识符( "encryption-key-1" ),但它也可以是一个KCV,键校验值。 甲KCV通常由与键,或通过该键的密码安全散列加密的零块的(也称为指纹)。 因为加密过零块泄漏信息,你不应该用它来识别加密密钥。

实际上,你可以使用GCM模式的AAD功能在钥匙识别数据来计算认证标签。 请注意,您不能指纹的妥协和使用不正确的密钥进行区分。 这不过不太可能的指纹比四,AAD,密文和认证标签的整个结构意外损坏。



Answer 2:

您正在使用NoPadding 。 更改为PKCS7Padding加密和解密。 如果错了键则使用填充几乎肯定会失败解密预期和InvalidCipherTextException将被抛出。



文章来源: Detecting incorrect key using AES/GCM in JAVA