0

我使用以下代码加密一些数据,并且我想将解密代码移动到服务器,因此需要通过 REST 将 cipherData (这是一个 byte [] 数组)发送到我的服务器

        BigInteger modulus = new BigInteger("blah");
        BigInteger exponent = new BigInteger("blah");

        RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, exponent);

        KeyFactory encryptfact = KeyFactory.getInstance("RSA");
        PublicKey pubKey = encryptfact.generatePublic(keySpec);

        String dataToEncrypt = "Hello World";

        /**
         * Encrypt data
         */
        Cipher encrypt = Cipher.getInstance("RSA");
        encrypt.init(Cipher.ENCRYPT_MODE, pubKey);
        byte[] cipherData = encrypt.doFinal(dataToEncrypt.getBytes());

        System.out.println("cipherData: " + new String(cipherData));

        /**
         * Decrypt data
         */
        BigInteger privatemodulus = new BigInteger("blah");
        BigInteger privateexponent = new BigInteger("blah");

        RSAPrivateKeySpec privateKeySpec = new RSAPrivateKeySpec(privatemodulus, privateexponent);

        PrivateKey privateKey = encryptfact.generatePrivate(privateKeySpec);

        Cipher decrypt = Cipher.getInstance("RSA");
        decrypt.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decData = decrypt.doFinal(cipherData);

        System.out.println(new String(decData));

这工作正常。

我希望我可以使用 cipherData 作为参数创建一个新字符串

当我用上面的例子尝试这个时,我收到以下错误

byte[] decData = decrypt.doFinal(new String(cipherData).getBytes());

javax.crypto.BadPaddingException: Data must start with zero
at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:308)
at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:255)
at com.sun.crypto.provider.RSACipher.a(DashoA13*..)
at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at com.test.EncryptTest.main(EncryptTest.java:52)

有任何想法吗?

4

1 回答 1

3

我希望我可以使用 cipherData 作为参数创建一个新字符串

No.cipherData是任意二进制数据。它不是编码文本,这是各种 String 构造函数所期望的。(顺便说一句,您几乎应该调用未指定编码的String.getBytes()or new String(byte[])。始终指定适当的编码,这取决于具体情况。)

要么将数据作为二进制数据而不是通过文本传输,要么先使用Base64将二进制数据安全地编码为文本,然后在解密之前再次将其从 Base64 解码为二进制。有一个易于使用的公共领域 Base64 编码器。

于 2012-07-08T18:51:11.117 回答