数字签名如何保证邮件已由';爱丽丝;
本文关键字:爱丽丝 何保证 数字签名 | 更新日期: 2023-09-27 18:20:23
我相信我理解数字签名是如何工作的,但我仍然不明白它是如何保证消息已由已知发件人(Alice)加密的。
让我们假装爱丽丝想给鲍勃发个消息。Alice和bob上周见过面,bob正在等待yes
或no
的回复。Tom是中间的黑客
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。为什么如果这个验证实现了,Bob可以保证消息来自Alice?
我相信Tom仍然可以修改这条消息,方法如下:(我可能在某个地方错了;数字签名不可能不是他们声称的那样)。
汤姆拦截爱丽丝短信
Tom知道消息有一个数字签名,所以他生成了一个密钥组合,其中他的公钥将与Alice的公钥相同。(汤姆的私钥与爱丽丝的不同)
Tom用Bob的公钥加密"否"
Tom像Alice一样创建了一个数字签名,但使用了他的私钥
当bob收到消息时,他用私钥将其解密,并看到"否"
然后bob将验证签名,看看消息是否来自alice
bob用他的公钥加密"否"并计算散列。即=
hash1
bob解密get的alice公钥,该公钥与tom的相同。
然后bob用这个密钥解密dig签名。解密该挖掘签名应等于
hash1
。鲍勃现在认为爱丽丝发了一个"不"!
编辑
根据我收到的回复,以下是问题的解决方案:
Bob可以保证消息来自Alice,因为Tom将无法生成与Alice公钥在数学上相关的私钥。换句话说,第2步(Tom知道消息有数字…)将需要大量时间。因此,如果爱丽丝在合理的时间内回复,那么鲍勃可以保证消息来自爱丽丝。
Tom必须用一个可以用Alice的公钥解密的私钥加密"No!",他不能使用自己的私钥。
这意味着Tom需要一对私钥/公钥,但他只知道公钥。从公钥计算私钥在计算上非常困难(在合理的时间内实际上是不可能的)。
Tom的操作过程的第2步会有问题。给定的公钥有一个——而且只有一个——对应的私钥。为了计算它,Tom需要对一个非常大的整数(实际上是两个非常大素数的乘积)进行因子分解。RSA加密的基础是无法在合理的时间内解决该任务。