C# 数字签名如何保证';爱丽丝';

C# 数字签名如何保证';爱丽丝';,c#,cryptography,digital-signature,encryption-asymmetric,C#,Cryptography,Digital Signature,Encryption Asymmetric,我相信我了解数字签名是如何工作的,但我仍然不明白它是如何保证消息已被已知发件人(Alice)加密的 让我们假装爱丽丝想给鲍勃发个信息。Alice和bob上周会面,bob正在等待回复,要么是yes,要么是no。汤姆是中间的黑客 1.无数字签名的场景: 这种方法的问题是Tom可能截获了消息encryptedMessage,并将该消息替换为var newEncryptedMsg=AssymetricEncryption.Encrypt(“NO!”,bobPubKey)当bob收到消息时,他不知道该消息

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

让我们假装爱丽丝想给鲍勃发个信息。Alice和bob上周会面,bob正在等待回复,要么是
yes
,要么是
no
。汤姆是中间的黑客

1.无数字签名的场景: 这种方法的问题是Tom可能截获了消息
encryptedMessage
,并将该消息替换为
var newEncryptedMsg=AssymetricEncryption.Encrypt(“NO!”,bobPubKey)当bob收到消息时,他不知道该消息已被Tom修改

2.使用数字签名的场景 以下是bob必须做的事情,以确保消息来自alice

所以我的问题是在最后一步4中,Alice hash必须等于hashOfEncMsg。为什么如果这个验证实现了,Bob可以保证消息来自Alice

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

  • 汤姆截获了爱丽丝的邮件

  • Tom知道消息有数字签名,所以他生成了一个密钥组合,其中他的公钥将与Alice的相同。(汤姆的私钥与爱丽丝的不同)

  • 汤姆用鲍勃的公钥加密“否”

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

  • 当bob收到消息时,他用私钥将其解密,并看到“否”

  • 然后,bob将验证签名,以查看消息是否来自alice

  • bob用他的公钥加密“否”,并计算哈希值。即=
    hash1

  • bob解密get的alice公钥,该公钥与tom的相同

  • 然后bob用该密钥解密dig签名。解密该dig签名应等于
    hash1

  • 鲍勃现在认为爱丽丝发了一封拒绝信


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

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

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


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

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

    这意味着生成具有公钥的私钥并不容易?在其他工作中,需要花费很长时间才能生成公钥等于常数的密钥组合。+1哦,我明白了,所以不可能在合理的时间内生成相同的公钥。您的解决方案是正确的。你的分析很好;如果Tom可以(1)从公钥推断Alice的私钥,或者(2)从公钥推断任何私钥,那么Tom可以执行您描述的攻击。密码系统被认为是安全的,可以抵御这种攻击;这两件事都很难做到。另一个你可能会想到的攻击是:Tom tricks Bob认为汤姆的公钥实际上与爱丽丝有关。密码系统的安全性依赖于Alice有一个安全机制,通过该机制可以告诉Bob她的公钥。然而,你认为Alice需要在“合理的时间”内回复的结论并不能完全理解什么是“合理的”。如果密码系统真的很强大的话,Tom应该需要数千年、数百万年或数十亿年的时间才能推导出Alice的私钥,并给出她的公钥。请记住,RSA被认为是安全的,因为我们认为很难计算出大的数字;我们没有确凿的证据证明这一说法。如果传统计算机或量子计算机能够快速计算出大量数据,那么系统就根本不安全。
    // 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);
    
    // 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
    
    // 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!");