我应该加密签名吗?

时间:2011-07-05 18:15:05

标签: security language-agnostic encryption cryptography digital-signature

我知道,根据this article我应该签署邮件,然后加密邮件。

我的程序运作如下:

  • 获取消息的字节
  • 对消息进行数字签名,并将签名存储在单独的字节数组中
  • 加密邮件
  • 发送签名,然后发送数据包中的加密邮件

我应该这样做吗?

  • 获取消息的字节
  • 对消息进行数字签名,并将其与消息的字节连接起来
  • 加密包含消息和签名的数组
  • 发送加密数据

感谢协助

1 个答案:

答案 0 :(得分:1)

  

对消息进行数字签名,并将其与消息的字节连接起来。

你需要知道一个人的结局和另一个人的开始,但确定。有些API只需要一个键和一个消息并产生一个字节输出,然后它们不需要单独的验证(数据) - >布尔步骤,而是需要一串字节并返回已验证的消息或失败。 / p>

是的,你可以发送

encrypt(
    concat(
        sign(message, signerPrivateKey), message),
        encryptionKey)

要获得经过验证的消息,接收方必须提前收到两个密钥:签名者公钥和解密密钥,它与对称加密的encryptionKey相同,且必须是一个保密密码。

如果您想使用非对称加密,那么您只需要交换公钥,并且您的消息并不总是短于密钥,通常您会生成一次性使用对称密钥,并且只对非对称加密,因为非对称算法通常是比对称的更贵。

oneTimeUseSymmetricCryptoKey := generateKey()
concat(
    encryptAssymetric(
        oneTimeUseSymmetricCryptoKey,
        encrypterPrivateKey),
    encryptSymmetric(
        concat(sign(message, signerPrivateKey), message),
        oneTimeUseSymmetricCryptoKey))

这些都不会阻止上面链接中描述的消息转发攻击。为此,您需要对发件人进行身份验证,例如通过选择一个公钥来验证签名 AND 一个密钥,根据一个独立于加密字节交换而得到的发件人地址进行解密。