如何通过“爱丽丝”发送数字签名保证邮件的发送方式。

时间:2013-06-30 13:25:27

标签: c# cryptography digital-signature encryption-asymmetric

我相信我理解数字签名是如何工作的,但我仍然不明白它是如何保证邮件已被已知发件人(Alice)加密。

让我们假装爱丽丝想要给鲍勃发送消息。爱丽丝和鲍勃上周见面,鲍勃正在等待yesno的回复。汤姆是中间黑客家伙

1。没有数字签名的场景:

// 1) Alice get's Bob public key
var bobPubKey = GetBobsPubKey();

// 2) Alice encrypts yes with bob's public key
var encryptedMessage = AssymetricEncryption.Encrypt("YES", bobPubKey );

// 3) Send message to bob
sendMsgToBob(encryptedMessage);

这种方法的问题在于Tom可能截获了消息encryptedMessage并将该消息替换为var newEncryptedMsg = AssymetricEncryption.Encrypt("NO!", bobPubKey ); 当bob收到消息时,他不知道它已被Tom修改过!

2。使用数字签名的场景

// 1) Alice get's Bob's public key 
var bobPubKey = GetBobsPubKey();

// 2) Alice encrypts 'yes' with bob's public key
var encryptedMessage = AssymetricEncryption.Encrypt("YES", bobPubKey );

// 3) Alice creates a hash of the encrypted message
var hashOfEncMsg = Sha1(encryptedMessage);

// 4) Alice encryptes that hash with her priveate key
var digitalSignature = AssymetricEncryption.Encrypt(hashOfEncMsg , alicePrivKey);

// 5) Alice sends both the encryptedMsg plus the signature to Bob
var msgToSend = string.Format("someUrl.asp?encMsg={0}&digSignatrue={1}",encryptedMessage , digitalSignature );
sendBobAMsg(msgToSend ); // msg contains encryptedConted + digital Signature

这是bob必须做的事情,以确保消息来自alice

// 0) Bob receives encrypted msg plus digital signatrue
var msg = RecieveMsg();
var digitalSignature = GetDigSgnatureFromMsg(msg);
var encryptedMessage = GetEncyptedMsgFromMsg(msg);

// 1) Decrypt the msg
var plainText = AssymetricEncryption.Decrypt(encryptedMessage , bobPrivateKey ); // = YES

/*  now cause bob also received a digital signature let's do more steps to guaranty that the message came from Alice */

// 2) get Alice public key
var alicePubKey = GetAlicePubKey();

// 2) Create the same hash that Alice created for the msg
var ciphertext = AssymetricEncryption.Encrypt(plainText , bobPubKey ); // here plainText = YES
var hashOfEncMsg = Sha1(ciphertext);

// 3) Decrypt DigitalSignature hash with Alice public key
var aliceHash = AssymetricEncryption.Decrypt(digitalSignature , alicePublicKey); 

// 4) Here alice Hash must equal hashOfEncMsg 
if( hashOfEncMsg != aliceHash ) { throw new exception("Message has been modified or it does not come from Alice!");

所以我的问题是在最后一步4,其中Alice散列必须等于hashOfEncMsg。为什么如果这个验证成真鲍勃可以保证消息来自Alice?

我相信Tom仍然可以修改这条消息,以下是:(我可能在某处错了;数字签名不是他们声称的那样)。

  1. Tom拦截Alice msg

  2. Tom知道该消息具有数字签名,因此他生成一个密钥组合,其中他的公钥与Alice的公钥相同。 (汤姆的私钥与爱丽丝不同)

  3. Tom使用Bob的公钥加密“否”

  4. Tom创建了一个数字签名,就像Alice一样,但是使用了他的私钥

  5. 当鲍勃收到消息后,他用私钥解密了,他看到“没有”

  6. bob然后将验证sigature以查看该消息是否来自alice

  7. bob用他的公钥加密“否”并计算哈希值。那是= hash1

  8. bob解密获取的alice公钥与tom的相同。

  9. 用那个键然后bob解密dig签名。解密挖掘签名应该等于hash1! 。

  10. 鲍勃现在认为爱丽丝发了一个NO!


  11. 修改

    根据我收到的回复,以下是问题的解决方案:

    Bob可以保证邮件来自Alice,因为Tom无法生成与Alice公钥在数学上相关的私钥。换句话说,第2步(汤姆知道消息有数字......)需要很多时间。因此,如果Alice在合理的时间内回复,那么Bob可以保证消息来自Alice。

2 个答案:

答案 0 :(得分:2)

汤姆必须加密“不!”使用可以使用Alice的公钥解密的私钥,他不能使用自己的私钥。

这意味着Tom需要私钥/公钥对,但他只知道公钥。从公钥计算私钥在计算上非常困难(在合理的时间内实际上是不可能的)。

答案 1 :(得分:1)

汤姆的行动方案的第2步将是有问题的。给定的公钥具有一个且仅一个 - 对应的私钥。为了计算它,Tom需要分解一个非常大的整数(实际上是2个非常大的素数的乘积)。无法在合理的时间内解决该任务是RSA加密所依据的事情。