我的CipherOutputStream无声地失败

我正在尝试使用公钥加密Java中的一些二进制数据,如此有用页面所述: http : //www.junkheap.net/content/public_key_encryption_java

根据页面的指示,我使用命令创建了公钥和私钥:

openssl genrsa -aes256 -out private.pem 2048 openssl rsa -in private.pem -pubout -outform DER -out public.der 

现在我用一个小程序保存加密一些数据:

 public class Rsa { public static void main(String[] args) throws Exception, IOException { File keyFile = new File("public.der"); byte[] encodedKey = new byte[(int) keyFile.length()]; new FileInputStream(keyFile).read(encodedKey); X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encodedKey); KeyFactory kf = KeyFactory.getInstance("RSA"); PublicKey pk = kf.generatePublic(publicKeySpec); Cipher rsa = Cipher.getInstance("RSA"); rsa.init(Cipher.ENCRYPT_MODE, pk); FileOutputStream fileOutputStream = new FileOutputStream( "encrypted.rsa"); OutputStream os = new CipherOutputStream(fileOutputStream, rsa); byte[] raw = new byte[245]; raw[0] = 4; os.write(raw); os.flush(); os.close(); } } 

上面的代码工作,但是当我将字节数组的大小更改为246时,它会生成一个零长度的文件!

我究竟做错了什么?

CipherOutputStream倾向于吞下它包装的Cipher和OutputStream对象生成的exception。 Sun RSA实现不会加密超过M-11字节,其中M是模数的字节长度。 这对于默认的PKCS1Padding来说是正确的,除非你真的知道自己在做什么,否则你应该经常使用它。 您可以指定NoPadding,从而获得完整的M字节。

RSA不是加密批量数据的正确选择。 用于利用RSA加密数据的普遍接受的方法是生成随机对称会话密钥K 例如,AES密钥,用K对称算法加密数据,然后使用所有接收者的RSA密钥加密K.