2011-11-28 10 views
8

対称鍵を使用してメッセージに署名することはできますか?私たちは共有秘密鍵を使用して暗号化することができます。また、署名に対称キーを使用する場合、キーをロードしてメッセージに署名するためにどのAPIをJAVAで使用できますか?対称鍵(AES -128)を使用してメッセージに署名して検証する

私は、java.securityからSignatureを使用した場合、api initSignを持っていますが、メッセージに署名するための引数として公開鍵/秘密鍵のペアから秘密鍵を受け取ります。ここで鍵は対称鍵です。

任意のポインタ?

答えて

11

共有秘密鍵を使用してMessage Authentication Code (MAC)を計算すると、同じ共有秘密を知っている相手にメッセージの完全性と信頼性を確認できます。秘密鍵を使用して作成され、公開鍵を使用して検証されるデジタル署名とは異なり、MACは否認防止機能を提供しません(MACが別のメッセージ用のMACを生成できることを確認できる人)。

さまざまな形式のメッセージ認証コードがあります。おそらく最もよく使用されるバリエーションはHMACです。

1

シンメトリックキーを使用してメッセージに署名する場合は、AES(または3キーTDEA、またはCameilla)に基づくCMACを使用します。 CMACは、ブロック暗号の上に構築されたメッセージ認証コード(MAC)です。暗号化にAES/3TDEA/Cameillaも使用している場合(つまり、便利です)、一般にCMACを使用します。

HMACを使用することもできます。 HMACは、ハッシュの上に構築されたメッセージ認証コード(MAC)です。あなたはHMACを使うでしょう、ハッシュは既にプログラムに存在しています(つまり、便利でした)。

プログラムにブロック暗号とハッシュの両方がある場合は、一般にHMACを使用します。

最後に(完全なものとして)、MD5は使用しないでください。その壊れた(フリーソフトウェア世界の多くが何を考えているにもかかわらず)。 SHA-1は、NIST、NESSIE、ECRYPTなどの機関による新しい申請のために承認されなくなりました。 SHA-2ファミリーのハッシュを使用するか、Whirlpoolを使用してください。

Java固有のものについては、Java Cryptography Extensionsを参照してください。

6

対称アルゴリズムでは、非対称署名スキームが示す非拒否特性を与えることはできません。つまり、メッセージの受信者は、スキームを知る必要があるため、メッセージ自体を作成しなかったことを証明できません。 (MAC)message authentication code、言っ

が何をしたいあなたを与えることができます:送信者と受信者の両方が共有鍵を持って、送信者は秘密でMACを計算し、メッセージに追加して、受信機は、計算します同じMACを受信し、受信したメッセージと比較します。

最も頻繁に使用されるMACタイプ(HMAC)はハッシュ関数に基づいているが、AESのようなブロック暗号に基づいているものがCBC-MAC等(これはCBC似ているが、ゼロ初期化ベクトルでのみ使用して、またあります出力として最後のブロック)。

暗号化を使用するほとんどの場合、メッセージ認証を使用する必要があります。多くの場合、選択された暗号化方式に脆弱であるため、平文攻撃。

Javaでは、javax.crypto.Macクラスを使用してMACを計算(およびチェック)できます。

+1

可変長メッセージの場合、CBC-MACは切断されます。 CMACは、CBC-MACの権利行使です。 – jww

+0

申し訳ありませんが、私はまだ明確ではありません。 HMACに使用される鍵サイズを決定する要因は何ですか? CMACよりもHMACを使うことができます。しかし、私が持っている鍵は128です。それは使えますか?たとえば、SecretKey key = new SecretKeySpec(key、 "AES") – user839917

+0

MACと暗号化に異なる(独立した)鍵を使用することをお勧めします。 HMACに必要な任意の長さ(ハッシュ関数のブロック長まで)を使用することができます(実装でサポートされているかどうかはわかりませんが)。ハッシュ関数のブロック長に0で埋め込まれます。より大きいキーはより多くのセキュリティを提供しますが、ハッシュ関数の出力サイズ(= MACサイズ)よりも良くなりません。 –