加密技術包括兩個元素:算法和密鑰。算法是將普通的信息或者能夠理解的信息與一串數字(密鑰)結合,產生不可理解的密文的步驟,密鑰是用來對數據進行編碼和解密的一種算法。在安全保密中,可經過適當的鑰加密技術和管理機制來保證網絡的信息通訊安全。golang
經常使用的加密解密方法主要有如下加大類:算法
基本加密方法c#
對稱加密方法安全
非對稱加密方法服務器
下面咱們簡單介紹一下這幾種加密碼方法網絡
咱們先來了解一下加密解密的技術。函數
數據加密和數據解密是一對逆過程。學習
先來看加密解密的公式:網站
加密:編碼
數據加密是用加密算法E和加密密鑰K1將明文P轉換成密文C 用上面公式表示。
解密:
數據解密是數據加密的逆過程, 解密算法D和解密密鑰K2獎密文C轉換成明文P。
經過下圖咱們能夠清晰的看到,數據加密及解密的整修過程:
發送端將明文P 經過加密算法E與加密密鑰Ke,生成密文C,而後傳輸到接收端,接收端收到密文後經過解密算法D與解密密鑰Kd對密文C進行解密,最終還原明文P。
知道了加密的整個過程,咱們來看看上面所說的三種加密解密方式。
基本加密方法只要分爲:
位移法
按照必定的規則,從新安排明文中的比特或字符的順序來造成密文,而字符自己保持不變。
> 例如: `hello world!` 咱們能夠變爲: `lord l!oleh`, 只須要按照必定的規則解開就能夠了。
置換法
按照必定的規則,用一個字符去置換(替代)另外一個字符來造成密文。
> 咱們仍是以 `hello world!` 爲例,約定一個簡單的算法把`h`變成`9`,`r`>`c`, `l`>`#`,那麼獲得的結果就是: `9e##o woc##d!` 解密把它逆過來就行了,很是簡單。
對稱密鑰加密 又稱爲對稱加密、私鑰加密、共享密鑰加密,是密碼學中的一類加密算法。
這類算法在加密和解密時使用相同的密鑰,或是使用兩個能夠簡單地相互推算的密鑰。
實際上,這組密鑰成爲在兩個或多個成員間的共同祕密,以便維持專屬的通訊聯繫。
上面說得可能有點饒,舉個簡單的例子:
假設小明與小紅在考試,他們相互約定了一個算法: 當小明連續咳嗽三聲的時候小紅看着小明,若是小明摸了下左耳朵,那就說明小紅能夠給小明傳答案了。若是沒有,那多是小明感冒了...
而後怎麼傳答案呢? 小紅摸左耳朵表明A, 摸右耳朵表明B,左手摳鼻子表明C,右手摳鼻子表明D
怎麼樣,經過上面的個簡單的例子是否是比較好理解呢,對稱加密碼就是雙方約定好一個算法,經過這個算法進行加密解密。
經常使用的對稱加密碼主要分爲如下幾類:
DES
三重DES(TDEA)或3DES
RC-5
IDEA
AES
DES 主要採用替換和移位的方法加密,它用56位密鑰對64位二進制數據進行加密,每次加密可對64位輸入數據進行16輪編碼,經一系列替換和移位後輸入的64位原始數據轉換成了不一樣的64位輸出數據。DES算法運算速度快,密鑰產生容易。
三重DES 在DES的基礎上採用了三重DES,用兩個56位的密鑰k1和k2. 發送方k1加密,k2解密,再使用k1加密。接收方則使用k1解密,k2加密,再使用k1解密
RC-5 引入了一種新的密碼基本變換數據相依旋轉方法,即一箇中間的字是另外一箇中間的低位所決定的循環移位結果,以提升密碼強度
IDEA 是國際數據加密算法 是在DES算法的基礎上發展而來,相似於三重DES。密鑰長度爲128位。
AES 基於排列和置換運算。提成列是對數據從新進行安排,置換是將一個數據單元替換成另外一個。可使用128,192,256們的密鑰,而且用128位(16字節)分組加密和解密數據。
DES算法爲密碼體制中的對稱密碼體制,又被稱爲美國數據加密標準,是1972年美國IBM公司研製的對稱密碼體制加密算法。 明文按64位進行分組,密鑰長64位,密鑰事實上是56位參與DES運算(第八、1六、2四、3二、40、4八、5六、64位是校驗位, 使得每一個密鑰都有奇數個1)分組後的明文組和56位的密鑰按位替代或交換的方法造成密文組的加密方法。
下圖是它的加密流程:
DES的密鑰長度爲56位,這意味着加密時存在256個密鑰可供選擇,即72,057,594,037,927,936種可能性。
DES如今已經不是一種安全的加密方法,主要由於它使用的56位密鑰太短。DES破解機包括1,856個自定義的芯片,能夠在數天內破解一個DES密鑰—本圖顯示了使用數個Deep Crack芯片搭成的DES破解機
下圖就是專門破解DES加密的芯片:
AES爲分組密碼,分組密碼也就是把明文分紅一組一組的,每組長度相等,每次加密一組數據,直到加密完整個明文。在AES標準規範中,分組長度只能是128位,也就是說,每一個分組爲16個字節(每一個字節8位)。密鑰的長度可使用128位、192位或256位。密鑰的長度不一樣,推薦加密輪數也不一樣。
好比咱們家裏的無線路由器,通常使用的就是AES加密。
AES加密算法涉及4種操做:
字節替代
行移位
列混淆
輪密鑰加
字節替換,上面已經講過。
咱們能夠把加密的數據分解成 4x4 大小的表格,而後對錶格里的每一個空位進行替換而後移位,再進行列混淆加上密鑰,重複上面幾個步驟。
下圖是加密解密的流程圖:
字節代替的主要功能是經過S盒完成一個字節到另一個字節的映射。S盒的詳細構造方法能夠直接給出構造好的結果,S盒用於提供密碼算法的混淆性。
用兩張替換表能夠秀好的理解:
加密替換表:
解密替換表:
假設: 字節00000000B能過加密替換表x=0,y=0替換後的值爲(S0=)63H,再經過解密替換表便可獲得替換前的值x=6,y=3,(S-1 6=)00H。
行移位是一個4x4的矩陣內部字節之間的置換,用於提供算法的擴散性。
行移位分有:
正向行移位
假設矩陣的名字爲state,用公式表示:statei = statei;其中i、j屬於[0,3]。
逆向行移位
用公式表示:statei = statei;其中i、j屬於[0,3]。
正向行移位: 正向行移位用於加密,其原理圖以下。其中:第一行保持不變,第二行循環左移8比特,第三行循環左移16比特,第四行循環左移24比特。
逆向行移位: 逆向行移位便是相反的操做,即:第一行保持不變,第二行循環右移8比特,第三行循環右移16比特,第四行循環右移24比特。
利用GF(28)域上算術特性的一個代替,一樣用於提供算法的擴散性。
一樣的也有:
正向列混淆
逆向列混淆
對稱加密速度快可是安全性相對於非對稱加密來講低,爲何呢?
密鑰的交換須要創建在安全的通訊基礎上,而通訊自己是不可能絕對安全的
加密和解密使用相同的密鑰,若是信息泄露,提取到了密鑰,密文就會被輕易破解
沒法驗證發送者,能夠用相同的加密方式僞造密文,這時信息的來源就變得不可靠
密鑰每使用一次都被拋棄,須要從新生成密鑰
要想使用對稱加密,那麼分享信息的各個個體之間都須要分享這個密鑰,好比1000我的之間都使用同一個密鑰進行密文傳輸,只要其中一我的密鑰被盜竊了,那麼總體加密的信息將都被破解了。
那有什麼方法呢,這個時候就能夠引入另外一種加密算法 非對稱加密。
如何作到即便一我的的密鑰被盜竊了,最起碼保證你給其餘人發送密文不被破解?
簡單來講就是: 每一個人生成一個「私鑰-公鑰」對,這個私鑰須要每一個人自行進行保護!公鑰能夠隨便分享,同時,生成的這個「私鑰-公鑰」對還有個強大的功能就是,使用私鑰加密的信息,只能由該私鑰對應的公鑰才能解密,使用公鑰加密的信息,只能由該公鑰對應的私鑰才能解密!
仍是拿上面小明、小紅來舉例:
小明生成了他本身的一個「私鑰-公鑰」對,叫作「小明私鑰-小明公鑰」,小紅生成了他本身的一個「小紅私鑰-小明公鑰」對,以前咱們說過私鑰要每一個個體本身進行保存,公鑰能夠隨便分享,目的是爲何呢?是爲了加密信息!
有了公鑰、私鑰以後,小明在QQ羣裏與小紅說:
非對稱解密算法 即便別人截取了,也只是知道該公鑰而已,可是要是想解密使用該公鑰加密的密文!只有一我的能夠辦獲得!就是小紅! 爲何?
小明使用小紅的公鑰加密的信息,只有小紅的公鑰所對應的私鑰,這裏就是「小紅私鑰」,才能解密!因此,沒有小紅私鑰的第三方即時截取了這些密文,也破解不了!或者更嚴格的說在有限時間內好比說幾十上面年內很難進行暴力破解!
咱們來看看官方對非對稱加密的解釋
公開密鑰加密,也稱爲非對稱加密,一種密碼學算法類型,在這種密碼學方法中,須要一對密鑰(其實這裏密鑰說法很差,就是「鑰」),一個是私人密鑰,另外一個則是公開密鑰。這兩個密鑰是數學相關,用某用戶密鑰加密後所得的信息,只能用該用戶的解密密鑰才能解密。若是知道了其中一個,並不能計算出另一個。所以若是公開了一對密鑰中的一個,並不會危害到另一個的祕密性質。稱公開的密鑰爲公鑰;不公開的密鑰爲私鑰。
看明白了麼?是否是有一種WFT的感覺?
非對稱加密須要包含:
Private Key 私鑰
Public Key 公鑰
下圖是非對稱加密解密的過程圖:
大概意思就是,要想使用非對稱加密算法,首先要有一對key,一個爲private key私鑰,一個爲public key公鑰,而後能夠把你的public key分發給想給你傳密文的用戶,而後用戶使用該public key加密過得密文,只有使用你的private key才能解密,也就是說,只要你本身保存好你的private key,就能確保,別人想給你發的密文不被破解,因此你不用擔憂別人的密鑰被盜。
小明用小紅給的公鑰給明文進加密
小紅用本身的私鑰對密文進行解密
這種加密是單向的,因此被稱爲非對稱加密算法
Ok 咱們來總結一下 非對稱加密碼的特色
優勢:
容許在不安全的媒體上交換信息
解密的私鑰不發往任何用戶,即便密文泄露也不用擔憂被破解,由於沒有私鑰
能夠驗證消息的發送者
缺點:
加密速度較慢
這種加密算法應用很是普遍,SSH, HTTPS, TLS,電子證書,電子簽名,電子身份證等等。
咱們來舉一個比較經常使用的算法RSA加密解密算法
RSA加密算法是非對稱加密算法的一種,是三個牛逼的人一塊兒提出的。RSA就是下圖他們三人姓氏開頭字母拼在一塊兒組成的。
我猜左邊兩個會比右邊這個更聰明(看頭髮(ˉ︶ˉ))
咱們來看看公鑰與私鑰的產生一共有四個步驟:
選擇兩個大素數p和我(大於10100)
令n=pq和z=(p-1)(q-1)
選擇d與z的互質
選擇e,使e*d=1(mod z)
(n,e)是公鑰,(n,d)是私鑰
明文P被分紅了k位的塊,k是知足2k<n的最大整數,因而有了0<=P<n (n最好大於 1024)
什麼是互質關係?
若是兩個正整數,除了1之外,沒有其餘公因子,咱們就稱這兩個數是互質關係(coprime)。好比,15和32沒有公因子,因此它們是互質關係。這說明,不是質數也能夠構成互質關係。
任意兩個質數構成互質關係,好比13和61。
一個數是質數,另外一個數只要不是前者的倍數,二者就構成互質關係,好比3和10。
若是兩個數之中,較大的那個數是質數,則二者構成互質關係,好比97和57。
1和任意一個天然數是都是互質關係,好比1和99。
p是大於1的整數,則p和p-1構成互質關係,好比57和56。
p是大於1的奇數,則p和p-2構成互質關係,好比17和15。
任意給定正整數n,在小於等於n的正整數之中,有多少個與n構成互質關係?
計算這個值的方法就叫作歐拉函數,以φ(n)表示。在1到8之中,與8造成互質關係的是一、三、五、7,因此 φ(n) = 4。
若是n能夠分解成兩個互質的整數之積:
n = p1 × p2
則:
φ(n) = φ(p1p2) = φ(p1)φ(p2)
因此:
φ(56)=φ(8×7)=φ(8)×φ(7)=4×6=24
小明想給小紅髮送一個消息M,他知道小紅產生的公鑰(n,e)他使用起先與小紅約好的格式將M轉換爲一個小於n的整數m,好比他能夠將每個字轉換爲這個字的Unicode碼,而後將這些數字連在一塊兒組成一個新的數字。若是他的信息很是長的話,他能夠將這個信息分爲幾段,而後將每一段轉換爲m。用下面這個公式他能夠將m加密爲c
加密公式:
德龍獲得海豐的消息c後就能夠利用他的私鑰d來解碼。他能夠用如下這個公式來將c轉換爲m
解密公式:
假設:
p = 3, q = 11, n = 33, z = 20, d = 7, e = 3 C = P3(mod 33) P = C7(mod 33)
套用公式:
則:
C = 23(mod 33) = 8(mod 33) = 8 P = 87(mod 33) = 2097152(mod 33) = 2
z=(p-1)(q-1), n=pq, Mod 取餘數, (n,e)是公鑰, (n,d)是私鑰
設明文大P 爲2, 2是明文。8是密文
參照上面的公式,咱們寫一個很是很是很是很是簡單的例子:
最終得出的結果以下:
最大值在 32
, 最小值: 1
,明文不得超過 p * q
,因此p,q
必須大。
RSA 的另外一個最大的優勢是其在數字簽名中的應用。數字簽名的做用是確認消息來源的可靠性,保證信息的完整性和不能否認性。假如A要公開發布本身的文件,A先用HASH算法生成這個文件的消息摘要(或者叫信息指紋),再用 RSA 加密算法(A 的私鑰)對摘要進行加密。用戶想要下載 A 發佈的文件,須要同時下載文件和摘要,下載完畢後,用戶使用 A 的公鑰對摘要進行解密獲得 A 以前生成的摘要,而且用戶用一樣的 HASH 算法對下載到的文件生成一份摘要,比對這兩份摘要是否相等,若是相等,那麼能夠肯定兩件事情:文件是完整的,文件是 A 發佈的。
咱們從不少下載文件的網站都會看到一些 SHA256, MD5 碼,這就是對文件進行校驗的,驗證文件是否是官方發頁的,有沒有被竄改過。咱們看golang.org官方源碼包:
RSA的算法安全性是基於大素數分解的困難性,攻擊者能夠分解已知的n,獲得p和q,而後可獲得z,最後用Euclid算法由e和z獲得d。
咱們能夠在服務器上生成本身的公鑰私鑰,服務器須要安裝OpenSSL
:
私鑰:
下面是所生成的公鑰:
常見的 RSA 攻擊方法有:
直接分解模數n
對 RSA 的選擇密文攻擊
對 RSA 的同模攻擊
對 RSA 小指數的攻擊
RSA 的比特性攻擊
普遍的應用證實 RSA 體制的安全性是至關可靠的。RSA 密碼體制的安全性取決於其加密函數求逆的困難性,即大數因子分解的困難性。雖然至今在理論和實踐中還未能證實有分解大整數的有效方法,但大數因子分解未被證實爲是 NP 問題,隨着計算機計算能力的提升,原來被認爲不可能分解的某些大整數可能會被成功分解,這對 RSA 密碼體制的安全性構成潛在的威脅。
在將來比較長的時間範圍內(在不動用國家級計算機的狀況下),大約幾百年上千年,在不考慮量子計算和對密碼算法破解分析沒有太大突破的前提下,不大可能經過計算能力提高而使得現有的密碼算法獲得輕易地破解。
本人才書學淺,如有寫錯,或理解錯的地方,歡迎你們指正。
虛心向各們大佬們學習。
深情按壓, 小額讚揚, 您的讚揚就是我更新的動力。