繁体   English   中英

Bouncy Castle轻量级API中的OCB模式

[英]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[]

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

调用用crypto = true进行加密,使用crypto = false进行解密。 将tagLen设置为AEAD标签的所需长度(以位为单位)(例如tagLen = 128)。 (可选)将广告设置为关联数据以进行验证,或将其留空以跳过。 返回生成的密文或纯文本的适当大小的字节数组。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM