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

EAX中带有JCE-MAC检查的AES/EAX加密失败

薛俊美
2023-03-14

我正在尝试使用AES/EAX/Nopadding执行加密/解密。由于EAX似乎没有BouncyCastle可用,所以BC被添加为提供程序

@NotNull
@Override
public byte[] encrypt(@NotNull Key key, @NotNull byte[] plain, @Nullable byte[] authentication) throws CryptoException {
    try {
        final AesEaxKey aesEaxKey = (AesEaxKey) key;
        final Cipher cipher = Cipher.getInstance(getCipherAlgorithm(), BouncyCastleProvider.PROVIDER_NAME);
        final byte[] cipherText = new byte[getIvSize(aesEaxKey) + plain.length + getTagSize()];
        final byte[] iv = randomIv(aesEaxKey);

        System.arraycopy(iv, 0, cipherText, 0, getIvSize(aesEaxKey));
        cipher.init(Cipher.ENCRYPT_MODE, aesEaxKey, getParameterSpec(iv));

        if (authentication != null && authentication.length != 0) {
            cipher.updateAAD(authentication);
        }

        cipher.doFinal(plain, 0, plain.length, cipherText, getIvSize(aesEaxKey));
        return cipherText;
    } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidAlgorithmParameterException | NoSuchProviderException |
            InvalidKeyException | BadPaddingException | IllegalBlockSizeException | ShortBufferException e) {
        throw new CryptoException(e.getMessage(), e);
    }
}
@NotNull
@Override
public byte[] decrypt(@NotNull Key key, @NotNull byte[] cipherText, @Nullable byte[] authentication) throws CryptoException {
    try {
        final AesEaxKey aesEaxKey = (AesEaxKey) key;
        final Cipher cipher = Cipher.getInstance(getCipherAlgorithm(), BouncyCastleProvider.PROVIDER_NAME);
        cipher.init(Cipher.DECRYPT_MODE, aesEaxKey, getParameterSpec(cipherText, 0, getIvSize(aesEaxKey)));
        if (authentication != null && authentication.length != 0) {
            cipher.updateAAD(authentication);
        }
        return cipher.doFinal(cipherText, getIvSize(aesEaxKey), cipherText.length - getIvSize(aesEaxKey));
    } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | NoSuchProviderException |
            InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException e) {
        throw new CryptoException(e.getMessage(), e);
    }
}
    null

我有一个AES/GCM/nopadding的实现,它使用了同样的代码,工作得很好。

我做错了什么?

共有1个答案

裴欣荣
2023-03-14

EAX等AEAD模式需要更复杂的AlgorithmParameterSpec,因为必须指定nonce(又名IV)和以比特为单位的标记长度。Java从1.7开始就为GCM密码提供了一个GCMParameterSpec。EAX模式需要相同的数据,显然Bouncycastle提供程序也将为EAX模式使用GCMParameterSpec。

注意,对于GCMParameterSpec,标记长度是以位为单位指定的,而为了调整数组的大小,标记长度需要以字节为单位指定。

 类似资料:
  • eax

    ember-app-explorer A CLI tool to explore your Ember.js app folders to make better decisions for yourcode maintainability and modularity. Features View your ember app details like ember-cli version, no

  • 在首次尝试实现AES-GCM的过程中,面临着身份验证标记生成、加密密码生成和GCM mac校验失败的问题。对于当前实现,正在填充,但仍然为空。因此,给出了“”。这似乎是围绕字节数组大小的一些问题,能否有人分享一下,应该在什么基础上确定输出缓冲区大小?这是不是应该分块进行? 任何指向AES-GCM实施的指针/链接都将受到高度赞赏。 以下是我们的实施情况: 它给出以下例外情况: 提前谢谢!!

  • 我对用加密技术开发东西比较陌生。现在,我正在尝试编写一个类,它使用带有AES-GCM的BouncyCastle加密和解密字符串。我读过关于实现加密时必须考虑的事情。其中之一是你应该经常使用随机静脉注射。问题是,每次我尝试用IV初始化密码时,它不会正确解密我的文本。 它只是抛出以下异常: 我正在使用以下方法加密和解密我的数据。 如果我从cipher.init(...)中删除“generateiv(c

  • 加密有三个阶段: 生成16字节随机数据作为CBC模式所需的初始向量(IV) 应用AES密码,使用PKCS5填充方案在CBC模式下加密文件内容。 应用MAC密码(例如“HMACSHA1”)来计算封装IV和密文的MAC 加密文件将是以下数据的级联:16字节IV密文20字节HMAC 我写的代码是这样的,它成功地加密了一个文本文件。这是我的应用程序的全部代码。

  • 我想知道是否有任何指令序列不使用任何其他寄存器来复制RAX的低32位到其高32位。当然,我也希望EAX完好无损。 最好也不使用任何堆栈存储器。

  • 在x86体系结构中,什么可以使用而不能使用?忘记和和。