RSA公钥体系 与在 ssh中免密的登陆的应用
一、秘鑰體系
????第一部分查看書籍為 北京大學(xué)出版社出版的 丘維聲老師的 數(shù)學(xué)思維方式與創(chuàng)新
????在之前安全協(xié)議的講解中,很多的協(xié)議都是用了秘鑰的這一概念,相信很多同學(xué)對(duì)這不求甚解,下面我來系統(tǒng)的介紹秘鑰體系,并且證明一下如今的公鑰私鑰RSA密碼系統(tǒng)。
秘鑰,即密鑰,在密碼學(xué)中,密鑰(key,又常稱金鑰)是指某個(gè)用來完成加密、解密、完整性驗(yàn)證等密碼學(xué)應(yīng)用的秘密信息。在對(duì)稱密碼學(xué)(或稱密鑰密碼學(xué))中,加密和解密用的是同一個(gè)鑰匙,因此鑰匙需要保密。而在公鑰密碼學(xué)(或稱非對(duì)稱密碼學(xué))中,加密和解密用的鑰匙不同:通常一個(gè)是公開的,稱為公鑰;另一個(gè)保密,稱為私鑰。
1.1 傳統(tǒng)加密
????傳統(tǒng)的加密方法是加密、解密使用同樣的密鑰,由發(fā)送者和接收者分別保存,在加密和解密時(shí)使用。但這帶來一個(gè)問題是密鑰的生成、注入、存儲(chǔ)、管理、分發(fā)等很復(fù)雜,特別是隨著用戶的增加,密鑰的需求量成倍增加。
1.2 RSA密碼系統(tǒng)(重點(diǎn))
????1976年美國(guó)斯坦福大學(xué)的兩名學(xué)者迪菲和赫爾曼提出了公開密鑰密碼體制的概念。所謂的公開密鑰密碼體制就是使用不同的加密密鑰與解密密鑰,是一種“由已知加密密鑰推導(dǎo)出解密密鑰在計(jì)算上是不可行的”密碼體制。
????為了論述清楚計(jì)算上不可行的問題,我們給出一下定理:
1.3 歐拉函數(shù)
????在數(shù)論,對(duì)正整數(shù)n,歐拉函數(shù)是小于或等于n的正整數(shù)中與n互質(zhì)的數(shù)的數(shù)目(因此φ(1)=1)。
下面我們給出歐拉函數(shù)的計(jì)算公式:
φ(n)=n(1?1p1)(1?1p2)…(1?1pk),n=p1α1p2α2?pnαn\varphi (n) =n(1-\frac{1}{p_1})(1-\frac{1}{p_2})\ldots(1-\frac{1}{p_k}), n=p_1^{{\alpha}_1}p_2^{{\alpha}_2}\cdots p_n^{{\alpha}_n}φ(n)=n(1?p1?1?)(1?p2?1?)…(1?pk?1?),n=p1α1??p2α2???pnαn??
其中p1, p2……pn為x的所有質(zhì)因數(shù),x是不為0的整數(shù)
那么是如何證明的呢?下面我給出一個(gè)比較簡(jiǎn)單的證明方法(容斥定理)
1.4 歐拉定理
????在數(shù)論中,歐拉定理,(也稱費(fèi)馬-歐拉定理)是一個(gè)關(guān)于同余的性質(zhì)。歐拉定理表明,若n,a為正整數(shù),且n, a互質(zhì),則:
1.5 公鑰私鑰體系的引入
知道這兩個(gè)定理之后,讓我們聯(lián)想一下加密的過程:
發(fā)送方A需要向接收方B發(fā)送報(bào)文,首先在發(fā)送方 A 通過 a 的冪進(jìn)行加密,將加密后的內(nèi)容發(fā)送給B,然后 接收方B 通過 b 的冪進(jìn)行還原。而且對(duì)于取模的冪運(yùn)算可以通過快速冪算法在 log(a) 的復(fù)雜度下完成,過程如下圖7-2所示
下面我們給出一個(gè)公鑰私鑰的方案,查看他是否可行:
接收方 B,自己設(shè)計(jì)出 a, b, n,其中 a, b, n滿足的關(guān)系為ab≡kφ(n)+1ab\equiv k{\varphi}(n)+1ab≡kφ(n)+1 ,接收方 B,將其中的 作為公鑰,公布在互聯(lián)網(wǎng)上,將 b 作為私鑰,內(nèi)部保留,那么上述的過程就可以得以實(shí)現(xiàn),即該算法是可行的。
????下面,我們來考慮一下,這種機(jī)制是否安全,當(dāng)攻擊者 接收到 x ̄a\overline{x}^{a}xa,能否通過公布在互聯(lián)網(wǎng)上的公鑰 (a,n)(a, n)(a,n),計(jì)算出 bbb,進(jìn)而解密,獲取發(fā)送方A的原內(nèi)容 即 ?
????在公式 ab≡kφ(n)+1ab\equiv k{\varphi}(n)+1ab≡kφ(n)+1中,已知 ,倘若攻擊者知道aaa和φ(n)\varphi (n)φ(n) ,就可以使用擴(kuò)展的歐幾里得算法,可以在 log(n)log(n)log(n)的復(fù)雜度內(nèi),找到未知數(shù) b, k 的一組解決方案,完成密碼破解。
1.6 歐幾里得算法與擴(kuò)展歐幾里得算法
????這里,我簡(jiǎn)單介紹一下歐幾里得算法和擴(kuò)展歐幾里得算法
歐幾里得算法
????首先,我們將a, b的最大公約數(shù)greatest common divisor,記作gcd(a, b)
????歐幾里得算法就是為了求出兩個(gè)數(shù)a、b的最大公約數(shù),他利用gcd(a, b) == gcd(b, a%b),將問題不多進(jìn)行遞歸求解,使用 c 語言書寫的代碼如下(本人手寫)
擴(kuò)展的歐幾里得算法
??是對(duì)于歐幾里得算法的擴(kuò)展,在原本求解gcd(a, b)的基礎(chǔ)之上,求解 的問題。
對(duì)應(yīng)的c++代碼如下,證明過程即為代碼的第一段注釋(本人手寫):
1.7 公鑰私鑰的具體實(shí)現(xiàn)
????通過剛剛的擴(kuò)展的歐幾里得算法,可以在破解者在已知 (a,φ(n))(a, \varphi (n))(a,φ(n))的前提下,可以在O(log(N)O(log(N)O(log(N) 的時(shí)間復(fù)雜度下求出 中的bbb, 破解出私鑰,但是知道破解者知道 nnn,就可以求出 φ(n)\varphi(n)φ(n)嗎?之前已經(jīng)證明過歐拉函數(shù)的公式,如下所示:
??下面對(duì) $\varphi (n) $的求解,轉(zhuǎn)移為了將 n 進(jìn)行質(zhì)數(shù)分解,分解成以下形式:
??那么,該分解的復(fù)雜度為多少了?復(fù)雜度為O(n)O(\sqrt {n})O(n?) ,當(dāng)我們n很大時(shí),比如 106010^{60}1060,此時(shí)普通計(jì)算機(jī)的求解就需要100年。
但是,攻擊者無法求解出 φn\varphi{n}φn,接收方B是如何求解 的呢?原來,接收方僅僅只需要選取兩個(gè)大的質(zhì)數(shù),p, q,然后讓 n=pqn=pqn=pq,因此可得 φ(n)=(p?1)(q?1)\varphi (n)=(p-1)(q-1)φ(n)=(p?1)(q?1),求解完畢。
????至此,公開密鑰密碼體制基本概念講解完畢!
二、ssh密鑰登錄原理與實(shí)現(xiàn)免密登陸
第二部分參考博客
公鑰和私鑰都屬于非對(duì)稱加密算法的一個(gè)實(shí)現(xiàn),這個(gè)加密算法的信息交換過程是:(乙向甲請(qǐng)求遠(yuǎn)程登錄)
也就是說,請(qǐng)求登陸他人計(jì)算機(jī)的 客戶機(jī) 需要有自己的公鑰和私鑰,并將自身公鑰發(fā)送給 被登錄機(jī) (服務(wù)機(jī))
????非對(duì)稱加密算法不能使用相同的密鑰進(jìn)行解密,也就是說公鑰加密的只能使用私鑰進(jìn)行解密。
這一部分可以通過第一部分的證明得知 ab≡kφ(n)+1ab\equiv k\varphi (n) + 1ab≡kφ(n)+1,僅僅使用 aaa,或者是 僅僅使用 bbb 是沒有這個(gè)等式關(guān)系的
2.1 免密登陸過程
ssh使用私鑰登錄大致步驟就是:主機(jī)A(客戶端)創(chuàng)建公鑰私鑰,并將公鑰復(fù)制到主機(jī)B(被登陸機(jī))的指定用戶下,然后主機(jī)A使用保存私鑰的用戶登錄到主機(jī)B對(duì)應(yīng)保存公鑰的用戶。
(1) 實(shí)驗(yàn)環(huán)境
兩臺(tái)主機(jī):
(2) 實(shí)驗(yàn)開始
在需要免密登陸的主機(jī)(主機(jī)A)下生成公鑰和私鑰
說明:命令執(zhí)行后會(huì)有提示,輸入三次回車即可,執(zhí)行完成后會(huì)在當(dāng)前用戶的.ssh目錄下生成兩個(gè)文件:id_rsa、id_rsa.pub文件,前者時(shí)私鑰文件,后者是公鑰文件(拷貝到其他主機(jī)只需要拷貝這個(gè)文件的內(nèi)容)
將公鑰復(fù)制到被登陸的主機(jī)上的 ~/.ssh/authorized_keys 文件中
拷貝公鑰有兩種方法,其原理都相同:
方式一:使用 ssh-copy-id 直接拷貝
使用 ssh-copy-id 進(jìn)行拷貝公鑰非常方便,只需要指定目標(biāo)主機(jī)和目標(biāo)主機(jī)的用戶即可。
執(zhí)行這條命令后會(huì)自動(dòng)將登錄主機(jī)的公鑰文件內(nèi)容追加至目標(biāo)主機(jī)中指定用戶(root).ssh目錄下的authorized_keys文件中。這個(gè)過程是全自動(dòng)的,非常方便。
方法二:自己創(chuàng)建文件進(jìn)行拷貝
2.2 免密登陸
登錄
使用主機(jī)A乙root用戶身份登陸到主機(jī)B
????首次登錄將彈出保存信息,輸入yes即可,此時(shí)已經(jīng)實(shí)現(xiàn)了免密的密鑰登陸。
注意事項(xiàng)和說明
????上例只能實(shí)現(xiàn)主機(jī)A免密登陸到主機(jī)B的root用戶,如果想讓主機(jī)B也免密登錄到主機(jī)A,創(chuàng)建密鑰和拷貝步驟相同。
????密鑰登陸的方式只能登錄被登錄機(jī)中 .ssh 目錄下有對(duì)應(yīng)公鑰的用戶,如果想讓所有用戶都可以被登錄則需要將authorized_keys文件的內(nèi)容追加到其他用戶的 ~/.ssh/authorized_keys 文件中。
????如果使用自己創(chuàng)建的authorized_keys文件進(jìn)行復(fù)制公鑰則要嚴(yán)格設(shè)置權(quán)限,權(quán)限不正確會(huì)導(dǎo)致文件無法使用,也就無法進(jìn)行密鑰驗(yàn)證。
再次說明,第二部分參考至博客園的一個(gè)博客
總結(jié)
以上是生活随笔為你收集整理的RSA公钥体系 与在 ssh中免密的登陆的应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SparkCore基础
- 下一篇: excel打开csv错误换行_「乱吐槽·