0

次のコードを使用して一部のデータを暗号化し、復号化コードをサーバーに移動したいので、RESTを介してcipherData(バイト[]配列)をサーバーに送信する必要があります

        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をparmとして使用して新しい文字列を作成できることを望んでいました。

上記の例でこれを試してみると、次のエラーが発生します

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をparmとして使用して新しい文字列を作成できることを望んでいました。

番号cipherDataは任意のバイナリデータです。これエンコードされたテキストではありません。これは、さまざまなStringコンストラクターが期待するものです。(余談ですが、エンコーディングを指定しない、またはを呼び出すことはほとんどありません。状況に応じて、常に適切なエンコーディングを指定してください。)String.getBytes()new String(byte[])

データをテキストではなくバイナリデータとして送信するか、 Base64を使用してバイナリデータを最初にテキストとして安全にエンコードし、後で復号化する前にBase64からバイナリに再度デコードします。使いやすいパブリックドメインのBase64エンコーダーがあります。

于 2012-07-08T18:51:11.117 に答える