0

ソルトを使用してAES暗号化されたメッセージを復号化しようとしましたが、常にnull値が返されます。誰かが私が間違っているところを見ることができますか?

public static String decryptMessage(String encryptedMessage, String salt) {

  String decryptedMessage = null;
  String valueToDecrypt = encryptedMessage;
  try {
    Key key = generateKey();
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(Cipher.DECRYPT_MODE, key);


    for (int i = 0; i < ITERATIONS; i++) {
      byte[] decodedValue = Base64.decodeBase64(valueToDecrypt);
      byte[] decVal = c.doFinal(decodedValue);
      decryptedMessage = new String(decVal).substring(salt.length());
      valueToDecrypt = decryptedMessage;
    }


  } catch (Exception e) {
    e.printStackTrace();

  }
  return decryptedMessage;
}

**EDIT:**

これは、私が想定している対応する暗号化方法です。

private static final String ALGORITHM = "AES";
    private static final int ITERATIONS = 5;
    private static final byte[] keyValue = new byte[] { '1', '2', '3', '4',
            '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6' };


    public static String encryptMessage(String message, String salt) {
        String encMessage = null;
        byte[] encVal = null;
        String messageWithSalt = null;
        try {
            Key key = generateKey();

            Cipher c = Cipher.getInstance(ALGORITHM);
            c.init(Cipher.ENCRYPT_MODE, key);

            for (int i = 0; i < ITERATIONS; i++) {
                messageWithSalt = salt + encMessage;
                encVal = c.doFinal(messageWithSalt.getBytes());
                byte[] encryptedValue = new Base64().encode(encVal);
                encMessage = new String(encryptedValue);
            }

        } catch (Exception e) {
            e.printStackTrace();

        }
        return encMessage;
    }

PS: 反復は 0 ではありません。

4

2 に答える 2

1

あなたのメソッドは慢性的に壊れているか、名前が間違っている可能性があると思います。復号化するたびにキーを生成しますが、暗号化に使用されるキーと一致する既存のキーが必要です。

また、「salt」値も渡します。注: これは通常、ハッシュ用に予約されている用語です。結果の切り捨ての長さとしてサイズを使用する場合を除いて、完全に無視します。

確かに、私が上で見たことは、賢明な方法で何かを解読していません. 達成したいことを正確に説明できる場合は、コードを修正するか、そのタスクを実行するための査読済みの方法 (標準ライブラリに既に実装されている可能性があります) を紹介できる可能性があります。

于 2012-11-22T14:12:12.777 に答える
1

さて、私はエラーを見つけました。暗号化方式にありました。 暗号化プロセスが開始される前 encMessageでした。トリックをしました。したがって、暗号化方法は次のとおりです。nullString encMessage = message

 public static String encryptMessage(String message, String salt) {
            String encMessage = message;
            byte[] encVal = null;
            String messageWithSalt = null;
            try {
                Key key = generateKey();

                Cipher c = Cipher.getInstance(ALGORITHM);
                c.init(Cipher.ENCRYPT_MODE, key);

                for (int i = 0; i < ITERATIONS; i++) {
                    messageWithSalt = salt + encMessage;
                    encVal = c.doFinal(messageWithSalt.getBytes());
                    byte[] encryptedValue = new Base64().encode(encVal);
                    encMessage = new String(encryptedValue);
                }

            } catch (Exception e) {
                e.printStackTrace();

            }
            return encMessage;
        }
于 2012-11-24T13:31:07.583 に答える