常用加密算法分析和實(shí)現(xiàn)

一、前言

工作中有時候需要對數(shù)據(jù)進(jìn)行加密,就筆者從事的Android開發(fā)來說贴谎, 上層開發(fā)語言為Java/Kotlin,JDK本身提供了一套加解密接口季稳,可以很方便地調(diào)用加密/解密方法擅这。
但有時候需要在native層實(shí)現(xiàn)加密邏輯的封裝,這時候只能找C/C++的實(shí)現(xiàn)了景鼠。

當(dāng)前的加密算法可以大約分為三類:

  • 散列算法:MD5仲翎,SHA家族等;
  • 對稱加密:AES铛漓,DES等溯香;
  • 非對稱加密:RSA,DSA票渠,DH等逐哈。

MD5/SHA/AES等實(shí)現(xiàn)比較簡單,也很好找到问顷,但是對于RSA就沒那么好找了昂秃。
之前筆者就遇到需要在native層實(shí)現(xiàn)RSA場景。
去github上找代碼杜窄,很多都是簡單的demo演示(用long實(shí)現(xiàn)肠骆,幾十bits的密碼長度);
有的實(shí)現(xiàn)了大數(shù)塞耕,但是效率很低蚀腿;
而openssl等加密庫,則是牽涉很多文件,想抽取其中的實(shí)現(xiàn)莉钙,卻無從下手廓脆。
最后我想了個workaround的辦法:通過在Java的層封裝Util類來調(diào)用JDK的RSA實(shí)現(xiàn),然后在native層調(diào)用Util類的方法磁玉。

再后來遇到的場景是停忿,各個端需要用C++統(tǒng)一部分業(yè)務(wù)邏輯的實(shí)現(xiàn)。
不巧的是蚊伞,這部分邏輯也用到了RSA席赂。
這回就不能反射調(diào)用Java來實(shí)現(xiàn)了,因?yàn)镮OS和PC的平臺不依賴JVM时迫。
最終同事找了個C++的加密庫颅停,雖然該加密庫可讀性不好,文件很多掠拳,但總歸依賴比openssl要少癞揉。

在那之后,我開始在關(guān)注常用的加密方法的實(shí)現(xiàn)碳想,先后收集了AES烧董、SHA、ECC等加密方法的比較好的C語言實(shí)現(xiàn)(執(zhí)行快胧奔,依賴少)。
而RSA也通過參考JDK的實(shí)現(xiàn)预吆,以及查閱相關(guān)資料龙填,實(shí)現(xiàn)了C語言的版本。
最終拐叉,完成了包含AES-CBC, SHA256, HMAC-SHA25, RSA, ECDH, ECDSA等加密方法的收集岩遗。
代碼已上傳Github, 有需要的朋友可自行獲取。
項目地址:https://github.com/BillyWei01/EasyCipher

在收集的過程中查閱了一些資料凤瘦,梳理了一些知識點(diǎn)宿礁,這里和大家分享一下。

二蔬芥、散列算法

散列函數(shù)(也叫哈希函數(shù))的功能是把任意長度的輸入梆靖,通過哈散列算法,變換成固定長度的輸出(哈希值)笔诵。
這種轉(zhuǎn)換是一種壓縮映射返吻,也就是,哈希值的空間通常遠(yuǎn)小于輸入的空間乎婿,不同的輸入可能會散列成相同的輸出测僵。
有的說法是哈散列算法不算加密算法,因?yàn)橥ㄟ^哈希值無法還原唯一的原始輸入谢翎。
嚴(yán)格來說確實(shí)如此捍靠,但是不能否認(rèn)的是沐旨,哈希算法確實(shí)是用在了許多確保數(shù)據(jù)安全的地方,所以從這個角度來說榨婆,將其歸類為加密算法也沒太大問題希俩。

并非所有的哈希函數(shù)都適用于加密,比如普通的用于計算哈希表索引的函數(shù)就不適用纲辽。
用于加密的哈希函數(shù)通常需要具備一下特性:

  • 抗原像攻擊性: 對于隨意給定的h颜武,找到滿足H(x)=h的x在計算上不可行。
  • 抗弱碰撞性: 對于隨意給定的數(shù)據(jù)塊x拖吼,找到滿足H(y)=H(x)的y ≠ x在計算上不可行鳞上。
  • 強(qiáng)抗碰撞性:找到滿足H(x) = H(y)的隨意一對(x,y)在計算上不可行。

比方說JDK計算字符串hash的函數(shù):

    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

這個函數(shù)很顯然就不具備抗原像攻擊性吊档,比方說當(dāng)字符串為”A“篙议,其哈希值為65,也就是字符‘A’的ASCII碼值怠硼。

而像MurmurHash這樣的哈希函數(shù)鬼贱,有比較好的抗原像攻擊性,但不具備抗碰撞性香璃。
當(dāng)然这难,大家一般也不會用這類函數(shù)來做“加密”,而僅僅是用來計算哈希表索引葡秒。
但僅用來計算索引這樣的情況姻乓,也會因?yàn)椴痪邆淇古鲎残远簦热纭?由MurmurHash2算法碰撞引起的Redis DDos攻擊漏洞》這篇文章所述眯牧,攻擊者可以計算大量的具備相同哈希值的輸入蹋岩,造成redis哈希表的性能退化,從而使其無法正常提供服務(wù)学少。
為了解決這類攻擊剪个,JDK 1.8的方案是當(dāng)hash沖突過多時,將鏈表轉(zhuǎn)換為平衡樹版确,從而避免性能退化扣囊。
而redis的解決方案則是換一個哈希算法:SipHash
SipHash能夠有效減緩hash flooding攻擊阀坏。憑借這一點(diǎn)如暖,它逐漸成為 Ruby、Python忌堂、Rust 等語言默認(rèn)的哈希表實(shí)現(xiàn)的一部分盒至。

能做到減緩碰撞哈希值的構(gòu)造,已經(jīng)普通哈希算法是其極限了。
要做“加密”枷遂,還是需要強(qiáng)度足夠的哈希算法樱衷。
MD5是廣泛使用的加密哈希,但在2004被“破解”(在一定時間內(nèi)找到碰撞酒唉,并非找到原始輸入)矩桂;
而SHA-1目前也是被“破解”了,很多瀏覽器已經(jīng)不支持包含SHA-1的加密套件了痪伦。
目前廣泛使用的加密哈希為SHA-2家族侄榴,其中用的最多的是SHA-256。

雖然加密哈希具備較高強(qiáng)度的抗原像攻擊性和抗碰撞性网沾,但是僅靠其特性并不能確保數(shù)據(jù)安全癞蚕。

由于輸入x,會得到確定的輸入y, 所以對于一些較短的輸入辉哥,可能被暴力破解桦山,或者字典攻擊
如果是登錄系統(tǒng)醋旦,對應(yīng)的策略可以是:

  • 提高復(fù)雜度恒水,比方說很多地方需要輸入包含“大小寫字母和字符”之類的密碼;
  • 限制登錄次數(shù)饲齐;
  • 用比較耗時的哈希函數(shù)(如bcrypt)等钉凌。

暴力破解不單單針對哈希加密,對稱加密同樣有可能遭受暴力破解箩张。
有一類攻擊是僅針對哈希算法的:彩虹表攻擊甩骏。
對此類攻擊的對應(yīng)方法之一是“加鹽”。
網(wǎng)站記錄用戶密碼最好是記錄加鹽的哈希先慷,萬一不幸被拖庫了也不至于泄漏用戶密碼。
多年前有一些網(wǎng)站被曝泄漏用戶的賬號密碼咨察,甚至有的網(wǎng)站保存的是用戶的明文密碼论熙!有的用戶可能多個網(wǎng)站用同一個密碼,在一個網(wǎng)站泄漏了明文密碼摄狱,會波及其他網(wǎng)站注冊的賬號脓诡。
好在涉及交易和支付的系統(tǒng)都會設(shè)計二次認(rèn)證,否則影響會更嚴(yán)重媒役。

加密哈希有一種使用場景:消息認(rèn)證碼 (Message Authentication Code祝谚,簡稱MAC)。
MAC使用不當(dāng)?shù)脑捯矔馐芄艉ㄖ裕热?a target="_blank">長度擴(kuò)展攻擊交惯。
業(yè)界常用的MAC算法是HMAC。

HMAC過程示意圖如下:

i_pad是重復(fù)0x36,o_pad是重復(fù)0x5C席爽, 而SHA1的塊大小為64字節(jié)(MD5和SHA256也是64字節(jié))意荤,所以是重復(fù)64次。
如果key長度大于64字節(jié)只锻,則計算哈希值作為key玖像。
簡單概括,HMAC就是計算 H(key XOR o_pad, H(key XOR i_pad, message))齐饮。
在key小于塊大小時捐寥,只需要計算兩次哈希,速度很快祖驱。
像RSA結(jié)合SHA也可以對消息“簽名”握恳,但是RSA運(yùn)算比較耗時;
所以在加密通信中通常用非對稱加密來協(xié)商密鑰羹膳,后續(xù)會話用協(xié)商的密鑰來做對稱加密和HMAC運(yùn)算睡互。

三、對稱加密

對稱加密有很多種實(shí)現(xiàn)陵像,這里只講一下目前使用比較廣泛的是AES算法就珠。
AES是一種塊加密算法,塊大小為16字節(jié)醒颖。
其核心部分(塊加密的部分)妻怎,輸入和輸出都是16字節(jié),換種說法就是泞歉,函數(shù)的輸入和輸出是一一映射的逼侦。
相對的,哈希運(yùn)算的輸入空間大小不限腰耙,輸出空間是固定長度(所以僅憑hash值無法計算唯一的輸入值)榛丢。

AES的塊加密部分,需要經(jīng)過多輪運(yùn)算挺庞,密鑰長度(可以是128, 192, 256比特)越長晰赞,執(zhí)行的輪數(shù)越多;
每輪運(yùn)算有四個子運(yùn)算:字節(jié)替代选侨、行移位掖鱼、列混淆、 輪密鑰加援制。

  • 字節(jié)替代(SubBytes)
    通過查表(S盒)的方式戏挡,以字節(jié)為單位,用另一個字節(jié)替換當(dāng)前字節(jié)晨仑。
    這有點(diǎn)類似于代碼混淆褐墅,卻別在于代碼混淆是用另外一個字符串替換當(dāng)前的字符串拆檬。
    經(jīng)過混淆后,原文本來具備可讀性變得不可讀了掌栅;
    但是混淆后模式?jīng)]有改變秩仆,比如原來方法foo()混淆后變?yōu)閍(), 則混淆后所有調(diào)用foo()的地方都是a()。
    也就是猾封,字節(jié)替代后仍然存在統(tǒng)計特征澄耍。

  • 行位移(ShiftRows)
    行位移比較簡單,就是將16字節(jié)作為一個4行4列的矩陣晌缘,
    其中1齐莲、2、3行分別左移(逆運(yùn)算為右移)1磷箕、2选酗、3個字節(jié)。

  • 列混淆(MixColumns)
    和行位移一樣岳枷,將16字節(jié)劃分為4行4列芒填;
    不同的是,列混淆是分別對每一列的4個字節(jié)做運(yùn)算(和一個4x4的矩陣左乘)空繁。
    解密時也是左乘矩陣殿衰,解密矩陣是加密矩陣的逆矩陣。
    矩陣運(yùn)算需要進(jìn)行加法運(yùn)算和乘法運(yùn)算盛泡,計算機(jī)的直接整數(shù)相加和直接整數(shù)相乘可能會溢出闷祥,從而丟失信息,使得計算不可逆傲诵,所以AES將列混淆放到“有限域”中做運(yùn)算凯砍。
    行位移和列混淆共同提供了算法的擴(kuò)散性
    擴(kuò)散的目的是讓明文中的單個數(shù)字影響密文中的多個數(shù)字拴竹,從而使明文的統(tǒng)計特征在密文中消失悟衩。
    如果只有列混淆運(yùn)算,則最終的效果是 [0,3] , [4,7], [8,11], [12,15] 四個分組分別擴(kuò)展栓拜;
    加上了行位移局待,才可以達(dá)到[0, 15]的字節(jié)的擴(kuò)散效果(明文一個字節(jié)改變,密文16個字節(jié)全都會變化)菱属。
  • 輪密鑰加(AddRoundKey)
    輪密鑰加是四個字運(yùn)算中最簡單的,具體就是16個字節(jié)分別和輪密鑰做異或運(yùn)算舰罚。
    輪密鑰是通過原始密鑰通過擴(kuò)展密鑰計算得到纽门,確保每一輪的密鑰都不相同。
    結(jié)合密鑰的運(yùn)算营罢,提供了算法的保密性赏陵。
    如果沒有密鑰參與運(yùn)算饼齿,則前面的運(yùn)算都只是“編碼”而已(類似于base64), 每個人都可以“解碼”,那就不是“加密”了蝙搔。

當(dāng)明文長度大約16字節(jié)是缕溉,就需“分組”了,每16字節(jié)一組吃型;
明文長度不一定是16的倍數(shù)证鸥,所以最后一組需要“補(bǔ)齊(padding)”, 通常大家用的是“PKCS5Padding”或者“PKCS7Padding”,具體做法是:
最后一組缺n個字節(jié)湊夠16勤晚,則最后的n個字節(jié)都填n; 如果明文剛好是16字節(jié)的倍數(shù)枉层,則在末尾增加16字節(jié),并全部填充16赐写。

關(guān)于“PKCS5Padding”和“PKCS7Padding”的區(qū)別:
嚴(yán)格來講PKCS7Padding是以塊大小來對齊鸟蜡,而PKCS5Padding則定義塊大小是8字節(jié);
但是對于AES來說挺邀,塊大小固定為16字節(jié)揉忘,所以其實(shí)兩者沒有區(qū)別。
IOS只支持PKCS7Padding端铛,Oracle JDK只支持PKCS5Padding泣矛,而Android SDK兩者都支持,而且加密結(jié)果是一樣的沦补。

對明文分組和補(bǔ)齊之后乳蓄,還要選擇“模式“。
最簡單的ECB模式夕膀,每個塊獨(dú)立加密/解密:

ECB模式的缺點(diǎn)是:
1虚倒、相同的明文會得到相同密文;
2产舞、明文中的重復(fù)內(nèi)容會在密文中有所體現(xiàn)魂奥。
一般不建議用此模式。

另一個比較簡單且常用的是CBC模式:

CBC模式引入了隨機(jī)的初始向量(IV)易猫,并且以塊加密的結(jié)果作為下一個加密塊的初始向量耻煤,從而使得每次加密的密文都不相同,相同的塊也不會得到相同的密文准颓。
CBC模式克服了ECB模式的安全性問題哈蝇,而且操作簡單,是比較常用的加密模式之一攘已。

四炮赦、非對稱加密

非對稱加密常見的有RSA,DSA样勃,DH等算法吠勘,不過他們所解決的問題有所不同性芬。
DH算法解決密鑰協(xié)商的問題,DSA解決數(shù)據(jù)真實(shí)性和完整性的問題(簽名)剧防,
而RSA則本身能夠加密和解密植锉,既可以用于密鑰協(xié)商,也可以用于簽名峭拘。

RSA算法是各類非對稱加密中原理比較清晰的俊庇。
其數(shù)據(jù)證明過程就不具體介紹了,這里我們簡單講一些其計算過程棚唆。

下面是計算過程的代碼演示:
(只是過程演示暇赤,實(shí)際實(shí)現(xiàn)中,基本類型的精度無法滿足宵凌,需要用到大數(shù)運(yùn)算)

void rsa_test() {
    i64 p = 13;
    i64 q = 17;
    i64 n = p * q;
    i64 r = (p - 1) * (q - 1);
    i64 e = 7;
    i64 d = inv(e, r);
   
    i64 x  = 100;
    i64 m = modPow(x, e, n);
    i64 x0 = modPow(m, d, n);
}

步驟講解:

  1. 選取兩個大素數(shù)p, q鞋囊。
    選取大質(zhì)數(shù)通常需要用到Miller-Rabin算法
  2. 計算n=pq瞎惫,r=(p-1)(q-1)溜腐。
  3. 隨機(jī)選取正整數(shù)1<e<r,滿足gcd(e,r)=1瓜喇, 也就是e和r互質(zhì)挺益。
    很多實(shí)現(xiàn)中, e會直接選取65537, 因?yàn)?5537是個質(zhì)數(shù),必然和r互質(zhì)乘寒,
    而且65537的的二進(jìn)制是0x10001望众,只有兩個‘1’,做加解密時相關(guān)的運(yùn)算會比較快伞辛。
    e和n構(gòu)成公鑰烂翰。
  4. 計算d,滿足de≡1(mod r) 蚤氏。
    上式用到了同余表示甘耿,也就是de%r=1%r (de和1除以r的余數(shù)相同);
    因?yàn)?%r=1, 所以最終就是de%r = 1竿滨。
    這一步通常用擴(kuò)展歐幾里得算法求取d佳恬。
    d和n構(gòu)成私鑰
  5. 加密:m=x^e mod n (注:此處的“^”是指乘方于游,不是異或)毁葱。
  6. 解密:x0=m^d mod n

RSA算法加密和解密的形式是相同的,都是求取 m = a^b % n贰剥。
通常RSA的實(shí)現(xiàn)中e和d(指數(shù))都不小头谜,所以先計算乘方再取余是不可行的,可以通過快速冪算法來求取m鸠澈。
而快速冪的計算過程中需要頻繁地做除法柱告,所以通常會用蒙哥馬利算法來計算m。

由加解密的形式我們可以得到兩點(diǎn)信息:

  1. 公鑰可以用來加密明文笑陈,也可以用來解密私鑰所加密的密文际度,反之亦然。
    值得注意的是涵妥,用openssl或者jdk等生成的密鑰對乖菱,公鑰的e通常是固定的65537, 隨意千萬不要圖公鑰計算快而作為服務(wù)端的密鑰,把私鑰放客戶端蓬网。
    而且窒所,私鑰文件中通常包含了有e,d,n(包含了公鑰和私鑰的計算要素)。

  2. 輸入x必須小于n帆锋。
    本質(zhì)上RSA的加密也是一個“輸入到輸出的一一映射”吵取。
    相比于AES,AES的輸入空間是16字節(jié)锯厢,而RSA的輸入空間是[0,n)皮官。
    實(shí)際上,在RSA的標(biāo)準(zhǔn)實(shí)現(xiàn)中实辑,合法的輸入空間要比n要少幾個字節(jié)捺氢。
    我們通常說的1024, 2048(bit)長度的密鑰,指的是n的長度剪撬。

RSA的加密塊長度等于密鑰長度摄乒,其格式為: [ 0x0 | BT | PS | 0x0 | DATA ] 。

  • BT:塊類型(block type)残黑,私鑰加密時BT=01 馍佑,公鑰加密時BT=02 。
  • PS:填充字符串(padding string)萍摊,基于安全性的考慮挤茄,規(guī)定填充字符串不少于8字節(jié)。公鑰加密時填充非零隨機(jī)字節(jié)冰木,如此穷劈,即使明文相同,每次加密后密文都不相同踊沸; 私鑰加密時填充0xFF歇终,解密后可以檢查一下PS部分是否都是0xFF, 若不是則說明加密塊非法。
  • DATA:明文逼龟,所以明文長度不能超過“密鑰長度-11字節(jié)”评凝。

關(guān)于RSA最后一點(diǎn):RSA的密鑰格式。
RSA常見的密鑰格式有PKCS#1腺律,PKCS#8奕短,x509等宜肉。
比如,用openssl命令生成的密鑰文件就是PKCS#1格式的翎碑。

// 生成私鑰
openssl genrsa -out private_pkcs1.pem 2048
// 導(dǎo)出公鑰
openssl rsa -in private_pkcs1.pem -out public_pkcs1.pem -pubout -RSAPublicKey_out

用文本文件打開公鑰文件谬返,可以看到如下格式的文本:

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAxFEkH3FTCGFRtCnLydJES+ShgmVjY7w3KwQxw9IVW+4p4mLL4V/+
p/m8pnoEaelVKX8fDxoWcJQQ2APGobMJ32MZkpWkFurSj2M5HlxLlH8hJNPYTHoN
UNh2SFeUtM1GkH9jyJRKqKS0qkJl6jXJGRRcKklNlYchIUdC2i+zqXoZw1KOva85
ISpU5Od3oZEeOqXtrC/OSzcTHNc1EdpyqpUpGZpPoFUHZ/Y9c0cn9Mvfw/S4BEua
rHyfB8YiValNzk4QWKCvokeH7OosSboGDu68j5AVmEHxxedD/FodQAONgXy6HSws
q5GkXYbW6gSWF7MG4o81wDn7hBpUGlsuxwIDAQAB
-----END RSA PUBLIC KEY-----

去掉首尾的標(biāo)簽和換行符,剩下的是一串base64字符串日杈;
對其進(jìn)行base64解碼遣铝,得到由ANS.1格式的公約編碼。
ANS.1是一種TLV形式的序列化格式(和protobuf有一點(diǎn)相似)莉擒。
將以上公鑰格式化顯示如下:

30 82 01 0a
   02 82 01 01
      00c451241f7153086151....省略部分字節(jié)
   02 03
      010001

對應(yīng)PKCS#1形式的RSA公鑰的定義:

RSAPublicKey ::= SEQUENCE {
   modulus           INTEGER,  -- n
   publicExponent    INTEGER   -- e
}

我們就可以得到公鑰的“階”和“哪鹫ǎ”了(e和n)。
獲取私鑰的d和n也是類似涨冀。
關(guān)于密鑰格式的更多細(xì)節(jié)填硕,可參考這篇文章:RSA密鑰格式解析

結(jié)合前面RSA計算過程分析蝇裤,我們用openssl生成密鑰的話廷支,就省去了大數(shù)選擇和密鑰的計算了。
接下來只需實(shí)現(xiàn)modPow函數(shù)即可栓辜。
筆者在Github找了一圈大數(shù)實(shí)現(xiàn)恋拍,沒找到滿意的,最終把目光投到JDK的大數(shù)類(BigInteger), 參照其實(shí)現(xiàn)藕甩,用C語言實(shí)現(xiàn)了modPow函數(shù)施敢,然后結(jié)合key解析和padding,實(shí)現(xiàn)了完整的RSA加解密狭莱。

在非對稱加密算法中僵娃,除了RSA之外,被提的比較多的應(yīng)該就是ECC了腋妙。
ECC是Elliptic Curve Cryptography(橢圓曲線加密)的縮寫默怨,其實(shí)ECC主要是定義了一種封閉運(yùn)算,基于ECC的ECDH和ECDSA才是非對稱加密算法骤素。

提到ECDH匙睹,需要先說DH算法。
不像RSA可以“加密”济竹,DH算法本身不能加密痕檬,而是用于協(xié)商密鑰。
其簡單演示如下:

  1. 設(shè)定公共因子p送浊;
  2. 客戶端計算A=a * p梦谜,發(fā)送A給服務(wù)端(這里的*代表一種運(yùn)算,并非乘法);
  3. 服務(wù)端計算B=b * p, 發(fā)送B給客戶端唁桩;
  4. 客戶端計算k1 = a * B = a * b * p;
  5. 服務(wù)端計算k2 = b * A = b * a * p闭树;
  6. 于是服務(wù)隊和客戶端拿到約定的密鑰abp,然后可以用來做對稱加密或者HMAC等運(yùn)算朵夏。

算法的有效性需要兩個條件:

  1. 計算a*p得到A比較容易蔼啦,根據(jù)A和p計算a不可行(單向函數(shù));
  2. 運(yùn)算*具備交換律仰猖,以確保 a * b * p = b * a * p。

常規(guī)的乘法運(yùn)算具備交換率奈籽,但是不滿足第一個條件饥侵,因?yàn)橥ㄟ^除法運(yùn)算可以計算a;
經(jīng)典的DH算法,其運(yùn)算為 y = (g ^ x) %p 衣屏,公共因子為g, p躏升。
該運(yùn)算滿足交換律;
同時狼忱,當(dāng)g, p 為較大的數(shù)值時膨疏,計算y = (g ^ x) % p相對容易(和RSA一樣,實(shí)現(xiàn)modPow函數(shù)即可)钻弄,但根據(jù)g, p, y 計算x卻很困難佃却。
但是為確保安全性,p需要取較大的數(shù)值窘俺,比如1024bit的大整數(shù)饲帅,計算速度較慢(類似于RSA)。
而ECC所定義的封閉運(yùn)算瘤泪,所構(gòu)造的單向函數(shù)的逆向成本要比mowPow要高灶泵,所以密鑰長度不需要很長,計算速度較快对途。
基于ECC運(yùn)算的DH算法赦邻,被稱為ECDH;類似的实檀,基于ECC運(yùn)算的DSA算法被稱為ECDSA惶洲。
而ECDHE算法,其中的E是ephemeral(臨時性的)劲妙,也就是湃鹊,每次使用都重新生成密鑰。
網(wǎng)絡(luò)傳輸中镣奋,利用ECDHE可以實(shí)現(xiàn)通信的“向前安全”币呵。
所謂的“向前安全”,就是指攻擊者記錄每次雙方的通信,在某一天獲取到私鑰時余赢,是否能解碼之前記錄的通信芯义。
假如每次所用的密鑰對都是臨時的,那么攻擊者是無法解密之前的通信的妻柒。
ECDHE生成密鑰對很快扛拨,所以生成臨時密鑰的代價是可以接受的。

五举塔、總結(jié)

本文比較概要地梳理了常見加密算法的一些知識點(diǎn)绑警。
關(guān)于原理的部分也是簡要的描述,背后的數(shù)學(xué)原理之類的就不深入了央渣,感興趣的朋友可以閱讀文末的參考鏈接计盒。


參考資料

[1] 安全散列函數(shù) https://www.cnblogs.com/cxchanpin/p/7141815.html
[2] HMAC算法及計算流程介紹 https://zhuanlan.zhihu.com/p/336054453
[3] AES簡介 https://www.cnblogs.com/luop/p/4334160.html
[4] AES算法描述及C語言實(shí)現(xiàn) https://blog.csdn.net/shaosunrise/article/details/80219950
[5] 伽羅瓦域上的四則運(yùn)算 https://blog.csdn.net/shelldon/article/details/54729687
[6] 另一種世界觀——有限域 https://www.bilibili.com/read/cv2922069
[7] RSA算法正確性證明 https://zhuanlan.zhihu.com/p/48994878
[8] 快速冪算法 https://blog.csdn.net/qq_19782019/article/details/85621386
[9] 蒙哥馬利算法 https://blog.csdn.net/weixin_46395886/article/details/112988136
[10] RSA密鑰格式解析 http://www.reibang.com/p/c93a993f8997
[11] RSA加密的填充方式 https://blog.51cto.com/u_13520299/2656705
[12] DSA-數(shù)據(jù)簽名算法 https://blog.csdn.net/aaqian1/article/details/89299520
[13] Diffie-Hellman密鑰交換 https://juejin.cn/post/6844903881093169159
[14] ECDHE密鑰交換算法 https://www.likecs.com/default/index/show?id=124371
[13] ECC橢圓曲線加密算法 https://zhuanlan.zhihu.com/p/66794410

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市芽丹,隨后出現(xiàn)的幾起案子北启,更是在濱河造成了極大的恐慌,老刑警劉巖拔第,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咕村,死亡現(xiàn)場離奇詭異,居然都是意外死亡蚊俺,警方通過查閱死者的電腦和手機(jī)懈涛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來春叫,“玉大人肩钠,你說我怎么就攤上這事≡葜常” “怎么了价匠?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呛每。 經(jīng)常有香客問我踩窖,道長,這世上最難降的妖魔是什么晨横? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任洋腮,我火速辦了婚禮,結(jié)果婚禮上手形,老公的妹妹穿的比我還像新娘啥供。我一直安慰自己,他們只是感情好库糠,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布伙狐。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贷屎。 梳的紋絲不亂的頭發(fā)上罢防,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音唉侄,去河邊找鬼咒吐。 笑死,一個胖子當(dāng)著我的面吹牛属划,可吹牛的內(nèi)容都是我干的恬叹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼同眯,長吁一口氣:“原來是場噩夢啊……” “哼妄呕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嗽测,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肿孵,沒想到半個月后唠粥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡停做,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年晤愧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛉腌。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡官份,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烙丛,到底是詐尸還是另有隱情舅巷,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布河咽,位于F島的核電站钠右,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏忘蟹。R本人自食惡果不足惜飒房,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望媚值。 院中可真熱鬧狠毯,春花似錦、人聲如沸褥芒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惜颇,卻和暖如春皆刺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凌摄。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工羡蛾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锨亏。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓痴怨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親器予。 傳聞我的和親對象是個殘疾皇子浪藻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 本篇主要介紹筆者在iOS開發(fā)工作中用到的加解密算法的使用,主要包括:1)對稱加密算法:AES乾翔、DES爱葵、3DES2)...
    江山風(fēng)雨閱讀 4,333評論 1 5
  • 【資料整理】 iOS 中的網(wǎng)絡(luò)加密 公司的接口一般會兩種協(xié)議的,一種HTTP反浓,一種HTTPS的合敦,HTTP 只要請求...
    Aliv丶Zz閱讀 2,229評論 0 3
  • 這篇文章主要講述在Mobile BI(移動商務(wù)智能)開發(fā)過程中退疫,在網(wǎng)絡(luò)通信融柬、數(shù)據(jù)存儲万伤、登錄驗(yàn)證這幾個方面涉及的加密...
    雨_樹閱讀 2,335評論 0 6
  • 寫在前面:加密和簽名是兩回事,加密的目的是防止信息泄露月劈,簽名的目的是防止篡改和偽造 MD5度迂、SHA-1、SHA-2...
    望穿天堂閱讀 925評論 0 0
  • 專業(yè)術(shù)語(摘自百度百科) 密鑰:分為加密密鑰和解密密鑰猜揪。明文:沒有進(jìn)行加密惭墓,能夠直接代表原文含義的信息。密文:經(jīng)過...
    Samlss閱讀 6,037評論 1 14