密碼學課程設計


中國礦業大學密碼學課程設計

一、古典密碼

1.1 原理

1.1.1 單表代換

使用一個固定的替換表明文、密文字符一一對應。

  1. 移位密碼

    \[\begin{array}{c} &𝐸_𝑘(𝑖)=(𝑖+𝑘)\;𝑚𝑜𝑑\;𝑞\; =\;𝑗\quad0≤𝑖, 𝑗<𝑞,𝐾= \lbrace 𝑘 | 0≤𝑘<𝑞 \rbrace \\ &𝐷_𝑘(𝑗)=(𝑗-𝑘)\; 𝑚𝑜𝑑\; 𝑞\;=\;𝑖 \end{array} \]

    • 凱撒密碼

      \[\begin{array}{c} 𝐸_𝑘(𝑖)=(𝑖+k)\;𝑚𝑜𝑑\;26\;=\;𝑗\\𝐷_𝑘(𝑗)=(𝑗-𝑘)\;𝑚𝑜𝑑\;26\;=\;𝑖 \end{array} \]

  2. 乘數密碼

    \[\begin{array}{c} &𝐸_𝑘(𝑖)=(𝑖*k)\;𝑚𝑜𝑑\;q\; =\;𝑗 \quad (k,q)=1\\ &𝐷_𝑘(𝑗)=(𝑗*𝑘^{-1})\; 𝑚𝑜𝑑\; q\;=\;𝑖 \end{array} \]

  3. 仿射密碼

    移位密碼和乘數密碼的結合。

    \[\begin{array}{c} 𝐸_𝑘(𝑖)=𝑖*k_1+k_2\;𝑚𝑜𝑑\;q\; =\;𝑗 \quad (k_1,q)=1\\ 𝐷_𝑘(𝑗)=(𝑗-𝑘_{2})*k_1^{-1}\; 𝑚𝑜𝑑\; q\;=\;𝑖 \end{array} \]

1.1.2 多表代換

維吉尼亞密碼:實質上是周期多表替換,減少了密鑰量。

置換表:

image-20201221165605487

明文映射到行,密鑰映射到列,通過(明文,密鑰)坐標查表可以輸出密文。

1.2 實現思路及創新點

實現代碼見附錄,原理比較簡單,按照步驟寫代碼即可。

使用了重合指數法對維吉尼亞密碼進行攻擊,以及使用了統計分析的方法對移位密碼進行攻擊,針對長密文攻擊具有良好的攻擊效果。

1.3 安全性分析

① 窮舉分析

移位密碼窮舉只需要\(n-1\)次。

乘數密碼只需要$ \varphi(n)-1 $次。

放射密碼只需要\(n\varphi(n)-1\)次。

② 統計特性分析

英語或者說任何自然語言都有固有的統計特性。可以根據字母頻率進行破譯。

image-20201221171737521

同樣,字母組合也有其統計特性。

可以根據其統計特性猜測置換的密文對應的明文。

單表替換統計分析

  1. 統計密文的各種統計特征,如果密文量比較多,則完成這步后便可確定出大部分密文字母
  2. 分析雙字母、三字母密文組,以區分元音和輔音字母
  3. 分析字母較多的密文,在這一過程中大膽使用猜測的方法,如果猜對一個或幾個詞,就會大大加快破譯過程

多表替換統計分析

多表替換在一定程度上隱藏了明文消息的一些統計特性分析,破譯相對比較困難。

  • 主要包括兩個步驟:
  1. 確定密鑰的長度d(就是確定使用的加密表個數)
  2. 確定具體的密鑰字
  • 確定密鑰的長度兩種方法:
  1. Kasiski測試法
  2. 重合指數法

① 確定密鑰字:

Kasiski測試法基本原理

若用給定的d個密鑰表周期地對明文字母加密,則當明文中兩個相同字母組的間隔為d的倍數時,這兩個明文字母組對應的 密文字母組必相同

兩個相同的密文段,對應的明文段不一定相同,但相同的可能性大。將密文中相同的字母組找出來,並找出相同字母組距離的最大公因子,就有可能提取出密鑰的長度d

過程:

搜索長度至少為2的相鄰的一對對相同的密文段,記下它們之間的距離。而密鑰長度d可能就是這些距離的最大公因子。

重合指數法基本原理

重合指數:設\(x=x_1\;x_2\;…\;x_n\)是n個字母的串,x的重合指數是指x中兩個隨機元素相同的概率,記為\(I_c ( x )\)

\[I_c(x)={\sum^{25}_{i=0}f_i(f_i-1)\over n(n-1)} \]

\[期望值:I_c(x)=\sum_{i=0}^{25}p_i^2=0.065 \]

假定\(y=y_1\;y_2\;…\;y_n\)Vigenere密碼的密文串。把\(y\)分成\(d\)個長為\(n/d\)的子串,記為\(Y_1, Y_2,⋯Y_d\)

\[\begin{array}{c} Y_1=y_1y_{d+1}y_{2d+1}y_{3d+1}...\\ Y_2=y_2y_{d+2}y_{2d+2}y_{3d+2}...\\ ......\\ Y_d=y_dy_{2d}y_{3d}y_{4d}... \end{array} \]

如果d是密鑰字長度,那么每個\(Y_i\)都可以看作單表置換密碼每個\(I_c(y_i)\;(1≤i≤d)\)都會趨近於0.065

如果不是,那么會更加隨機一點。

② 確定具體密鑰字:

這里已經退化成了凱撒密碼,可以使用窮舉法得到密鑰字。

但是對於非已知密碼算法可以采用重合互指數法。

重合互指數:假定\(x=x_1\;x_2\;…\;x_n\)\(y=y_1\;y_2\;…\;y_n′\),分別是長為\(n\)\(n'\)的字母串。\(x\)\(y\)的重合互指數是指\(x\)的一個隨機元素等於\(y\)的一個隨機元素的概率,記為\(MI_c(x,y)\)

具體步驟:

\(x\)\(y\)中的字母\(A,B,C,……,Z\)出現的次數分別表示為\(f_0,f_1,……,f_{25}\)\(f_0^′, f_1^′,⋯, f_{25}^′\), 那么有

\[\begin{array}{c} MI_c(x,y)=\sum^{25}_{i=0}{f_i\over n}{f_i^`\over n^`}={\sum^{25}_{i=0}f_if_i^`\over nn^`} \end{array} \]

設定密鑰字\(K=(k_1,k_2,k_3,...k_n)\)

\(MI_c (Y_i, Y_j )\)的估計值只依賴於差\((k_i-k_j) mod 26\),我們稱該差為\(Y_i\)\(Y_j\)的相對移位。

當相對移位不是0,估計值在0.031-0.045之間,是0的時候,估計值是0.065。

可以利用這個計算出任何兩個字串的\(Y_1,Y_2\)相對移位,有了相對移位只需要窮舉26次就可找出密鑰字。

二、序列密碼

2.1原理

2.1.1 LSFR

①密鑰流的要求:

  • 極大的周期:隨機序列是非周期的,而按任何算法產生的序列都是周期的,因此應要求密鑰流具有盡可能大的周期

  • 良好的統計特性:隨機序列有均勻的游程分布

    游程:指序列中相同符號的連續段,其前后均為異種符號。

    例如:……0 111 0000 10……

    注意:計算游程的時候要首尾相連計算,頭和尾的兩個0合在一起構成長度為2的0游程。

    有長為3的1游程、長為4的0游程、長為1的1游程,長為2的0游程。一般要求其在周期內滿足:同樣長度的0游程和1游程的個數相等,或近似相等。

  • 很高的線性復雜度:不能用級數較小的線性移位寄存器LFSR近似代替

  • 用統計方法由密鑰序列\(k_0k_1k_2…ki…\)提取密鑰生成器結構或種子密鑰在計算上不可行

②反饋移位寄存器:

image-20201221221349679

GF(2)上一個n級反饋移位寄存器由n個二元存儲器與一個反饋函數\(f(a_1a_2 ... a_n)\)組成

  • 每個存儲器稱為移位寄存器的一級

  • 在任一時刻,這些級的內容構成該FSR的狀態;對應於一個GF(2)上的n維向量,共有\(2^n\)種可能的狀態

  • 狀態可用n長序列\(a_1, a_2, a_3, …, a_n\)或n維行向量\((a_1, a_2, a_3, …, a_n)\)表示

  • 每一級存儲器\(a_i\)將其內容向下一級\(a_{i-1}\)傳遞,並根據存儲器當前狀態計算\(f(a_1, a_2, a_3, …, a_n)\)作為\(a_n\)下一時間的內容

example:

image-20201221222458573

初始狀態為\((a_1,a_2,a_3)=(1,0,1)\),輸出可由上表求出,其輸出序列為\(10111011101…\),周期為4

如果反饋函數\(f(a_1, a_2, …, a_n)\)\(a_1, a_2, …, a_n\)的線性函數,則稱為線性反饋移位寄存器(LFSR)

\[f(a_1,a_2...a_n)=c_na_1⊕c_{n-1}a_2⊕...⊕c_2a_{n-1}⊕c_1a_n \]

image-20201221223018332

n級LFSR最多有\(2^n\)個不同的狀態

初始狀態為零,則其狀態恆為零

若其初始狀態非0,則其后繼狀態不會為0

因此n級LFSR的狀態周期\(≤2^n-1\)

輸出序列的周期與狀態周期相等,所以$≤2^n-1 $

選擇合適反饋函數可使序列周期達到最大值\(2^n -1\),周期達到最大值的序列稱為m序列

特征多項式表示:

\[p(x)=1+c_1x+...+c_{n-1}x^{n-1}+c_nx^n \]

1是必須寫的,\(c_i\)的取值和上面一一對應

  • 定理:n級LFSR產生的序列有最大周期\(2^n-1\)的必要條件是其特征多項式為不可約的

  • 定義:若n次不可約多項式\(p(x)\)的階為\(2^n-1\),則稱\(p(x)\)是n次本原多項式,使得\(p(x)|(x^p-1)\)的最小p稱為\(p(x)\)的階

  • 定理:\(\{a_i\}∈G(p(x))\)\(\{a_i\}\)為m序列的充要條件\(p(x)\)為本原多項式

LSFR的優點:

  1. 非常適合硬件實現
  2. 能產生大的周期序列
  3. 能產生統計特性好的序列
  4. 能夠應用代數方法進行很好的分析

2.1.2 RC4

RC4算法的大小根據參數\(n\)的值而變化,通常\(n=8\),這樣RC4可生成\(256(2^8)\)個元素的數據表\(S:S_0,S_1,S_2,…,S_{255}\)

種子密鑰長度為1~256個字節(8~2048比特)的可變長度,用於初始化256個字節的初始向量S

RC4有兩個主要算法:

  1. 密鑰調度算法(KSA)

  2. 偽隨機數生成算法(PRGA)

基本思想:

  • 根據種子密鑰,利用密鑰調度算法對數據表S進行重新排列

  • 利用偽隨機數生成算法,從重新排列的數據表S中取出一個字節

  • 每取出一個字節,數據表S將發生變化

2.2實現思路及創新點

代碼見附錄

功能:給定任意本原多項式以及初始序列,都可以生成周期為\(2^n-1\)的序列。

同時基於LSFR實現了RC4算法。

2.3安全性分析

對於m-序列(周期為\(2^n-1\)),如果攻擊者知道了\(2n\)位明密文對,則可確定反饋多項式的系數,從而確定該LFSR接下來的狀態,也就能得到余下的密鑰序列,具體過程如下:

\[\begin{array}{c} x=x_1x_2...x_{2n}\\y=y_1y_2...y_{2n} \end{array} \]

可以求出一段長為2n的密鑰序列

\[\begin{array}{c} z=z_1z_2...z_{2n} \end{array} \]

其中

\[y_i=x_i⊕z_i\;\;z_i=x_i⊕y_i \]

由此可以推出線性反饋移位寄存器連續的n+1個狀態:

\[\begin{array}{c} S_1=(z_1z_2...z_n)=(a_1a_2...a_n)\\ S_1=(z_1z_2...z_n)=(a_1a_2...a_n)\\ ...\\ S_1=(z_1z_2...z_n)=(a_1a_2...a_n) \end{array} \]

序列\(\{a_i\}\)滿足線性遞推關系:

\[a_{h+n}=c_ia_{h+n-1}⊕c_2a_{h+n-2}⊕...⊕c_na_h \]

做矩陣 \(X=(S_1\;S_2...S_n)\)

所以

\[\begin{array}{l} [a_{n+1}a_{n+2}...a_{2n}]=[c_nc_{n-1}...c_1] \left[ \begin{matrix} a_1 & a_2 & a_n \\ a_2 & a_3 & a_{n+1} \\...\\ a_n & a_{n+1} & a_{2n-1} \end{matrix} \right]\\=[c_nc_{n-1}...c_1] \end{array} \]

若X可逆,則

\[[c_nc_{n-1}...c_1]=[a_{n+1}a_{n+2}...a_{2n}]X^{-1} \]

三、分組密碼

3.1原理

① 分組密碼特點:

速度快、安全性較高、易於標准化和便於軟硬件實現

是信息與網絡安全中實現數據保密性的核心機制,在計算機通信和信息系統安全領域有着廣泛應用

也是構造偽隨機數生成器、序列密碼、消息認證碼和Hash函數的方法

② 分組密碼設計要求:

分組長度要足夠大

  • 假設n為分組長度,則要使\(2^n\)足夠大,防止明文窮舉攻擊

密鑰量要足夠大

  • 防止密鑰窮舉攻擊

密碼變換要足夠復雜

  • 使攻擊者除窮舉攻擊外,找不到其他簡潔的數學攻擊方法

加密和解密運算簡單

  • 便於軟件和硬件的實現

無數據擴展和壓縮

③ 分組密碼設計思想✨

  1. 擴散原則
  • 密鑰或明文的每一比特變化影響密文的許多比特的變化,以便隱蔽明文的統計特性(雪崩效應)
  1. 混淆原則
  • 混亂原則,指密鑰和明文以及密文之間的依賴關系盡可能的復雜化,以防通過統計分析法進行破譯

image-20201230151131294

3.1.1 DES

image-20201230152015348

明文分組和密文分組均為64比特有效密鑰56比特

DES基於加密的兩個基本屬性:替換(也稱為混亂)和置換(也稱為擴散)。DES由16個步驟組成,每個步驟稱為一個回合。每輪執行替換和轉位的步驟。現在讓我們討論DES中的廣泛步驟:

  1. 第一步,將64位純文本塊移交給初始置換(IP)功能。
  2. 初始置換是對純文本執行的。
  3. 接下來,初始置換(IP)產生置換塊的兩半;稱為左純文本(LPT)和右純文本(RPT)。
  4. 現在,每個LPT和RPT都要經過16輪加密過程。
  5. 最后,重新合並LPT和RPT,並在組合塊上執行最終置換(FP)
  6. 該過程的結果將產生64位密文。

image-20201230152937242

3.1.2 AES

采用SPN結構的迭代型分組密碼

分組長度和密鑰長度都可變,各自可以為128、192、256比特

image-20210109160028312

AES的加解密過程:

密鑰被擴展成44個32比特字所組成的數組W[i]

AES每輪由4個階段組成:

  • 字節代換

  • 行移位

  • 列混合

  • 輪密鑰加

每個階段均可逆,加密和解密算法不相同

加密和解密的最后一個階段均只有3個階段(沒有列混合階段)

image-20210109160130121

3.2實現思路及創新點

DES運算時間的改進:

DES 算法的實現中,要實現 E 擴展功能,從表里逐個取數據來擴展成48 位,這樣計算的工作量較大,從擴展置換 E 表中的數據清楚地反映了置換中的規律:即將\(R_{i-1}\)第1位賦給\(R^`_{i-1}\)的第 2 位,\(R_{i-1}\)的第2位賦給\(R^`_{i-1}\)的第 3 位 ,以此類推.找到這個規律 ,可 以不需要逐個從表里取數據 ,有助於程序實現 的改進並能夠提高計算的速度.這 48 位的擴展的實現將由計算代替查表 ,按照下面的程序段來實現 ,可以提高運行的速度,速度大概提高了 2-3 倍。

for(i=0;i<8;i++)
	for(j=O;j<6;j++)
		a=i*4+j

實現了ECB,CBC模式的DES,同時針對DES密鑰過短的特點進行改進,實現了3DES。

image-20201230195407579

密鑰長度任意,不夠使用密鑰循環填充到8byte,超出只選取前8byte。

可以支持加密漢字,字母,數字,特殊符號的密文,並進行base64編碼。

3.3安全性分析

普通的DES很容易被窮舉攻擊,存在一些弱密鑰和半弱密鑰,代數結構存在互補對稱性,可以使用3DES或者AES改進。

分組密碼攻擊方法有

  1. 窮舉攻擊

  2. 線性分析攻擊

  3. 差分分析攻擊

  4. 相關密鑰分析攻擊

  5. 代數攻擊

  6. 中間相遇攻擊

四、Hash函數

4.1原理

hash函數基本特征:

  • 算法公開,不需要密鑰

  • 數據壓縮:可將任意長度的輸入數據變換成一個固定長度的輸出

  • 易於計算:對任何給定的m,h(m)易於計算

  • 單向性(抗原像性,Pre-image Resistance):給定消息的散列值h(m),要得到消息m在計算上不可行

安全性要求

  1. 抗弱碰撞性

    對任意給定的消息\(m\),尋找與\(m\)不同的消息\(m’\),使得\(h(m)=h(m’)\)在計算上不可行

  2. 抗強碰撞性

    尋找任意兩個不同的消息\(m\)\(m’\),使得\(h(m)=h(m’)\)在計算上不可行

4.1.1 MD5

結構:

image-20210109164007833

步驟1(填充消息): 使消息長度模512=448

  • 如果消息長度模512恰等於448,增加512個填充比特。即填充的個數為1~512

  • 填充方法:第1比特為1,其余全部為0

步驟2(補足長度): 將消息長度轉換為64比特的數值

  • 如果長度超過64比特所能表示的數據長度,值保留最后64比特

  • 添加到填充數據后面,使數據為512比特的整數倍

512比特按32比特分為16組

MD5分組操作

image-20210109165458050

MD5步操作

image-20210109165531329

4.1.2 SHA-1

第一步:填充消息

  • 使消息長度模512=448。如果消息長度模512正好=448,增加512個填充比特,即填充個數為1~512

  • 填充方法:第1個比特為1,其余全部為0

  • 計算公式:補零的個數\(d=447-(|x| mod 512) (|x|: 消息長度)\)

\[X||1||0^d|| \]

第二步:補足長度

  • 將數據長度轉換為64bit的數值

  • 每個512bit按每組32bit進行分組,分為16組

image-20210109165726851

image-20210109165800995

4.2實現思路及創新點

MD5比較簡單,按照步驟,實現了針對字節進行處理,可以處理漢字,字母,數字,以及特殊符號的MD5算法。

4.3安全性分析

對Hash函數的基本攻擊方法:

  1. 窮舉攻擊:能對任何類型的Hash函數進行攻擊

    • 最典型方法是“生日攻擊”:給定初值\(H_0\),尋找\(M’≠ M\),使\(h(M’)= H_0\)
  2. 密碼分析法:依賴於對Hash函數的結構和代數性質分析,采用針對Hash函數弱性質的方法進行攻擊。這類攻擊方法有中間相遇攻擊、修正分組攻擊和差分分析等

五、公鑰密碼及數字簽名

5.1原理

每個用戶都分別擁有兩個密鑰:加密密鑰(公鑰)與解密密鑰(私鑰) ,兩者並不相同,且由加密密鑰得到解密密鑰在計算上不可行。加密密鑰是公開的。

image-20210106214134683

關鍵是尋找單向陷門函數

  1. 給出\(f\)定義域中的任意元素\(x\),計算\(f(x)\)是容易的

  2. 給出\(y=f(x)\)中的\(y\),計算\(x\)

  • 若知道設計函數f時結合進去的某種信息(稱為陷門),則\(x\)容易計算;

  • 若不知道該陷門信息,則\(x\)難以計算

單項陷門函數依賴於數學困難問題

  1. 大整數因子分解問題(如公鑰密碼體制RSA)

    • 給定兩個素數\(p,q,\)計算乘積\(n=pq\)很容易,但給定整數\(n\),求\(n\)的素因子\(p,q\)使得\(n=pq\)是困難的
  2. 有限域上的離散對數問題(如公鑰密碼體制ElGamal)

    • 已知有限循環群\(G=<g>={g^k|k=0,1,2,…}\)及其生成元\(g\)和階\(|G|=n.\)給定整數\(a\),求\(h=g^a\)很容易;但是給定元素\(h\),計算整數\(x\),使得\(h=g^x\)非常困難
  3. 橢圓曲線上的離散對數問題(如公鑰密碼體制ECC)

  4. 背包問題(背包算法)

  5. 基於身份的密碼體制(IBE

5.1.1 RSA

安全性基於大整數因子分解的困難性

  1. 密鑰的生成

    • 選擇兩個大素數 \(p\)\(q\),(\(p≠q\),需要保密)
    • 計算\(n=p×q\)\(\varphi(n)=(p-1)×(q-1)\)
    • 選擇整數 \(e\)使$ (\varphi(n),e) =1, 1<e< \varphi(n) $
    • 計算\(d\),使\(d=e^{-1} mod \varphi(n)\),
    • 得到:公鑰為\({e, n}\); 私鑰為\({d}\)
  2. 加密\((e,n)\): 明文\(M<n\), 密文\(C=M^e (mod n)\)

  3. 解密\((d,n)\): 密文\(C\), 明文\(M =C^d (mod n)\)

正確性驗證

\[C^dmod\;n=(M^e)^dmod\;n=m^{ed}mod\;n≡M\;mod\;n \]

大素數的生成與檢驗

先隨機生成一個適當大小的奇數n,再檢測其素性;如果不是,則選取后繼的隨機數直到找到通過檢驗的素數為止

概率素性檢測

這里使用Miller-Rabin算法

引理:

(1)費馬小定理:當\(p\)為質數,有\(a^{p-1}≡1(mod\;p)\),不過反過來不一定成立,也就是說,如果\(a,p\)互質,且\(a^{p-1}≡1(mod\;p)\),不能推出\(p\)是質數,比如\(Carmichael\)

(2)二次探測:如果\(p\)是一個素數,\(0<x<p\), 則方程\(x^2≡1(mod\;p)\)的解為\(x=1\)\(x=p-1\)

算法流程

(1)對於偶數和 $0,1,2 $可以直接判斷。

(2)設要測試的數為 \(x\),我們取一個較小的質數\(a\) ,設\(s,t\)滿足\(2^st=x-1\)(其中\(t\)是奇數)。

(3)我們先算出\(a^t\),然后不斷地平方並且進行二次探測(進行\(s\)次)。

(4)最后我們根據費馬小定律,如果最后\(a^{x-1}≠1(mod\;x)\),則說明\(x\)為合數。

(5)多次取不同的\(a\)進行\(Miller-Rabin\)素數測試,這樣可以使正確性更高

快速冪算法

常見的快速冪算法是模平方計算法,但是對於大整數,計算機進行取模運算效率是很低的,所以對此進行了優化。

代碼如下:

public static BigInteger expMod(int base, BigInteger exp, BigInteger n) {
	if (exp.equals(BigInteger.ZERO)) {
		return BigInteger.ONE;
	}

	if (!exp.testBit(0)) {//如果為偶數
		return expMod(base, exp.divide(BigInteger.valueOf(2)), n).pow(2).remainder(n);
	} else {
		return (expMod(base, exp.subtract(BigInteger.ONE).divide(BigInteger.valueOf(2)), n).pow(2).multiply(BigInteger.valueOf(base))).remainder(n);
	}
}

沒有進行取模運算,可以說幾乎做到了Java代碼層最快了。

Miller-Rabin算法代碼實現:

public static boolean passesMillerRabin(BigInteger n) {
        int base = 0;
        if (n.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) < 0) {
            base = ran.nextInt(n.intValue() - 1) + 1;
        } else {
            base = ran.nextInt(Integer.MAX_VALUE - 1) + 1;
        }

        BigInteger thisMinusOne = n.subtract(BigInteger.ONE);
        BigInteger m = thisMinusOne;
        while (!m.testBit(0)) {
            m = m.shiftRight(1);
            BigInteger z = BigInteger.valueOf(base).modPow(m, n);
            //BigInteger z = expMod(base, m, n);
            if (z.equals(thisMinusOne)) {
                break;
            } else if (z.equals(BigInteger.ONE)) {

            } else {
                return false;
            }
        }
        return true;
    }

根據標准 ANSI X9.80, "PRIME NUMBER GENERATION, PRIMALITY TESTING, AND PRIMALITY CERTIFICATES". n的bit數越多, 需要的檢測次數就越少。

public static boolean isPrime(BigInteger n) {
        int sizeInBits = n.bitLength();
        int tryTime = 0;
        if (sizeInBits < 100) {
            tryTime = 50;
            return isPrime(n, tryTime);
        }

        if (sizeInBits < 256) {
            tryTime = 27;
        } else if (sizeInBits < 512) {
            tryTime = 15;
        } else if (sizeInBits < 768) {
            tryTime = 8;
        } else if (sizeInBits < 1024) {
            tryTime = 4;
        } else {
            tryTime = 2;
        }
        return isPrime(n, tryTime);
    }

5.1.2 Elgamal

安全性基於離散對數問題

離散對數問題:設\(p\)至少是150位的十進制素數,\(p-1\)有大素因子。\(Z_p\)為有限域,若\(g\)\(Z_p\)中的本原元/生成元/原根,有

\[{Z_p}^∗=<g> \]

$ β∈{Z_p}^∗=Zp{0}\(,求唯一的整數\)a(0≤a≤p-2)$,滿足

\[g^a=β(mod p) \]

記為$a=log_gβ $

一般來說,求解\(a\)在計算上是困難的

算法特點:

  1. 非確定性:由於密文依賴於加密過程中用戶A選擇的隨機數r ,所以加密相同的明文可能會產生不同的密文—概率加密

  2. 密文空間大於明文空間:明文空間為\({Z_p}^∗\),而密文空間為\({Z_p}^∗×{Z_p}^*\)

5.2實現思路及創新點

RSA使用Miller-Rabin算法檢驗素數,根據ANSI X9.80標准進行檢驗次數的選擇。

改進快速冪算法,由於計算機對大整數取模運算效率很低,所以對此進行了優化,沒有進行取模運算,效率提高到和標准庫幾乎一樣。

密鑰按照X.509標准進行編碼,密文進行base64編碼,提高傳輸效率。

實現了RSA簽名算法。

5.3安全性分析

針對RSA的攻擊方式主要有

  • 針對n分解的攻擊

  • 循環攻擊

  • 同模攻擊

  • 選擇密文攻擊

  • 低加密指數攻擊

  • 時間攻擊

運用RSA需要注意

  1. 選擇素數\(p\)\(q\)時,應使其歐拉函數\(\varphi(p)\)\(\varphi(q)\)的最小公倍數盡可能大\((\varphi(p)\)\(\varphi(q)\)有大的素因子)。最小公倍數越大,冪剩余函數的周期就越長—避免循環攻擊

  2. 密鑰中的各項參數應選得足夠大—避免窮舉攻擊

  3. 在同一個通信網絡中,不同的用戶不應該使用共同的模數—避免同模攻擊

六、混合加密

6.1 架構設計

程序主框架

image-20210107162621192

安全套接字socket實現流程

img

6.2 創新點

采用B/S架構進行設計,服務端采用多線程,可以支持多客戶端同時並發連接,具有良好的工程性。

通過對稱密鑰加密數據,公鑰加密密鑰,提高了加密速度。

實現了數字簽名。

不足:因為時間原因,對稱加密使用了DES算法,存在不安全的隱患,可以使用AES進行改進。

6.3 安全性分析

對稱加密使用了DES,可以換用安全性更好的AES,RSA也可以換成ECC橢圓曲線算法。

附錄

源碼:

鏈接:https://pan.baidu.com/s/1ZCJAwJwCHhwEwEpvkxmSmA
提取碼:cumt
復制這段內容后打開百度網盤手機App,操作更方便哦–來自百度網盤超級會員V3的分享


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM