我想多次加密一个字符串。但我不知道为什么我以空字节数组结束。一个公钥可以,但添加另一个公钥会返回空结果。有谁知道为什么?private static byte[] encrypt(LinkedList<PublicKey> keys, byte[] input) throws Exception { System.out.println("Input length : " + input.length); if (keys.isEmpty()) { return input; } PublicKey publicKey = keys.poll(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); try (CipherOutputStream cipherOutputStream = new CipherOutputStream(byteArrayOutputStream, cipher)) { cipherOutputStream.write(input); } byteArrayOutputStream.flush(); byteArrayOutputStream.close(); return encrypt(keys, byteArrayOutputStream.toByteArray());}public static void main(String[] args) throws Exception { KeyPair pair1 = createPair(); KeyPair pair2 = createPair(); LinkedList<PublicKey> keys = new LinkedList<>(); keys.add(pair1.getPublic()); keys.add(pair2.getPublic()); byte[] result = encrypt(keys, "Just testing".getBytes(Charset.forName("UTF-8"))); System.out.println(new String(result, Charset.forName("UTF-8")));}public static KeyPair createPair() throws NoSuchAlgorithmException { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(2048); return keyPairGen.generateKeyPair();}输出是Input length : 12Input length : 256Input length : 0在 Topaco 的回答之后..一个工作版本是:private static BufferedInputStream encryptS(LinkedList<PublicKey> keys, BufferedInputStream inputStream) throws Exception { if (keys.isEmpty()) { return inputStream; }
1 回答
互换的青春
TA贡献1797条经验 获得超6个赞
对于 RSA,必须考虑以下因素:
消息的长度加上填充不得超过密钥长度(= 模数的大小)[
0
]、[1
]、[2
]、[3
]。填充是指按照一定的方案向消息中添加额外的字节[4
]。密文的长度对应于密钥长度(=模数的大小),[
5
]。
这意味着在第一次加密之后就已经达到了允许的最大长度。因此,在没有填充的情况下,不会超过最大长度,而在有填充的情况下,则会超过最大长度。
使用以下命令创建密码实例
Cipher.getInstance("RSA")
对应于
Cipher.getInstance("RSA/ECB/PKCS1Padding")
对于 SunJCE-Provider ( [ 6
] , [ 7
] ),即使用 PKCS1 v1.5 填充,填充至少为 11 个字符,因此密钥大小为 256 字节时,消息的最大大小不得超过 245 字节。
这就是当前代码中的递归加密不起作用的原因。如果密码实例是使用以下命令创建的
Cipher.getInstance("RSA/ECB/NoPadding")
(未使用填充),当前代码有效。
然而,出于安全原因,在实践中必须始终使用填充!
添加回答
举报
0/150
提交
取消