使用对称密钥(AES -128)签名并验证消息

use*_*917 9 java cryptography digital-signature

我想知道可以使用对称密钥来签名消息吗?我们可以使用共享密钥加密.此外,当对称密钥用于签名时,可以在JAVA中使用哪些API来加载密钥并对消息进行签名?

如果我使用java.security中的Signature,它有一个api initSign,但是它从公钥/私钥对中取私钥作为签名消息的参数.这里的关键是对称密钥.

有什么指针吗?

Ser*_*sov 14

共享密钥可以用于计算消息认证码(MAC),然后可以用于确认消息的完整性和真实性给知道相同共享秘密的另一方.与使用私钥创建并使用公钥验证的数字签名不同,MAC不提供不可否认性(任何可以验证MAC的人也可以为另一个消息生成MAC).

有不同形式的消息认证码; 可能最常用的变体是HMAC.


Paŭ*_*ann 8

对称算法不能给出非对称签名方案给出的不可否认属性,即消息的接收者不能证明他自己没有创建消息,因为他们必须知道该方案.

也就是说,消息验证码(MAC)可以为您提供所需的信息:发送方和接收方都有共享密钥,发送方计算带有密码的MAC并将其附加到消息中,接收方计算相同的MAC并进行比较它与收到的消息.

虽然最常用的MAC类型(HMAC)基于散列函数,但也有一些基于像CSS这样的分组密码,如CBC-MAC(这类似于CBC,但初始化矢量为零,仅使用最后一个阻止作为输出).(正如noloader所说,CBC-MAC不是最安全的方式,使用其他模式.)

在大多数使用加密的情况下,您应该使用消息身份验证,因为许多加密方案容易受到选择明文攻击.

在Java中,可以使用javax.crypto.Mac类计算(并检查)MAC .