为了账号安全,请及时绑定邮箱和手机立即绑定

使用 CipherOutputStream 的递归加密给出一个空字节[]

使用 CipherOutputStream 的递归加密给出一个空字节[]

慕的地10843 2023-08-16 17:28:33
我想多次加密一个字符串。但我不知道为什么我以空字节数组结束。一个公钥可以,但添加另一个公钥会返回空结果。有谁知道为什么?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")

(未使用填充),当前代码有效。

然而,出于安全原因,在实践中必须始终使用填充!


查看完整回答
反对 回复 2023-08-16
  • 1 回答
  • 0 关注
  • 100 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信