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

我想多次加密一个字符串。但我不知道为什么我以空字节数组结束。一个公钥可以,但添加另一个公钥会返回空结果。有谁知道为什么?


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 : 12

Input length : 256

Input length : 0

在 Topaco 的回答之后..一个工作版本是:


private static BufferedInputStream encryptS(LinkedList<PublicKey> keys, BufferedInputStream inputStream) throws Exception {

    if (keys.isEmpty()) {

        return inputStream;

    }


慕的地10843
浏览 102回答 1
1回答

互换的青春

对于 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")(未使用填充),当前代码有效。然而,出于安全原因,在实践中必须始终使用填充!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java