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;
}
我有一个执行 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;
}