Java 仅当使用CipherOutputSream时,RSA块的数据太多

Java 仅当使用CipherOutputSream时,RSA块的数据太多,java,encryption,cryptography,rsa,outputstream,Java,Encryption,Cryptography,Rsa,Outputstream,我目前正在尝试使用Java JDK版本is 1.8.0加密一些字符串。过程如下: RSA私钥(MD5Hash(原始字符串)) 我使用密码和BC进行加密和添加填充。因为我想输出Cipher实例,并在另一个类中重新生成它。因此,我使用CipherOutputStream来输出加密字符串和密码实例。 在我指定以下代码之前,代码运行良好 public void outputCipherFile() throws IOException { FileOutputStream fos = new

我目前正在尝试使用Java JDK版本is 1.8.0加密一些字符串。过程如下:

RSA私钥(MD5Hash(原始字符串))

我使用密码和BC进行加密和添加填充。因为我想输出Cipher实例,并在另一个类中重新生成它。因此,我使用CipherOutputStream来输出加密字符串和密码实例。 在我指定以下代码之前,代码运行良好

public void outputCipherFile() throws IOException {

    FileOutputStream fos = new FileOutputStream("output.txt");
    CipherOutputStream cos = new CipherOutputStream(fos,cipher);

    //this.encryptedString is the String I wish to encrypt, which datatype is byte[]
    cos.write(this.encryptedString);
    cos.close();

}
如果我删除对outputCipherFile()的方法调用,则加密可以工作。但在执行上述代码语句时,会出现以下错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block
    at org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi.engineUpdate(Unknown Source)
    at javax.crypto.Cipher.update(Cipher.java:1832)
    at javax.crypto.CipherOutputStream.write(CipherOutputStream.java:158)
    at javax.crypto.CipherOutputStream.write(CipherOutputStream.java:144)
    at com.domain.JavaEncryptionProject.outputCipherFile(JavaEncryptionProject.java:132)<5 internal calls>
线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常:RSA块的数据太多 位于org.bouncycastle.jcajce.provider.asymetric.rsa.CipherSpi.engineUpdate(未知来源) 位于javax.crypto.Cipher.update(Cipher.java:1832) 在javax.crypto.CipherOutputStream.write(CipherOutputStream.java:158) 在javax.crypto.CipherOutputStream.write(CipherOutputStream.java:144)上 位于com.domain.JavaEncryptionProject.outputCipherFile(JavaEncryptionProject.java:132) 我在网上找到了一些关于RSA太短而无法加密字符串的参考资料。但我不太明白为什么它可以在加密和解密中工作,不能用CipherOutputStram输出txt。请帮忙


非常感谢。

阅读有关私钥-公钥密码(如RSA)和分组密码(如AES)的区别。我个人认为,这个错误在字面上是有意义的。你试图加密的数据太多了。RSA只能根据其密钥的长度加密尽可能多的字节,通常减去一些填充字节。但当我使用同一组RSA密钥加密Cipher.dofinal(this.originalString)时,就没关系了。可以对字符串进行解密和加密。请注意:哈希值的加密不是签名生成;你的代码毫无意义。我可以在顶部看到对MD5的调用,然后在流式代码中没有这样的调用,也许这可以解释这种差异?