Bouncy Castle Lightweight 中的 OCB 模式 API

OCB mode in Bouncy Castle Lightweight API

我有一个执行 AES-256-OCB 的 Java 应用程序。为此,使用了 BouncyCastle 加密库。按原样,它使用标准的 JCA 接口,但这需要安装一个特殊的策略文件以允许大于 128 位的密钥大小。

这在我们的环境中是不合适的,在我看来,我们可以通过使用 BouncyCastle 自己的轻量级 API 来避免这种情况。然而,我对这个 API 有点困惑,我很好奇我实际上是如何将密码实例化为 AES/OCB/NoPadding.

我通常很擅长阅读文档,但 BouncyCastle 相当广泛的选项让我有点困惑。

如何使用轻量级的 BouncyCastle API 为 256 位 OCB 模式实例化一个没有填充的 BlockCipher 对象,并使用它来加密和解密数据?我已经得到密钥、IV 和数据 byte[]s.

这是我通过阅读 BouncyCastle 的测试代码得出的结论。它似乎起作用了,尽管我没有将结果与任何测试向量进行比较。

加密调用encrypt=true,解密调用encrypt=false。将 tagLen 设置为所需的 AEAD 标签长度(以位为单位)(例如 tagLen=128)。可选择将广告设置为关联数据以进行验证,或保留 null 以跳过。 Returns 生成的密文或明文的大小合适的字节数组。

protected static byte[] processCipher(boolean encrypt, int tagLen, byte[] keyBytes, byte[] iv, byte[] in, byte[] ad) throws IllegalStateException, InvalidCipherTextException {
    KeyParameter key = new KeyParameter(keyBytes);
    AEADParameters params = new AEADParameters(key, tagLen, iv);
    AEADBlockCipher cipher = new OCBBlockCipher(new AESEngine(), new AESEngine());
    cipher.init(encrypt, params);

    byte[] out = new byte[cipher.getOutputSize(in.length)];
    if(ad != null) cipher.processAADBytes(ad, 0, ad.length);
    int offset = cipher.processBytes(in, 0, in.length, out, 0);
    offset += cipher.doFinal(out, offset);

    return out;
}