2

メッセージを暗号化しようとしています。これは機能し、バイト配列として返されます。次に、tcpネットワークメッセージを介して送信するために、このバイト配列を文字列に変換します。一方、文字列をバイト配列に変換し直しますが、結果の配列は大きくなり、理由がわかりません。「MacRoman」を使っているかのようにエンコーディングと関係があるのではないかと思いますが、この問題はありませんが、このエンコーディングをサポートしていないシステムでプログラムを実行できる必要があるため、UTFを使用することにしました。 -8。

        String message="222233332221";

        //Encrypt message
        byte[] encryptedMsg = encryptString(message, temp.loadCASPublicKey());
        System.out.println("ENCRYPTED MESSAGE byte Length: "+encryptedMsg.length);


        //Convert to String in order to send
        String stringMessage = new String(encryptedMsg);
        System.out.println("ENCRYPTED MESSAGE String Length: "+stringMessage.length());

        //Convert String back to Byte[] and decrpt
        byte[] byteMessage = stringMessage.getBytes("UTF-8");
        System.out.println("ENCRYPTED MESSAGE byte Length: "+byteMessage.length);

出力:

ENCRYPTED MESSAGEバイト長:256

暗号化されたメッセージ文字列の長さ:235

ENCRYPTED MESSAGEバイト長:446

結果のバイト配列が256バイトではなく446バイトである理由について、誰かが私を正しい方向に向けてください。

暗号化文字列の部分は次のとおりです。これはUTF-8でバイト配列を返すと思いますか?

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

3 に答える 3

4

Base64を使用して修正することができました。

        byte[] encryptedMsg = Base64.encodeBase64(encryptString(message, temp.loadCASPublicKey()));


        System.out.println("ENCRYPTED MESSAGE byte Length: "+encryptedMsg.length);


        //Convert to String in order to send
        String stringMessage = new String(encryptedMsg, "UTF-8");
        System.out.println("ENCRYPTED MESSAGE String Length: "+stringMessage.length());

        //Convert String back to Byte[] and decrpt
        byte[] byteMessage = Base64.decodeBase64(stringMessage.getBytes("UTF-8"));
        System.out.println("ENCRYPTED MESSAGE byte Length: "+byteMessage.length);
于 2012-04-24T14:19:16.857 に答える
2

これはエンコーディングの問題です。

1)バイト配列があります。バイトが含まれています
2)文字列に変換します。 これを行うとすぐに、UTF16でエンコードされた文字列が作成されます。これで、バイトを取得して文字に変更しました。
3)これらの文字をバイトに変換し直します。ただし、元のバイトがUTF8またはUTF16でない場合は、同じバイト数ではない可能性があります。プラットフォームのデフォルトのエンコーディングがMacRomanの場合、ステップ3でUTF16文字列をバイトに変換しますが、文字はMacRomanとして扱います。

于 2012-04-24T13:28:30.340 に答える
0

手動で暗号化を行うのには十分な理由があると思いますが、念のため...代わりにSSLSocketの使用を検討しますか?

于 2012-04-24T14:08:18.990 に答える