gpt4 book ai didi

java - 使用 BouncyCaSTLe 的 block 密码加密/解密字节数组的最简单方法是什么?

转载 作者:行者123 更新时间:2023-11-29 05:05:33 25 4
gpt4 key购买 nike

如果我有一个 BlockCipher 和一个从包含 secret 消息的 String 得到的 byte[],最简单的方法是什么获取加密消息的 byte[]

在普通的 Java API 中,我可以只执行 cipher.doFinal(secretMessage),但这里似乎没有类似的东西,它只处理 block 。

我知道我可以使用 BufferedBlockCipher,但这仍然没有显着简化事情。使用此密码最简单的高级方法是什么?

最佳答案

好的,那么使用轻量级 API 和计数器模式,这是您将获得的最简单和现代的模式之一:

public class BouncyEncrypt {

private static final int IV_SIZE = 16;

public static void main(String[] args) throws Exception {
// key should really consist of 16 random bytes
byte[] keyData = new byte[256 / Byte.SIZE];
KeyParameter key = new KeyParameter(keyData);

byte[] ciphertext = encryptWithAES_CTR(key, "owlstead");
System.out.println(decryptWithAES_CTR(key, ciphertext));
}

private static byte[] encryptWithAES_CTR(KeyParameter key, String in)
throws IllegalArgumentException, UnsupportedEncodingException,
DataLengthException {
// iv should be unique for each encryption with the same key
byte[] ivData = new byte[IV_SIZE];
SecureRandom rng = new SecureRandom();
rng.nextBytes(ivData);
ParametersWithIV iv = new ParametersWithIV(key, ivData);

SICBlockCipher aesCTR = new SICBlockCipher(new AESFastEngine());

aesCTR.init(true, iv);
byte[] plaintext = in.getBytes("UTF-8");
byte[] ciphertext = new byte[ivData.length + plaintext.length];
System.arraycopy(ivData, 0, ciphertext, 0, IV_SIZE);
aesCTR.processBytes(plaintext, 0, plaintext.length, ciphertext, IV_SIZE);
return ciphertext;
}

private static String decryptWithAES_CTR(KeyParameter key, byte[] ciphertext)
throws IllegalArgumentException, UnsupportedEncodingException,
DataLengthException {
if (ciphertext.length < IV_SIZE) {
throw new IllegalArgumentException("Ciphertext too short to contain IV");
}

ParametersWithIV iv = new ParametersWithIV(key, ciphertext, 0, IV_SIZE);

SICBlockCipher aesCTR = new SICBlockCipher(new AESFastEngine());
aesCTR.init(true, iv);
byte[] plaintext = new byte[ciphertext.length - IV_SIZE];
aesCTR.processBytes(ciphertext, IV_SIZE, plaintext.length, plaintext, 0);
return new String(plaintext, "UTF-8");
}
}

计数器模式不需要padding,完全在线,所以你只需要调用processBytes。对于 CBC 模式,您应该查看 PaddedBufferedBlockCipher。在解密过程中,您仍然会有少量的缓冲区处理:在解密之前,您不知道存在的填充量。

您可以删除 IV 代码和 UTF-8 字符解码 + 异常处理,但您会不安全并且可能不兼容。此代码将 IV 作为密文的前缀。

关于java - 使用 BouncyCaSTLe 的 block 密码加密/解密字节数组的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30511903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com