3

他の場所で暗号化した文字列を復号化しようとしています。これが私のコードです:

private void test() {

    try {
        String stringMessage="Sf3O7Lr2+WN5szGyLejL3CjuBRZtQ72+ZBmgVTgWnatQZxUElzaBqFa1p0SVBqe9VWVxCxdEkejMVtDGEr0UJSVSK8EB/fPI6v8JE8dIu0JN0mMs4xlowhITy0tQR+1pcBtDFjzOl33xxQcq5JuPezxRDxFIp+IVkD8FdpqlttEKf2Tvqw9tqsdgiBKb5xDvKrkIDQXdLBh1gbAVZDSJYGHRkcOA8vz2ty/PeooKkfDK6IOn7KBwOBgSRgQr/MLBF3Xk2vRWgVGRh/fRkzu21EWo99Q5moWKxWl3HW/bbgTBQTb097XP3NTID9kSPhCfL0BEfBxonuNse5GBoeRnCw==";
        //Convert String back to Byte[] and decrpt
        byte[] byteMessage = Base64.decodeBase64(stringMessage.getBytes("UTF-8"));
        System.out.println("ENCRYPTED MESSAGE byte Length: "+byteMessage.length);

        String decryptedMsg = decryptString(byteMessage, loadCASPrivateKey());
        System.out.println(decryptedMsg);
    } catch (Exception e) {
        e.printStackTrace();
        return;
    }
}

private static String decryptString(byte[] message, Key privateKey) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.DECRYPT_MODE, privateKey);

    byte[] cipherData = cipher.doFinal(message);
    return new String(cipherData, "UTF-8");
}

private PrivateKey loadCASPrivateKey() throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
    InputStream is = getClass().getResourceAsStream( "/keys/app-private.key" );
    if (is == null) {
        System.out.println("NULL");
    }
    byte[] encodedPrivateKey = new byte[(int) 2000];
    is.read(encodedPrivateKey);
    is.close();

    // Generate KeyPair.
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");

    PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedPrivateKey);
    PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);

    return privateKey;

}

これは、デスクトップJVMで100%動作しますが、Androidエミュレーターで実行すると次のようになります。

04-24 22:42:21.011:I / System.out(1041):��k���_��*�������93| @0�̍4�y)��Q�k�; * A����e�<code>#��A��oiu:�����W5@ $�w�j��uS�R�Ocxٰ&����l�w'/�d�8uA ��ؔ�{�4$�U�0��{ǐ��t!9��n����a��'Jdt2�t�T�D��k+k�;���� ������GF��\�rڼ��>]�y+^w�&lt;����'E{�8R]�ZHyu��ζ��軟�ہ掱�{�A�# ȟ�</p>

私の問題はエンコーディングにあると思いますが、私は一日中何を解決しようとしていて、本当に困惑しています。

文字列は元々、以下を使用して暗号化されています。

private void test() {
    String message="22223334490384903432221";
try {
    //Encrypt message
    byte[] encryptedMsg = Base64.encodeBase64(encryptString(message, temp.loadCASPublicKey()));
} catch (Exception e) {
e.printStackTrace();
        return;
}

}

private static byte[] encryptString(String message, Key publicKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);

    byte[] cipherData = cipher.doFinal(message.getBytes("UTF-8"));     
    return cipherData;
}
4

2 に答える 2

1

KeyFactory2000 バイトの配列に読み込んでいるため、ガベージをフィードする可能性があり、キーはおそらく 128 (1024 ビット) または 256 (2048 ビット) バイトの長さです。さらに、暗号化に RSA を直接使用するべきではありません。これにはセキュリティ上の問題があり、暗号化できるデータ サイズは RSA キー サイズによって制限されます。

于 2012-04-25T01:55:25.343 に答える
1

コメントでの GregS の助けに感謝します。これは私のために働いた解決策です。

private void test() {

            try {
                String stringMessage="GEQRpAPA577ks/QveudNkk7H9DjItKGLDYW6xhH1YJGabCVzrkejkBh6S+APwEXxB84UV/q0sO5rqkgXWONJQ8CoMTfqXtUkAAwkYHSc86eGewkM8WpctA0AyNVFonOxDCXm84Uq8JRMzqskSH5VXHmMxvHIvpFgdhmt9Ir0cKWzoLsuvgfY9hfypfEyBXGZcoptQeKhsZxRGIlxbXhrFl/LqhC+F6vYtZ/j5pv2LUP38wh2rTCKnAQ+xvC+7wn5SVzt/Wbr/q7GjCoJuU9uFHQSS49KQDt+BzJL2XNwAMmdbC+XHYkEBBWxVSS+0hdSQxoaKVZZJk4hTnHwQlBAkw==";
                //Convert String back to Byte[] and decrpt
                byte[] byteMessage = Base64.decodeBase64(stringMessage.getBytes("UTF-8"));
                System.out.println("ENCRYPTED MESSAGE byte Length: "+byteMessage.length);

                String decryptedMsg = decryptString(byteMessage, loadCASPrivateKey());
                System.out.println(decryptedMsg);
            } catch (Exception e) {
                e.printStackTrace();
                return;
            }
        }

        private static String decryptString(byte[] message, Key privateKey) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException, NoSuchProviderException {
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

            Cipher cipher = Cipher.getInstance("RSA/None/NoPadding","BC");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);

            byte[] cipherData = cipher.doFinal(message);
            return new String(cipherData, "UTF-8");
        }

        private PrivateKey loadCASPrivateKey() throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
            InputStream is = getClass().getResourceAsStream( "/keys/app-private.key" );
            if (is == null) {
                System.out.println("NULL");
            }
            byte[] encodedPrivateKey = new byte[(int) 1216];
            is.read(encodedPrivateKey);
            is.close();

            // Generate KeyPair.
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");

            PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedPrivateKey);
            PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);

            return privateKey;

        }
于 2012-04-28T14:19:18.223 に答える