gpt4 book ai didi

java - 如何对文件进行加密和解密?

转载 作者:搜寻专家 更新时间:2023-10-31 08:08:26 25 4
gpt4 key购买 nike

我在java中使用CipherOutputStream加密和解密文件,但是输入文件> 117字节无法加密。我使用RSA算法公钥长度1024字节。

cipher.init(Cipher.ENCRYPT_MODE, secKey);

String cleartextFile = "cleartext.txt";
String ciphertextFile = "ciphertextSymm.txt";

FileInputStream fis = new FileInputStream(cleartextFile);
FileOutputStream fos = new FileOutputStream(ciphertextFile);
CipherOutputStream cos = new CipherOutputStream(fos, cipher);

byte[] block = new byte[8];
int i;
while ((i = fis.read(block)) != -1) {
cos.write(block, 0, i);
}
cos.close();

如何加密输入文件长度> 117字节?

最佳答案

您不能使用 RSA 加密文件,因为 RSA(更准确地说,RSA 在 Java 中的实现)不允许您加密超过 key 长度的数据。对于 1024 位 key ,您只能加密 1024 位,即 128 字节(实际上由于填充原因少了一点)。

在所有情况下,使用公钥算法(非对称密码学)加密大量数据都是不好的做法,主要原因有两个。

  1. 使用 RSA 加密大量数据并不实用、合适且安全加密模式/填充(即这样做并不真正安全)。

  2. 公钥算法需要一个大 key 才能保证安全(1024 位、2048 位),因此比对称 key 算法(只需要 128 到 256 位 key 才能保证安全)慢得多。

如果您想了解为什么不应该单独使用 RSA 来加密大量数据的更多详细信息,请参阅这两篇很棒的 stacktexchange 帖子:

如果您想加密大量数据,标准的处理方法是生成一个 session key (一个使用一次的加密安全随机数)。您使用公钥加密 session key 。然后使用未加密的 session key 使用对称算法(例如 AES)加密文件(大量数据)。然后将加密的 session key 和加密的数据一起存储在最终文件中。这就是 PGP(或 GnuPG)发送加密邮件时的处理方式。 SSL/TLS 也以类似的方式工作。

最后,正确使用密码学很复杂(几乎任何东西都可能造成安全漏洞:加密模式、填充等...)所以我建议您非常小心并确保您的代码将由精通加密事务的人。

这是一段代码,显示了一般过程:

// 1. Generate a session key
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128)
SecretKey sessionKey = keyGen.generateKey();

// 2. Encrypt the session key with the RSA public key
Cipher rsaCipher = Cipher.getInstance("RSA");
rsaCipher.init(Cipher.ENCRYPT_MODE, rsaPublicKey)
byte[] encryptedSessionKey = rsaCipher.doFinal(sessionKey.getEncoded());

// 3. Encrypt the data using the session key (unencrypted)
Cipher aesCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
aesCipher.init(Cipher.ENCRYPT_MODE, sessionKey); <-- sessionKey is the unencrypted
// session key.
// ... use aesCipher to encrypt your data

// 4. Save the encrypted data along with the encrypted
// session key (encryptedSessionKey).
// PLEASE NOTE THAT BECAUSE OF THE ENCRYPTION MODE (CBC),
// YOU ALSO NEED TO ALSO SAVE THE IV (INITIALIZATION VECTOR).
// aesCipher.aesCipher.getParameters().
// getParametersSpec(IvParameters.class).getIV();

关于java - 如何对文件进行加密和解密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16546959/

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