認証された暗号化では、メッセージの暗号化と認証にいくつかの標準を使用する必要があります。そこで我々は、メッセージを暗号化し、改ざんされていないことを確認するためにメッセージ上のMACを計算する。Javaで認証された暗号化を実行する適切な方法は何ですか?
This questionは、パスワードベースの鍵の強化と暗号化を実行する方法について概説:
/* Derive the key, given password and salt. */
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
/* Encrypt the message. */
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
AlgorithmParameters params = cipher.getParameters();
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
byte[] ciphertext = cipher.doFinal("Hello, World!".getBytes("UTF-8"));
をしかし、私の知る限り、これは暗号文に任意のMACを計算していないので、安全ではないだろう。 Javaで認証された暗号化を実行するために受け入れられる標準は何ですか?
あなたが知っている完全なメッセージを暗号化/復号化する場合、それは改ざんされていません。 「プレーンテキスト」でメッセージ(またはデータ)を送信してからプレーンテキストを認証するためにHMACを送信する場合は、HMACは使用されていませんか? – TacticalCoder
認証された暗号化を行うための標準はありません。(非対称な)シグネチャ、MAC(例:AESCMAC)、HMAC、または認証モードなどがあります。しかし、いくつかの安全でないものがあります(デフォルトのAES-MACはあまり安全ではありません)。あなたのユースケースに合った良い答えは下記をご覧ください。 –
答えに何か問題がありますか? –