Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用RSA加密和解密java中的大字符串_Java_Encryption_Rsa - Fatal编程技术网

使用RSA加密和解密java中的大字符串

使用RSA加密和解密java中的大字符串,java,encryption,rsa,Java,Encryption,Rsa,我正在尝试实现PKI。我希望在java中使用RSA加密大字符串,而不使用bouncy castle。我得到的问题是数据不能超过117字节。我试图寻找我失败的解决办法。我是这方面的新手。请以一个大字符串为例帮助我,并对其进行解释。一次使用RSA加密解密的字节数不能超过128字节。您必须拆分数据并在循环中执行,就像在运行时将字节写入字符串/数组一样。如果您唯一的问题是数据的大小,那么您可能没有更多的东西要做。只是分割数据 处理大于128字节的字符串的一个很好的示例,对您来说可能更完整: 如果您需要更

我正在尝试实现PKI。我希望在java中使用RSA加密大字符串,而不使用bouncy castle。我得到的问题是数据不能超过117字节。我试图寻找我失败的解决办法。我是这方面的新手。请以一个大字符串为例帮助我,并对其进行解释。

一次使用RSA加密解密的字节数不能超过128字节。您必须拆分数据并在循环中执行,就像在运行时将字节写入字符串/数组一样。如果您唯一的问题是数据的大小,那么您可能没有更多的东西要做。只是分割数据

处理大于128字节的字符串的一个很好的示例,对您来说可能更完整:

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

以下代码演示如何使用KeyPairGenerator在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对象,该对象包含两个密钥:private和public。为了使用这些密钥,您需要创建一个密码对象,该对象将与SealeObject结合使用,以加密将通过网络结束的数据。以下是您如何做到这一点:

// 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通过SealeObject类提供了这一点。SealedObjects是用于加密对象的容器,通过密码对象对其内容进行加密和解密

以下示例显示如何创建和加密SealeObject的内容:

// 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());
现在密码已经准备好解密,我们必须告诉SealeObject对保存的数据进行解密

// 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的实例),而不是加密之前的类的实例,因此必须将其转换为以前的形式


以上内容来自:

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

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


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

安全性,尤其是密码学,是很难做到的。您应该使用现有的高级包,而不是原始的加密API,或者了解它们如何工作的细节。否则,您可能会编写不安全的代码。请发布您的代码。我们可以从那里开始工作。不要直接用RSA加密数据。生成随机AES密钥,用AES加密数据,使用RSA.RSA的AES密钥仅用于加密小数据和用于加密数据的密钥?像这样的混合加密是最好的选择。代码示例或相关API的链接不会有什么坏处。对于StackOverflow答案来说足够简单的示例将被盲目复制和使用,而不了解其周围的所有问题需要获得真正的安全。公钥消息加密最好使用一个广泛使用且维护良好的库来实现。链接已失效。我选择将消息拆分为100字节的部分,我是否做了一个坏主意?最多,将消息拆分为块并尝试像分组密码一样应用RSA是极为低效的。在最坏的情况下,它是不安全的:因为它是非传统的,没有人费心研究这种模式引入了什么漏洞。例如,像AES这样的实际分组密码在某些模式下使用,这些模式为加密方案提供不同的属性。谁能说出此自制RSA模式具有哪些属性。另请参见。这也不鼓励这种做法。所有链接都断了