Bouncy Castle Lightweight API中的OCB模式

时间:2017-11-21 19:45:30

标签: java encryption bouncycastle

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

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

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

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

1 个答案:

答案 0 :(得分:0)

这是我通过BouncyCastle的测试代码阅读的内容。它似乎起作用,虽然我没有将结果与任何测试向量进行比较。

使用encrypt = true进行加密,使用encrypt = false进行解密。将tagLen设置为所需的AEAD标记长度(例如tagLen = 128)。 (可选)将广告设置为关联数据以进行验证,或者将null保留为跳过。返回一个正确大小的结果密文或明文字节数组。

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;
}