$$ 01 $$
經(jīng)過了幾次加密的嘗試后,牛郎終于明白,加密很重要,同時,也需要一種認(rèn)證機(jī)制。
如何才能將加密與認(rèn)證融為一體呢?
牛郎想到了之前的“散列算法”,這個方式可以融入一些認(rèn)證因素,但是,還不夠強(qiáng)。
從原則上講,能解密信息的人,一定就應(yīng)該是我們指定的接收人才對。
·
但是,事實(shí)并非如此。前面嘗試過的“AES加密方法”,是完全依賴與秘鑰的。
整個過程只有一個秘鑰,多人使用一個秘鑰,一旦有人秘鑰不慎將丟失,那么,拿到秘鑰的人就能解密信息了。
而且,最讓人頭疼的時,讓兩個人都拿到這個相同的秘鑰,本身就是個麻煩事。
好不容易想出來了“秘鑰交換策略”,卻因?yàn)闊o法認(rèn)證身份,從而有“中間人攻擊”的漏洞。
·
那么,怎樣才能安全地加密呢?
按上面總結(jié)的幾個點(diǎn),可能還是要從“秘鑰”上做文章。
既然兩人或多人都知道秘鑰,會增加泄露風(fēng)險,那能否只有一人知道秘鑰?
既然“交換秘鑰”存在風(fēng)險,那能否不要有秘鑰交換過程?
·
牛郎怎么想,都覺得不可能呀,解密,必然要用到加密時的秘鑰啊。
只有一個人知道秘鑰,而且不與對方交換,那么,接收方就不知道秘鑰,該怎么解密信息呢?
突然,牛郎靈機(jī)一動:
除非……加密和解密使用的秘鑰不同!
·
----
$$ 02 $$
試想一下,如果加密、解密使用的秘鑰不同的話,那么,確實(shí)就不需要秘鑰傳遞過程了。
比如說,牛郎要給織女傳遞信息,織女只要妥善保存好“解密秘鑰”就足夠了,這個根本也不需要告訴牛郎。
而“加密秘鑰”則公開出去,牛郎可以用它加密,別人也可用用它加密,但大家都沒有織女的“解密秘鑰”,無法解密出原文。
由于自始至終,“解密秘鑰”都是織女自己保管,從未進(jìn)行過傳遞,因此理論上可以保證其安全性。
這好像是一個相對完美的方案。
·
當(dāng)然,大家應(yīng)該也想到了,既然“加密秘鑰”被公開了出去,那么任何人都可以給織女發(fā)送加密信息。
怎么知道,發(fā)送者,一定是牛郎呢?
·
這里,還是要從秘鑰方面入手,“加密秘鑰”與“解密秘鑰”要能夠互換。怎么說呢?
我們把織女手中那個從未公開的秘鑰,暫且成為“私鑰”,而把她公之于眾的秘鑰稱為“公鑰”。
現(xiàn)在的情況是,用“公鑰”加密,用“私鑰”解密。
我們希望是,如果織女反過來用“私鑰”加密的話,那么用“公鑰”也能夠成功解密。
也就是兩把鑰匙,用一把加密的話,就必須且只能用另一把解密。
·
這樣能解決什么問題呢?
因?yàn)閯偛盘岬搅?,“私鑰”從未公開過,因此只有織女一人知道。
那么,如果出現(xiàn)了一段信息,可以用“公鑰”解密,那么就可以斷定,這段信息一定是織女發(fā)送的。
因?yàn)椤肮€”可以解密意味著只能是“私鑰”加密的,而擁有“私鑰”的,只有織女一人。
不過大家都有“公鑰”,因此這加密的信息相當(dāng)于明文,但卻足以發(fā)送者身份。
·
----
$$ 03 $$
怎么樣,綜合一下,是不是就有一種集身份驗(yàn)證、密鑰安全于一體的加密方式了呢?
先不說這個加密方法該怎么實(shí)現(xiàn),單從理論上說,是的。
·
織女保存自己的“織女私鑰”,對外公布“織女公鑰”。
牛郎保存自己的“牛郎私鑰”,對外公布“牛郎公鑰”。
牛郎給織女發(fā)消息時,先用“織女公鑰”加密,然后將加密后的信息,用自己的“牛郎私鑰”再次加密。
接著就可以發(fā)送出去了。
·
織女和監(jiān)聽者們都會收到這個消息。
由于“牛郎公鑰”是公開的,大家發(fā)現(xiàn)可以用這個公鑰解密出內(nèi)容,因此可以確認(rèn)這一定是手中有“牛郎私鑰”的牛郎發(fā)送的。
雖然所有人都知道這來自牛郎,也解密出了內(nèi)容,但剛才說了,這內(nèi)容是被“織女公鑰”加密過的。
此時,只有織女手中的“織女私鑰”,才能解密出最終的信息。而監(jiān)聽者們卻無能為力。
·
同理,織女給牛郎發(fā)送信息時,也是一樣的策略,經(jīng)過兩次加密,既確認(rèn)了身份,又保證了信息安全。
·
當(dāng)然,理論上可行的東西,真正實(shí)踐起來,總是困難重重。
首先,該怎么去設(shè)計這種神奇的加密方法呢?
其次,既然“公鑰”與“私鑰”可以互相加解密,那么,它們之間必然存在著某種數(shù)學(xué)上的聯(lián)系,
如何確保外界知道“公鑰”前提下,無法猜測或者推算出“私鑰”呢?
·
----
$$ 04 $$
那么,接下來的問題,又是一個數(shù)學(xué)問題了。
牛郎再次翻遍數(shù)學(xué)典籍,在一本《數(shù)論》的典籍中,終于找到了一條重要思路:
尋找兩個大素數(shù)比較簡單,而將它們的乘積進(jìn)行因式分解卻極其困難。
·
接下來的過程,可能有點(diǎn)燒腦(這里“*”表示乘法,“/”表示除法):
1.選擇兩個不同的素數(shù)p和q,計算n=p*q,m=(p-1)*(q-1)。
2.隨便選擇一個比p和q都大,但比n小的數(shù)e,這就是我們的“公鑰”了。
·
是不是不難?接下來要用數(shù)學(xué)方法計算私鑰:
私鑰d=(km+1)/e,其中m、e就是上面1、2兩步提到的數(shù)字。
既然是除法,則可能會有余數(shù),而私鑰d是個整數(shù),這怎么辦呢?
k的作用就發(fā)揮出來了,讓k=1,2,3,……一直嘗試,總會有一個k,可以得到整數(shù)私鑰d的。
·
我們需要的,是公開信息n和e,而秘密保存d。其他的p、q、n、m、k,統(tǒng)統(tǒng)銷毀掉,不要讓任何人知道。
·
第一個問題,私鑰d是安全的嗎?
理論上,是的。因?yàn)閐從未傳遞過,而且,通過公開的n和e,要推算出d,幾乎是不可能的。
既然知道n是p*q的結(jié)果,那能通過n反推p和q嗎?
基本不可能,因?yàn)槟壳皼]有快速的質(zhì)數(shù)因數(shù)分解方法,而逐個嘗試的話,計算量是可怕的。
當(dāng)n足夠大時,這其中的計算量,可能需要幾年時間,這完全可以認(rèn)為是安全的了。