0

Android アプリケーションで AES 復号化の問題が発生しています。私はたくさん検索しましたが、解決策を得ることができません。

ここに私がやっていることの手順があります。

  • クレジット カード番号をマイ キーで暗号化して Web サーバーに送信します。
  • Web サーバー クレジット カード番号を復号化して保存します。
  • Web サービスからクレジット カード番号を取得するとき。
  • 次に、Web サーバーがクレジット カード番号を同じキーで暗号化し、当社に送信します。
  • この番号を復号化すると、一部のクレジット カード番号情報に対して無効なパディング例外がスローされます。

また、暗号化された情報は、サーバーから送信されるものと同じではなく、暗号化された形式で送信されます。iPhoneアプリでも同じことが行われ、iPhoneは情報を正常に復号化できます.

暗号化と復号化に次のコードを使用しています。

public class AES256Cipher {

    public static byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

    public static String AES_Encode(String str, String key) throws java.io.UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {

        byte[] textBytes = str.getBytes("UTF-8");
        AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
             SecretKeySpec newKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
             Cipher cipher = null;
        cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec);

        return Base64.encodeToString(cipher.doFinal(textBytes), 0);
    }

    public static String AES_Decode(String str, String key) throws java.io.UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {

        byte[] textBytes =Base64.decode(str,0);
        //byte[] textBytes = str.getBytes("UTF-8");
        AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
        SecretKeySpec newKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec);
        return new String(cipher.doFinal(textBytes), "UTF-8");
    }

提案してください。

編集: もう1つ、16桁未満の情報で機能しています。16 桁の情報を入力すると、復号化で例外がスローされます。

4

1 に答える 1

3

サーバーが特定の文字にマップされていない未知のエンコーディングに遭遇した場合、キーは正しく転送されず、時々失敗し、結果として不正なキーになります。暗号文は base64 を使用してエンコードされているため、おそらく問題ありませんが、鍵はそれほど幸運ではない可能性があります。

キーまたは暗号文の最後のブロックが変更されるBadPaddingException.

于 2012-12-27T13:35:49.570 に答える