使用 RSA 在 Java 中加密和解密大型字符串 [已关闭]

2022-09-02 19:52:35

我正在尝试实现 PKI。我想在java中使用RSA加密大字符串,而不使用弹性城堡。我得到的问题是数据不能超过117字节。我尝试寻找失败的解决方案。我是这种加密的新手。请通过举一个大字符串作为示例来帮助我并解释它。


答案 1

不能一次对超过大约 128 个字节使用 RSA 加密解密。您必须拆分数据并在循环中完成,几乎可以将字节写入字符串/数组。如果您唯一的问题是数据的大小,那么您可能没有太多事情要做。只需拆分数据。

一个很好的例子,可能对你来说更完整,处理大于128字节的字符串:http://www.stellarbuild.com/blog/article/encrypting-and-decrypting-large-data-using-java-and-rsa

如果您需要有关 RSA 加密的更多一般说明:

下面的代码演示如何使用密钥对生成器在 Java 中生成 RSA 密钥对:

// Get an instance of the RSA key generator
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
// Generate the keys — might take sometime on slow computers
KeyPair myPair = kpg.generateKeyPair();

这将给你一个 KeyPair 对象,它包含两个密钥:私有密钥和公钥密钥。为了使用这些密钥,您需要创建一个密码对象,该对象将与密封对象结合使用,以加密要通过网络结束的数据。操作方法如下:

// Get an instance of the Cipher for RSA encryption/decryption
Cipher c = Cipher.getInstance("RSA");
// Initiate the Cipher, telling it that it is going to Encrypt, giving it the public key
c.init(Cipher.ENCRYPT_MODE, myPair.getPublic()); 

初始化密码后,我们就可以加密数据了。由于加密后,如果您看到它们“裸露”,则生成的数据将没有多大意义,因此我们必须将它们封装在另一个对象中。Java通过SealedObject类提供了这一点。密封对象是加密对象的容器,它们在密码对象的帮助下加密和解密其内容。

下面的示例演示如何创建和加密密封对象的内容:

// Create a secret message
String myMessage = new String("Secret Message");
// Encrypt that message using a new SealedObject and the Cipher we created before
SealedObject myEncryptedMessage= new SealedObject( myMessage, c);

生成的对象可以通过网络发送,而不必担心,因为它是加密的。唯一可以解密和获取数据的人是持有私钥的人。通常,这应该是服务器。为了解密消息,我们需要重新初始化 Cipher 对象,但这次使用不同的模式,解密并使用私钥而不是公钥。

这是你在Java中执行此操作的方式:

// Get an instance of the Cipher for RSA encryption/decryption
Cipher dec = Cipher.getInstance("RSA");
// Initiate the Cipher, telling it that it is going to Decrypt, giving it the private key
dec.init(Cipher.DECRYPT_MODE, myPair.getPrivate());

现在密码已准备好解密,我们必须告诉密封对象解密保存的数据。

// Tell the SealedObject we created before to decrypt the data and return it
String message = (String) myEncryptedMessage.getObject(dec);
System.out.println("foo = "+message);

使用 getObject 方法时要小心,因为它返回对象的实例(即使它实际上是 String 的实例),而不是加密之前类的实例,因此您必须将其转换为其先前的形式。


答案 2

RSA 不用于批量数据加密。相反,请使用对称密码(如 AES)来加密“大字符串”。然后,使用 RSA 密钥对用于 AES 的对称密钥进行加密。

BouncyCastle支持两种协议:S / MIME和PGP。所有明智的隐私协议都以这种方式使用非对称算法进行密钥传输或密钥交换。

可以使用 RSA 加密的消息大小取决于密钥的模数,减去安全填充消息所需的一些字节。


推荐