0

ユーザーに確認リンクを送信する必要があるプロジェクトに取り組んでいます。そのため、AES暗号化を使用して彼のユーザー名を暗号化しました。私のコードは正常に動作します。つまり、暗号化と復号化は正常に動作しますが、テストしたときのプログラムでのみ動作します。文字列を暗号化してから復号化しました。「ローカル」で正常に動作します。

問題は、アクティベーション リンクを含むメールを送信してクリックすると、エラーが発生することです。

javax.crypto.BadPaddingException: Given final block not properly padded

私のコードは次のとおりです。

public class AES {

private static final String algo="AES";
private static final byte[] keyValue= 
        new byte[]{somekey};

private static Key generateKey() throws Exception{

    Key key= new SecretKeySpec(keyValue, algo);

    return key;
}

public static String encrypt(String  email) throws Exception{

    Key key=generateKey();
    Cipher c=Cipher.getInstance(algo);
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encVal=c.doFinal(email.getBytes());
    String encryptedEmail= new BASE64Encoder().encode(encVal);

    return encryptedEmail;
}

public static String decrypt(String encryptedEmail) throws Exception{

    Key key=generateKey();
    Cipher c=Cipher.getInstance(algo);
    c.init(Cipher.DECRYPT_MODE, key);

    byte[] decodeEmail= new BASE64Decoder().decodeBuffer(encryptedEmail);
    byte[] decodedEmail=c.doFinal(decodeEmail);

    String decryptedEmail= new String(decodedEmail);

    return decryptedEmail;
    }

}

4

2 に答える 2

2

Bouncy Castle ライブラリの Base64 エンコーダー/デコーダーを使用して実行しましたが、まったく問題ありませんでした。入力/出力を確認し、未指定の入力/出力を持つ Sun 内部のものではなく、有効な Base 64 エンコーダ/デコーダを使用してください。

警告: 指定されていない文字エンコーディングを使用すると、プラットフォーム固有のエンコーディングが使用されるため、入力/出力は別のシステムで異なる場合があります。toBytes最も互換性のある文字エンコーディング (String コンストラクターおよびメソッド内) には、Charset.forName("UTF8") を使用してみてください。

于 2012-07-21T10:41:21.943 に答える
0

あなたのコードは、暗号化または復号化のパディングを設定していないようです。両端にパディングを明示的に設定する方がはるかに優れています。また、明示的に行う必要があるモードを設定しているようには見えません。

当然の選択として、「AES/CBC/PKCS5Padding」をお勧めします。

于 2012-07-21T09:53:23.890 に答える