網絡安全課相關知識:html
RSA預備知識c++
1.1 快速冪算法算法
顧名思義,快速冪就是快速算底數的$n$次冪。其時間複雜度爲${\rm{O(log n)}}$,與樸素的$O\left( n \right)$相比,效率有了極大的提升。具體能夠參考百度百科:快速冪。安全
1.2 擴展歐幾里得算法網絡
擴展歐幾里得算法(英語:Extended Euclidean algorithm)是歐幾里得算法(又叫展轉相除法)的擴展。已知整數a、b,擴展歐幾里得算法能夠在求得a、b的最大公約數的同時,能找到整數x、y(其中一個極可能是負數),使它們知足貝祖等式ide
ax+by=gcd(a,b).
ax+by=gcd(a,b).
若是$a$是負數,能夠把問題轉化成測試
$\left| a \right|\left( { - x} \right){\rm{ }} + {\rm{ }}by{\rm{ }} = {\rm{ }}gcd\left( {\left| a \right|,b} \right)$($\left| a \right|$爲a的絕對值),而後令$x\prime {\rm{ }} = {\rm{ }}\left( { - x} \right)$。具體能夠參考維基百科:擴展歐幾里得。ui
1.3 米勒-拉賓素性檢驗算法加密
要測試${\rm{N}}$是否爲素數,首先將${\rm{N - 1}}$分解爲${2^s}d$。在每次測試開始時,先隨機選一個介於$[1,N - 1]$的整數$a$,以後若是對全部的$r \in [0,s - 1]$,若${a^d}\bmod N \ne 1$且${a^{{2^r}d}}\bmod N \ne - 1$,則$N$是合數。不然,$N$有$3/4$的機率爲素數。idea
構成該算法的思想是,若是${a^d} \ne 1\left( {{\rm{mod n}}} \right)$以及$n = 1{\rm{ }} + {\rm{ }}{2^s}d$是素數,則值序列
admodn,a2dmodn,a4dmodn,…,a2sdmodn
admodn,a2dmodn,a4dmodn,…,a2sdmodn
將以$1$結束,並且在頭一個$1$的前邊的值將是$n-1$(當$p$是素數時,對於${y^2} \equiv 1\left( {mod p} \right)$,僅有的解是$y \equiv \pm 1\left( {mod p} \right)$,由於$\left( {y + 1} \right)\left( {y - 1} \right)$必須是$p$的倍數)。注意,若是在該序列中出現了$n-1$,則該序列中的下一個值必定是$1$,由於${\left( {n-1} \right)^2} \equiv {n^2}-2n + 1 \equiv 1\left( {mod n} \right)$。具體能夠參考維基百科:米勒-拉賓素性檢驗。
1、RSA加密簡介
RSA加密是一種非對稱加密。能夠在不直接傳遞密鑰的狀況下,完成解密。這可以確保信息的安全性,避免了直接傳遞密鑰所形成的被破解的風險。是由一對密鑰來進行加解密的過程,分別稱爲公鑰和私鑰。二者之間有數學相關,該加密算法的原理就是對一極大整數作因數分解的困難性來保證安全性。一般我的保存私鑰,公鑰是公開的(可能同時多人持有)。
2、RSA加密、簽名區別
加密和簽名都是爲了安全性考慮,但略有不一樣。常有人問加密和簽名是用私鑰仍是公鑰?其實都是對加密和簽名的做用有所混淆。簡單的說,加密是爲了防止信息被泄露,而簽名是爲了防止信息被篡改。這裏舉2個例子說明。
第一個場景:戰場上,B要給A傳遞一條消息,內容爲某一指令。
RSA的加密過程以下:
(1)A生成一對密鑰(公鑰和私鑰),私鑰不公開,A本身保留。公鑰爲公開的,任何人能夠獲取。
(2)A傳遞本身的公鑰給B,B用A的公鑰對消息進行加密。
(3)A接收到B加密的消息,利用A本身的私鑰對消息進行解密。
在這個過程當中,只有2次傳遞過程,第一次是A傳遞公鑰給B,第二次是B傳遞加密消息給A,即便都被敵方截獲,也沒有危險性,由於只有A的私鑰才能對消息進行解密,防止了消息內容的泄露。
第二個場景:A收到B發的消息後,須要進行回覆「收到」。
RSA簽名的過程以下:
(1)A生成一對密鑰(公鑰和私鑰),私鑰不公開,A本身保留。公鑰爲公開的,任何人能夠獲取。
(2)A用本身的私鑰對消息加簽,造成簽名,並將加簽的消息和消息自己一塊兒傳遞給B。
(3)B收到消息後,在獲取A的公鑰進行驗籤,若是驗簽出來的內容與消息自己一致,證實消息是A回覆的。
在這個過程當中,只有2次傳遞過程,第一次是A傳遞加簽的消息和消息自己給B,第二次是B獲取A的公鑰,即便都被敵方截獲,也沒有危險性,由於只有A的私鑰才能對消息進行簽名,即便知道了消息內容,也沒法僞造帶簽名的回覆給B,防止了消息內容的篡改。
可是,綜合兩個場景你會發現,第一個場景雖然被截獲的消息沒有泄露,可是能夠利用截獲的公鑰,將假指令進行加密,而後傳遞給A。第二個場景雖然截獲的消息不能被篡改,可是消息的內容能夠利用公鑰驗籤來得到,並不能防止泄露。因此在實際應用中,要根據狀況使用,也能夠同時使用加密和簽名,好比A和B都有一套本身的公鑰和私鑰,當A要給B發送消息時,先用B的公鑰對消息加密,再對加密的消息使用A的私鑰加簽名,達到既不泄露也不被篡改,更能保證消息的安全性。
總結:公鑰加密、私鑰解密、私鑰簽名、公鑰驗籤。
參考博客1.:https://blog.csdn.net/business122/article/details/77882234
2.https://www.cnblogs.com/pcheng/p/9629621.html
3.c++實現:https://blog.csdn.net/Silenceneo/article/details/73656335