我有一个执行AES-256-OCB的Java应用程序。为此,使用BouncyCastle加密库。按原样,它使用标准的JCA接口,但这需要安装一个特殊的策略文件,以允许密钥大小超过128位。
这在我们的环境中是不合适的,在我看来,我们可以通过使用BouncyCastle自己的轻量级API来避免这种情况。然而,我对这个API感到有点困惑,我很好奇我是如何将密码实例化为AES / OCB / NoPadding。
我通常非常擅长阅读文档,但BouncyCastle相当广泛的选项让我有些困惑。
如何使用BouncyCastle轻量级API为没有填充的256位OCB模式实例化BlockCipher对象,并使用它来加密和解密数据?我已经将密钥,IV和数据作为byte[]
s。
答案 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;
}