3

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


    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();

谢谢

4

2 回答 2

4

没有任何方法可以在 GCM 模式下检测到不正确的键。您可以检查的是身份验证标签是否有效,这意味着您使用了正确的密钥。问题是,如果身份验证标签不正确,那么这可能表明以下各项(或所有内容的组合,直至并包括完全替换密文和身份验证标签):

  1. 使用了不正确的密钥;
  2. 计数器模式加密数据在传输过程中被更改;
  3. 额外的认证数据被更改;
  4. 身份验证标签本身在传输过程中被更改。

你可以做的是发送额外的数据来识别使用的密钥。这可以是一个可读的标识符 ( "encryption-key-1"),但它也可以是一个 KCV,一个密钥检查值。KCV 通常由使用密钥加密的零块或密钥上的加密安全哈希(也称为指纹)组成。因为零块上的加密会泄漏信息,所以您不应该使用它来识别加密密钥。

您实际上可以使用 GCM 模式的 AAD 功能来计算密钥标识数据上的身份验证标签。请注意,您无法区分指纹泄露和使用不正确的密钥。然而,与IV、AAD、密文和认证标签的整个结构相比,指纹被意外损坏的可能性较小。

于 2012-09-02T11:51:04.607 回答
-6

您正在使用NoPadding. 将其更改PKCS7Padding为加密和解密。如果使用了错误的密钥,则几乎可以肯定填充将无法按预期解密并且InvalidCipherTextException将被抛出。

于 2012-09-02T10:30:02.630 回答