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();
没有方法可以在GCM模式下检测不正确的密钥。您可以检查身份验证标记是否有效,这意味着您使用的密钥是正确的。问题是,如果身份验证标记不正确,那么这可能指示以下每一项(或所有这些的组合,直到并包括完全替换密文和身份验证标记):
您可以做的是发送额外的数据来标识所使用的密钥。这可以是一个可读标识符(“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字节初始化向量。 编辑:我得到了这个问题的临时解决方案。不确定这是不是正确的方法。