密码学的安全性浅析-1
點擊藍字
關注我們
前言
我們一直都在說,密碼學是網絡空間安全領域的唯一理論支撐,大家都認為密碼學是安全的壓艙石。
密碼學對安全的關鍵意義毋庸諱言,安全領域非密碼學的師傅們而言,對于密碼學的認識可能限于打CTF時接觸的基礎的凱撒密碼、柵欄密碼到涉及分析的padding oracle attack等,再到要讀最新的論文手動編程才能求解的一些問題。
大家對密碼學的安全性問題了解并不足夠,本系列文章核心來自我們在學習相關文獻時的學習記錄,整理成文希望能夠提升大家對”壓艙石“安全性的認識。
具體而言,在本篇文章中,我們會介紹密碼學的安全性的定義、如何保證安全性;之后會介紹古典密碼及其本質的缺陷,然后引出一次一密;接著會定義攻擊模型及安全目標,并通過分析引出隨機性的重要性,為了便于理解,在文中會時刻舉例說明,同時給出實際中由于對密碼學安全性理解不足而發生過的安全事故。
安全性
密碼學中的安全性與計算機中的安全性是存在區別的。
計算機安全,我們以軟件安全為例,其目標是防止攻擊者利用程序代碼觸發漏洞,而密碼學安全的目標是使定義明確的問題無法求解。對于軟件安全而言,一個軟件要么是安全的,要么是不安全的,但是對于密碼領域的程序而言,安全與否并不是絕對的,我們可以計算出破解加密算法所需的工作量,即量化其安全性,但是卻不能絕對稱其為安全。
密碼學中的安全性可以分為兩種:理論安全性與計算安全性。當攻擊者擁有無限時間和資源還是不能破譯密碼時,稱其為理論安全,也叫做無條件安全,下文會介紹的一次一密便是典型;而如果一個密碼算法在給定時間和資源內無法被攻破,則稱其為計算安全的,這與攻擊者的能力、目標等條件密切相關,在下文我們會根據不同的條件建立不同的攻擊模型與安全目標等。
舉個例子,設一個密碼算法E的密鑰K是128比特,加密過程為C=E(K,P),已知一個明文-密文對(P,C),但是不知道K。
求K,這個問題不是理論安全的,因為我們可以窮舉2^128種可能;但是這個問題是計算安全的,因為即使一秒鐘可以窮舉1000億個K,要窮舉
2^128個K要花費超過100 000 000 000 000 000 年的時間,在實踐中是安全的。
形式化及度量
我們這里可以給出形式化的定義,設對于一個密碼方案,攻擊者最多能執行t個操作,攻擊成功概率不高于ε,則該方案是(t,ε)-安全的,此時給出的是破解密碼算法的難度的下限。注意,這意味著,沒有攻擊者能夠在執行小于t次操作得情況下,獲得概率為ε的成功率,但是這并不是說明攻擊者執行t次就恰好可以成功,也不會說明需要具體多少次才能成功,所以t實際上是攻擊算法所需的操作量的下界。
還是以攻擊128比特密鑰的對稱密碼算法為例,理想情況下,此密碼對于1到2^128之間的任何t值都是
(t,2/2^12)-安全的,最好的攻擊就是暴力破解。我們可以計算以下三種可能的攻擊的成功概率:
1.t=1,說明攻擊者嘗試了一個密鑰,并以ε=1/2^128的概率成功
2.t=2^128,說明攻擊者嘗試了所有密鑰,其中一定有一個是成功的,所以成功概率ε=1
3.t=2^64,此時的成功概率ε=
2^-64,也就是說,攻擊者嘗試所有密鑰的一小部分時,成功概率與嘗試的密鑰數量成正比。
從這個例子我們可以看出,對于1到2^n比特之間的任意t,一個n比特密鑰的密碼至多是
(t,t/2^n)-安全的,因為無論密碼多強大,暴力破解總是可以成功的,實際中的關鍵就是在于能夠抵抗暴力攻擊多久。
我們可以對(t,ε)-安全進一步簡化。我們說當攻擊成功至少需要t次操作時,稱其為t-安全,這里我們實際上假設ε是接近1的概率,通過比特表示安全性,”n比特安全“說明攻破它需要2^n次操作。
而直到操作次數后,我們就可以通過取其對數確定其安全強度。假設需要1000000次操作,則其安全強度為log2 1000000=20比特。
其他因素
雖然比特安全性在比較不同密碼的安全強度時很有用,但是其沒有提供足夠的關于攻擊成本的信息,僅僅通過比特安全性并不能說明什么,比如兩個密碼都有128比特密鑰和128比特安全性,但是第一個密碼比第二個快100倍。那么實際上對第二個密碼進行暴力破解2^128次時,可以對第一個密碼做
100x2^128次操作了,如果我們以第一個快密碼為標準,那么破解慢密碼需要
2^134.64次操作。
那么,這能夠說明第二個密碼比第一個密碼安全嗎?當然不行,所以我們還需要考慮其他因素。
并行性
設有兩個攻擊,每個攻擊都需要2^56次操作,第一種攻擊只能串行,第二種攻擊可以并行。假設我們有
2^16=65536個處理器,那么可以將并行工作的負載分成65536個獨立任務,每個任務只需要執行
2^40次操作即可。
也就是說,即使并行攻擊和順序攻擊執行相同數量的操作,但是并行攻擊比順序攻擊快65536倍。
內存
這實際上和攻擊所用的空間成本有關,即攻擊需要多次內存查找、內存訪問速度、訪問數據大小等,這些對時間的影響非常關鍵。例如在當前的CPU上,從寄存器讀數據需要1個周期,從CPU緩存讀數據需要20個周期,從DRAM讀數據需要100個周期。
預計算
這一般被稱作攻擊的離線階段,這些操作只需要執行一次,在后面的攻擊中就可以重復使用。比如彩虹表破解hash就是這一類,雖然在計算彩虹表進行預計算時會花費大量時間,但是在實際攻擊過程中很快就可以實施。
目標數量
攻擊目標數量越多,攻擊面就越大,攻擊者就可以拿到更多關于密鑰的信息。舉個例子,設目標為n比特的密鑰,需要2^n次嘗試才能找到正確的密鑰,但如果攻擊目標為多個n比特密鑰,即對于單個明文P,攻擊者有M個不同的密文,其分別用M個n比特密鑰加密得到。如果攻擊者要破解的是M個密鑰中的每一個,那么還是需要
2^n次操作,但是如果只需要破解M個中的一個,那么只需要
2^n/M次操作。
也就是說,攻擊成本隨著目標數量增加而降低。
安全性證明
要評估某密碼算法的安全性,我們一般會通過數學證明得到。
在密碼學中其被稱為可證明安全性,它可以證明某個密碼方案至少和解決另一個已知的困難問題是同等困難的,只要困難問題仍然存在,那么方案就是安全的,這種證明方式被稱為規約,其來自復雜性理論。
安全性證明根據其所使用的困難問題的類型,可以分為兩種:與數學問題相關、與密碼問題相關。
與數學問題相關
破解這類方案至少與解決一些數學難題一樣困難。
密碼學中一個著名的數學難題就是大數分解,RSA正是依賴于它。RSA通過計算C=p^e mond n來加密明文p,其中,e和大數n=pq是公鑰。
通過P=c^d mond n解密,其中d是和e、n有關的私鑰。
如果我們可以分解n,那么就可以從公鑰中恢復私鑰來破解RSA;如果有私鑰,就可以分解n。
換句話說,恢復RSA私鑰和分解大數n是等價的困難問題,這就是我們所說的歸約。
與密碼問題相關
這類方案是與另一個密碼方案比較,并證明只有破解第一個密碼方案時,才能破解第二個密碼方案。對稱密碼的安全性證明常用這種方式。
不過可證明安全性并不適用于所有類型的算法,有一些密碼算法并沒有被證明是安全的,如AES,AES不能規約到一些眾所周知的難題,既不與數學問題相關,也不與密碼問題相關,而我們之所以還用AES,是因為許多專家嘗試破解它但是失敗了。此時的安全性證明,我們成為啟發式的:密碼分析人員分析多輪后,密碼算法的安全冗余還是很高,我們就相信它是安全的。
錯誤的安全性證明
我們已經說了安全性證明非常重要,但是密碼學大佬們在進行安全性證明時仍然有可能犯錯,對于OAEP的證明就是一個典型例子。OAEP是一種使用RSA實現安全加密的方法,在許多應用程序中使用,OAEP給出的安全性證明中聲稱其抵抗選擇密文攻擊的有效期為7年,但是后來大家研究發現證明是錯誤的,給出的結論也是錯誤的。之后給出了新的證明,結論是OAEP對選擇密文攻擊是安全的。
古典密碼
古典密碼是計算機發明之前的密碼,算法作用在字母上而不是比特位上。古典密碼中最經典的就是凱撒密碼和維吉尼亞密碼,二者的基礎知識背景這里不再介紹。
凱撒密碼
凱撒密碼容易被破解,只需要把密文往前移動3位即可得到響應的明文。這種方式安全程度非常低,在古羅馬時期經常被使用,不過實際上,前些年意大利警方還通過破譯一種凱撒密碼的變種抓到了黑手黨頭目。要增強凱撒密碼的安全性,可以改變移位的位數,不過即使這么做了,攻擊者最多嘗試25次也就可以解密了。
維吉尼亞密碼
維吉尼亞密碼雖然比凱撒密碼安全了很多,但還是容易被攻破。
舉個例子,明文“THEY DRINK THE TEA"通過密鑰”DUH“加密后的密文為”WBLBXYLHRWBLWYH“
第一步找出密鑰的長度。我們注意到密文中WBL出現了2次,間隔9個字母,這意味著相同的3個字母被用同樣的移位模式加密,所以密鑰長度要么是9,要么能夠整除9.而在英語中,THE是最常出現的3個字母的組合,所以我們可以認為這個重復的3個字母為THE,那么可能的密鑰就是DUH.
第二步使用頻率分析法找出字母分布的不均勻性。在英語中E是最常見的字母,所以如果密文中X出現次數最多,那么X對應的明文很可能就是E
工作原理
通過上面對兩種古典密碼的簡單分析,我們已經知道密碼的工作原理主要就是置換和模式。
置換是指能夠變換一個對象的函數,且對每個對象都有唯一的逆(如凱撒密碼中的3字母移位),而模式則是通過置換處理任意長度的消息的算法(如凱撒密碼中的模式就是對每個字母施加相同的置換,而維吉尼亞密碼中則是對不同位置的字幕施加不同的置換)
置換
并不是任意置換都是安全的,為了保證安全,置換需要滿足:密鑰確定置換,只要密鑰保密,則置換保密。不同的密鑰確定不同的置換。置換應當看起來隨機,經過置換的密文應該沒有顯著的特征或者可識別的模式。
如果滿足以上條件,則稱這種置換為安全置換,但是這僅是建立安全密碼的必要不充分條件,因為其還和模式相關。
操作模式
在說明操作模式為什么也是建立安全密碼的必要條件之前,我們舉個例子。
假設我們現在已經有一種安全的置換:A->X,B->M,N->L
那么對于香蕉的英文BANANA則有密文:MXLXLX
我們注意到,僅僅對明文中的所有字母施加相同的置換,在密文中會表現出一種重復的模式,攻擊者分析這種模式,即使不能獲得完整的信息,但是也能獲得一部分信息,比如在這個例子的密文中我們看到在字母的第2,4,6位出現相同的字母,在3,5位出現了相同的字母,如果攻擊者知道密文對應的是一種水果,那么攻擊者很容易推測出這是BANANA,而不是ORANGE等其他水果。
從這個例子可以看出模式的重要性,模式通過對相同的字母施加不同的置換從而降低了明文中重復字母在密文中表現出的特征的風險。以維吉尼亞密碼為例,如果密鑰長度為N,那么就有N種不同的置換被施加在連續長度為N的字母串上,不過如果N并非足夠長,我們就可以通過頻率分析對其進行攻擊。所以,如果維吉尼亞密碼并應用于加密與密鑰長度相同的明文,則頻率分析就失效了。
一次一密
我們回過頭來在看古典密碼,它注定是不安全的,以我們現在的計算能力分分鐘就能攻破它。我們知道,為了確定安全,置換應該看起來是隨機的,最好的方法就是從所有置換的集合中隨機選擇每個置換。實際上可以選擇的置換有很多,對于字母表,有26!,約等于2^88種置換,但是古典密碼卻只能使用其中的一小部分。
此外,置換不僅僅可以通過字母移位進行,還可以使用其他操作如乘法、加法等,這便是現代密碼了,比如給定128比特密鑰,然后進行一定比特位的操作來加密單個字母。
古典密碼是絕對不安全的,那么有沒有絕對安全的密碼呢?
有的,那便是我們這里有介紹的一次一密。
一次一密有絕對的保密性,即使攻擊者有無限的計算能力,也無法了解除明文長度以外的任何信息。
設明文為P,密鑰為K,其長度與P相等,密文為C,則一次一密的加密過程為:
這個符號是異或運算符
解密則是
一次一密的關鍵在于密鑰K只能使用一次。如果使用兩次,設分別將明文P1,P2加密為C1,C2,則攻擊者通過如下運算
可以得到P1,P2的異或結果,從而導致信息泄露(當攻擊者這知道一條明文時,就可以通過上式結果推出另一條明文)
一次一密的不便之處在于密鑰長度需要和明文一樣,除了這個缺點外,是非常完美的。香農在上世紀40年代的時候就已經證明了其安全性。
香農指出,要實現完美的保密,一次一密的密鑰必須至少與明文一樣長,這樣攻擊者就無法在給定密文的情況下排除任何可能的明文。
這是非常直觀的,如果K是隨機的,那么C也是隨機的,因為隨機字符串與任何固定字符串異或得到的結果也是隨機的。隨機比特串第一位為0的概率為1/2,一個隨機比特與另一比特異或的結果為0的概率為1/2,在任意長度的比特串上這一點都成立。換句話說,對于不知道K的攻擊者而言,即使其擁有的時間和算力是無限的,但是對他而言C依然是隨機的。
假設C長度為128比特,那么有2^128種可能的密文,對于攻擊者而言,
就有2^128種可能的明文。如果密鑰長度小于128,即可能的密鑰少于
2^128種,那么攻擊者可以排除某些明文。比如密鑰為64比特,那么攻擊者可以確定
2^64種可能的明文,這就排除了大多數的128位比特串。
此時攻擊者可能不知道明文是什么,但是其知道明文不是什么,從而破壞了完美保密性。
現在我們已經知道,古典密碼不安全,一次一密不實用,那么怎么設計安全和實用兼顧的密碼呢?
攻擊模型與安全性
如果一個密碼體制是安全的,必須要定義好對應的攻擊模型和安全性目標。攻擊模型是關于攻擊者可能與密碼算法如何交互以及攻擊者能力的一系列假設。在進一步分析之前,我們要先了解Kerckhoff原則,其指出,密碼的安全性應僅取決于密鑰的保密性,而不應取決于密碼算法的保密性。
黑盒模型
如果攻擊者只能看到密碼模型的輸入和輸出,則稱其為黑盒模型。黑盒模型中依據從最弱到最強的順序列舉如下:
唯密文攻擊(ciphertext-only attackers,COA):僅知道密文,但不知道相關的明文,也不知道有哪些可以選擇的明文。此時攻擊者是完全被動的,無法執行加密或解密操作
已經明文攻擊(known-plaintext attackes,KPA):知道密文以及其對應的明文。此時攻擊者也是被動的,不過它可以獲得一系列明文-密文對,其中明文是隨機選擇的。
選擇明文攻擊(chosen-plaintext attacks,CPA):可以對選定的明文進行加密并得到對應的密文。此時的攻擊者是主動的
選擇密文攻擊(chosen-ciphertext attackers,CCA):可以進行加密和解密。注意,這個模型只是表示攻擊者可以介入加密和查看明文的情況,其解密的內容并不一定足以攻破系統。
灰盒模型
灰盒模型中,攻擊者可以訪問密碼的實現,比如對于智能卡、嵌入式系統等,攻擊者對其擁有物理訪問權限,從而可以篡改算法的內部結構。這類模型中最典型的一類就是側信道攻擊。
側信道攻擊依賴于密碼實現的信息源,攻擊者觀察密碼實施時的模型特征,比如對于軟件而言,可以觀察其執行時間、錯誤消息、返回值、分支等,對于硬件而言,可以觀察其功耗、電磁輻射等。
侵入式攻擊也屬于灰盒模型,其可以通過激光故障注入等方法改變芯片的行為。
安全目標
我們之前一直都沒有明確定義密碼的安全目標,只是籠統地說,能讓攻擊者對密碼一無所示的就是好方法,實際上這是遠遠不夠的。實際上,已經有兩個常用的安全目標了。
1.不可區分性(indistinguishability,IND):密文應與隨機字符串沒有區別。關于這一點,可以通過一個game說明。
設攻擊者選定兩個明文,收到兩者的密文之一,攻擊者無法分辨出這是哪個明文對應的密文
2.不可展性(non-malleability,NM):給定密文C1,應該不可能創建另一個密文C2,使其對應的明文P2以有意義的方式與P1相關
IND-CPA
上述的安全目標僅在于具體的攻擊模型結合時才有用,一般我們會寫作GOAL-MODEL,如IND-CPA,表示的是針對選擇明文攻擊者的不可區分性。
以IND-CPA為例,這是最重要的安全概念之一,這也稱為語義安全,只要密鑰保密,密文就不會泄露任何有關明文的信息,當對同一明文加密兩次時,加密系統會返回不同的密文。
IND-CPA的關鍵是隨機化,我們還是以IND game為例。設攻擊者選擇兩個明文P1,P2并接受兩個明文之一對應的密文但是不知道它對應的是哪一個明文。在CPA模型中,攻擊者可以執行加密以獲得大C1=E(K,P1),C2=E(K,P2),如果加密不是隨機的,那么攻擊者查詢Ci是否等于C1或C2就可以確定對哪個明文加密,從而贏得game。
實現IND-CPA最簡單的方式就是使用確定性隨機比特發生器(deterministic random generator,DRBG),它可以返回給定的某些秘密值的隨機比特:
E(K,R,P)=(DBRG(K||R)異或P,R)
上式中的R是每次加密隨機選擇的字符串,并與密鑰K一起提供給DRBG,如果其生成的是真隨機比特串,那么該密碼的就是IND-CPA安全的。
這里我們只是簡單分析了IND-CPA,這種GOAL-MODEL組合還有很多,比如NM-CPA,NM-CCA,IND-CPA,IND-CCA等,他們之間的一些關系是很明顯的:IND-CCA蘊含著IND-CPA,NM-CCA蘊含著NM-CPA,因為CPA攻擊者可以做的事情CCA攻擊者也可以做。
以上我們都還是考慮了對稱密碼,對于非對稱密碼而言,由于任何攻擊者都可以使用公鑰加密,所以模型默認都是CPA的
弱密碼算法
盡管我們已經介紹了相關的密碼學概念,但是在實際中如果沒有選擇適當的密碼算法、模型等,還是會造成嚴重的危害。
在GSM時代,手機通信的加密使用了A5/1的算法,通過建立查找表便可以對其進行攻擊。在參考連接6中,可以看到詳細的情況。
錯誤模型
即使密碼使用者學習過安全模型,但還是有可能使用錯誤模型。很多通信協議確實使用了在CPA或CCA中安全的算法,但是實際中有些攻擊是不需要涉及CPA中的加密查詢或CCA中的解密查詢的,比如對于Padding oracle attack而言,只需要進行有效性查詢即可,在這種攻擊方案下,只有密文對應的明文有適當的填充時,密文才有效,如果填充不正確,解密就會失敗,攻擊者可以通過觀察解密是否失敗進行攻擊。
這種攻擊方案,打CTF的師傅們應該很熟悉了,這里也不再進一步說明,有興趣的話也可以參考《白帽子講web安全》中的相關章節。
隨機性
我們已經知道,在密碼系統中,需要隨機性來保證安全。可以說,其中的關鍵就在于隨機比特的生成,其依賴于熵源以及從熵源產生隨機比特的算法。
熵源由隨機數發生器(RNG)提供,算法由偽隨機數發生器(PRNG)提供。
RNG的作用是利用模擬世界中的熵在數字系統中生成不可預測的比特,比如從溫度、噪聲、靜電測量中采樣出比特信息,也可以從傳感器,IO,系統日志等提取正在運行的OS中的熵。而PRNG的作用則是從一些真正隨機的比特生成許多人為的隨機比特。
總結來說,RNG以非確定的方式從模擬源生成真隨機比特,不保證高熵,而PRNG以確定的方式從數字源生成看起來隨機的比特,并具有最大熵。
在隨機性方面可能出現哪些問題呢?
熵源不理想
一開始的Netscape瀏覽器的SSL代碼是根據如下所示的偽碼計算出128比特的PRNG種子的
這里的問題在于,PID和microseconds是可以被猜測的,如果可以猜到seconds,那么microseconds就只有10^6個可能的值
這是Log(10^6)的熵,大約20比特
另外,PID和PPID各15比特,所以本應有15+15=30比特的熵,但是在標注的1中,可看到,PPID和PID有3比特的重疊,所以只能產生15+12=27比特的熵
所以一共的熵為20+27=47比特,但是128比特的種子應該128比特的熵才對。這是熵源不理想的典型例子。
啟動時熵不足
前些年有研究人員掃描整個互聯網并從TLS證書和SSL主機中提取公鑰,發現一些系統具有相同的公鑰,私鑰也非常相似。這是非常不合常理的,因為一般情況下,對于兩個不同的大數n=pq,n'=p'q',p與p'不相等,q與q'不相等,但是研究人員發現經常會有n與n'不相等的情況下,p=p'
后面發現這其中的原因是,盡管使用了不錯的PRNG,但由于在初次啟動時會盡早生成公鑰,所以在收集到足夠的熵之前,如果基礎熵源選取相同,那么不同系統中的PRNG會產生相同的隨機比特。
會生成相同的密鑰,是由于以下偽碼中的密鑰生成方案造成的
如果兩個系統的種子相同,運行上述代碼后會生成相同的p,q,也就會生成相同的n。而只有研究人員發現的,在不同密鑰中存在共享素數,則是因為在密鑰生成過程中注入了額外的熵,如下所示
如果兩個系統使用相同的種子運行上述代碼,會生成相同的p,但是由于prng.add_entropy()注入了熵,會得到不同的q
對于n=pq,n'=pq'的情況,會有什么為題呢?
這里的關鍵在于,通過計算n和n‘的最大公約數就可以恢復出p。
非加密PRNG
PRNG很常見,在不涉及密碼學的場合中也有其身影,我們可以分為加密PRNG和非加密PRNG。非加密PRNG的作用一般是用于生成良好均勻的分布,常用于科學模型、視頻游戲中,它只關心比特之間的概率分布的質量,但是不關心它的可預測性,所以在密碼程序中不應使用非加密PRNG.
但是實際上,很多編程語言中都用的是非加密PRNG,比如libc中的rand,drand48,PHP中的rand,mt_rand,Python中的random模運算,Ruby中的Random類等。最常見的非加密PRNG就是Mersenne Twister(MT)算法了,它可以產生沒好友統計偏差的符合一致分布的隨機比特,但是這些比特是可預測的,給定一些MT產生的一些比特,可以預測接下來會出現哪些比特。
MT算法比加密PRNG簡單多了,其內部狀態是一個由624個32比特字組成的數組S,其初始值為S1,S2,...S624,運行一次后變為S2,...S625...其中的Sk+624可以通過如下計算:
初始狀態的比特可以表示為輸出比特之間的異或,反之亦然。
如果將其應用于密碼系統則會造成危害。
MediaWiki使用隨機性生成諸如安全令牌、臨時密碼等信息,按理來說,此處的隨機性應是不可預測的,但是舊版本的MediaWiki使用了非加密PRNG來生成這些令牌和密碼,其源碼部分如下
從代碼中可以看到mt_rand()
這就是我們一直在說的Mersenne Twister,利用它攻擊者就可以預測未來的令牌和臨時密碼。
參考
1.Shoup V. OAEP reconsidered[C]//Annual International Cryptology Conference. Springer, Berlin, Heidelberg, 2001: 239-259. 2.https://www.semanticscholar.org/paper/Understanding-brute-force-Bernstein/3bf374700ec98ea5d1b7658ec85c472f2fe4d952 3.https://link.springer.com/article/10.1007/s00145-003-0213-5 4.https://dl.acm.org/doi/10.1145/800070.802212 5.https://www.schneier.com/academic/archives/1998/01/cryptanalytic_attack.html 6.https://zh.wikipedia.org/wiki/A5/1 7.https://guidanceshare.com/wiki/Non-cryptographic_PRNG 8.https://www.mediawiki.org/wiki/Manual:Config_script/it 9.https://blog.cryptographyengineering.com/2012/03/09/surviving-bad-rng/ 10.https://www.cs.umd.edu/class/fall2018/cmsc818O/papers/ps-and-qs.pdf原創稿件征集
征集原創技術文章中,歡迎投遞
投稿郵箱:edu@antvsion.com
文章類型:黑客極客技術、信息安全熱點安全研究分析等安全相關
通過審核并發布能收獲200-800元不等的稿酬。
更多詳情,點我查看!
體驗靶場實操,戳“閱讀原文”體驗
總結
以上是生活随笔為你收集整理的密码学的安全性浅析-1的全部內容,希望文章能夠幫你解決所遇到的問題。