当前位置: 首页 > 知识库问答 >
问题:

用JAVA中的AES/GCM检测错误密钥

古畅
2023-03-14
    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();

共有1个答案

寿意远
2023-03-14

没有方法可以在GCM模式下检测不正确的密钥。您可以检查身份验证标记是否有效,这意味着您使用的密钥是正确的。问题是,如果身份验证标记不正确,那么这可能指示以下每一项(或所有这些的组合,直到并包括完全替换密文和身份验证标记):

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

您可以做的是发送额外的数据来标识所使用的密钥。这可以是一个可读标识符(“encrypthtml" target="_blank">ion-key-1”),但也可以是KCV,一个密钥检查值。KCV通常包括用密钥加密的零块,或者密钥上的加密安全散列(也称为指纹)。由于零块上的加密会泄漏信息,因此不应使用该信息来标识加密密钥。

 类似资料:
  • 我正在编写android应用程序,使AES加密/解密的文件。我希望能够检测是否指定了不正确的密码,因此不匹配的密钥是为解密派生的。我使用aes/cbc/pkcs7padding和256位密钥。如果我执行cipher.doFinal(),我可以尝试/捕捉BadPaddingException,它会告诉我有些地方出错了,可能是key不正确。但是如果我使用CipherInputStream读取加密文件,

  • 我编写了一个简单的Java AES加密和解密,如下所示(用于学习): 编辑: 我想我搞错了。黑客可能不会使用我的程序来解密。所以对于AES来说,如果一个人解密失败,他会知道解密失败,但不会像我想的那样,从解密中得到错误的字节?这太可怕了...

  • 我在加密过程中尝试了以下选项: 但这会引发以下错误:

  • 节点模块: Java类:主要方法现在只是用于测试,稍后将被删除。

  • 这是一个错误: 1.JS

  • 我有一些AES/GCM加密的数据,想解密它。我希望绕过身份验证对其进行解密,因为数据不包含身份验证信息(数据是由第三方应用程序加密的)。我尝试用javax.crypto包解密,它总是抛出标记不匹配错误。有没有办法绕过这个标记检查,解密数据。数据用AES128加密,使用12字节初始化向量。 编辑:我得到了这个问题的临时解决方案。不确定这是不是正确的方法。