RSA、Elgamal、ECC等加密解密過程以及相應的數字簽名(無證明過程)

RSA

RSA加密解密
  • 描述
    RSA加密算法是一種非對稱加密算法,在公開**加密和電子商業中被廣泛使用。RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。當時他們三人都在麻省理工學院工作。RSA就是他們三人姓氏開頭字母拼在一起組成的。對極大整數做因數分解的難度決定了RSA算法的可靠性。換言之,對一極大整數做因數分解愈困難,RSA算法愈可靠。假如有人找到一種快速因數分解的算法的話,那麼用RSA加密的信息的可靠性就會極度下降。但找到這樣的算法的可能性是非常小的。今天只有短的RSA鑰匙纔可能被強力方式**。到當前爲止,世界上還沒有任何可靠的攻擊RSA算法的方式。只要其鑰匙的長度足夠長,用RSA加密的信息實際上是不能被**的。
  • 目的:A想要給B發送一條只有他們兩人知道的消息m
  • 公開:公鑰{n,e}
  • 保密:私鑰{d},p,q
  • 參數解釋:p、q是兩個大素數,至於怎麼生成大素數,暫時先不要管,之後我會在寫博客,然後把連接賦過來(也可以去搜素性檢驗);n=p*q,那麼相應的就有 φ ( m ) = ( p 1 ) ( q 1 ) \varphi(m)=(p-1)*(q-1) ,取 g c d ( e , φ ( m ) ) = 1 gcd(e,\varphi(m))=1 ,那麼則求出d: e d 1 m o d   φ ( m ) e*d\equiv 1 mod\ \varphi(m) ,產生e,d之後即可銷燬p,q
  • **生成: e d 1 m o d   φ ( m ) e*d\equiv 1 mod\ \varphi(m) ,e爲公鑰,d爲私鑰
  • 加密過程: c m e   m o d   n c\equiv m^e \ mod\ n
  • 解密過程: m c d   m o d   n m\equiv c^d \ mod\ n
  • 證明:略
RSA數字簽名
  • 描述
    數字簽名(英語:Digital Signature,又稱公鑰數字簽名)是一種功能類似寫在紙上的普通簽名、但是使用了公鑰加密領域的技術,以用於鑑別數字信息的方法。一套數字簽名通常會定義兩種互補的運算,一個用於簽名,另一個用於驗證。法律用語中的電子簽章與數字簽名代表之意義並不相同。電子簽章指的是依附於電子文件並與其相關連,用以辨識及確認電子文件簽署人身份、資格及電子文件真僞者;數字簽名則是以數學算法或其他方式運算對其加密而形成的電子簽章。意即並非所有的電子簽章都是數字簽名。 數字簽名不是指將簽名掃描成數字圖像,或者用觸摸板獲取的簽名,更不是落款。 數字簽名了的文件的完整性是很容易驗證的(不需要騎縫章、騎縫簽名,也不需要筆跡鑑定),而且數字簽名具有不可抵賴性(即不可否認性),不需要筆跡專家來驗證。
  • 目的:擁有A的簽名的文件,數據,無法被僞造,能唯一確認並簡易驗證
  • 公開:公鑰{n,e}
  • 保密:私鑰{d},p,q
  • 參數解釋:p、q是兩個大素數,至於怎麼生成大素數,暫時先不要管,之後我會在寫博客,然後把連接賦過來(也可以去搜素性檢驗);n=p*q,那麼相應的就有 φ ( m ) = ( p 1 ) ( q 1 ) \varphi(m)=(p-1)*(q-1) ,取 g c d ( e , φ ( m ) ) = 1 gcd(e,\varphi(m))=1 ,那麼則求出d: e d 1 m o d   φ ( m ) e*d\equiv 1 mod\ \varphi(m) ,產生e,d之後即可銷燬p,q
  • 簽名過程: x d y   m o d   n x^d \equiv y\ mod\ n ,對消息x的簽名y
  • 驗證過程: y e x   m o d   n y^e \equiv x\ mod\ n ,對簽名y的認證

有沒有這樣的疑問,在A向B發送消息的時候,是先加密再簽名還是先簽名再加密?
正確的答案應該是:前簽名後加密!!
因爲簽名是任何人都能夠解開的,如果把簽名放到最後,被敵手截獲,那麼敵手解開a的簽名後,再對中間密文進行一次自己的(別人的)簽名,然後發給接收方,那麼接收方B收到的A的消息就無法進行驗證解密了;

Elgamal

Elgamal加密解密
  • 描述
    在密碼學中,ElGamal加密算法是一個基於迪菲-赫爾曼**交換的非對稱加密算法。它在1985年由塔希爾·蓋莫爾提出。[1]GnuPG和PGP等很多密碼學系統中都應用到了ElGamal算法。 ElGamal加密算法可以定義在任何循環羣{\displaystyle G}上。它的安全性取決於{\displaystyle G}上的離散對數難題。ElGamal加密算法由三部分組成:**生成、加密和解密。
  • 公開:{p,g,y}
  • 保密:{x}
  • 參數解釋:p是一個大素數,g是Zp*中的生成元,x與y滿足:x屬於 Z p 1 Z_{p-1} y g x m o d   p y\equiv g^x mod\ p
  • **生成: y g x m o d   p y\equiv g^x mod\ p ,y爲公鑰,x爲私鑰
  • 加密過程:
    隨機選取一個整數k,k屬於 Z p 1 Z_{p-1}
    r g k m o d   p r\equiv g^k mod\ p
    s m y k m o d   p s\equiv m*y^k mod\ p
    加密後的密文爲(r,s)
  • 解密過程: m s ( r x ) 1 m o d   p m\equiv s*(r^x)^{-1} mod\ p
Elgamal簽名
  • 公開:{p,g,y}
  • 保密:{x}
  • 簽名過程:
    隨機選取一個整數k,k屬於 Z p 1 Z_{p-1}
    r g k m o d   p r\equiv g^k mod\ p
    s ( h ( m ) x r ) k 1 m o d   p 1 s\equiv (h(m)-xr)k^{-1} mod\ p-1 ,h是Hash函數
    得到關於m的簽名,(r,s)
  • 驗證過程: y r r s g h ( m ) m o d   p y^r*r^s\equiv g^{h(m)} mod\ p
類Elgamal簽名
  • 公開:{p,q,g,y}
  • 保密:{x}
  • 參數說明:
    p,q是大素數,且q | p-1
    隨機選取q階元g
    隨機選取x,x<=q-1,計算 y g x m o d   p y\equiv g^x mod\ p
  • 簽名過程:
    得到h(m)
    r g k m o d   p r\equiv g^k mod\ p
    a k b + c x m o d   q ak \equiv b + cx mod\ q 中,計算出s,即{a,b,c}和{r,s,h(m)}對應
  • 驗證過程: g b y c r a m o d   p g^b*y^c\equiv r^a mod\ p

ECC

ECC加密解密
  • 描述
    橢圓曲線密碼學(英語:Elliptic Curve Cryptography,縮寫:ECC)是一種基於橢圓曲線數學的公開**加密算法。橢圓曲線在密碼學中的使用是在1985年由Neal Koblitz和Victor Miller分別獨立提出的。 ECC的主要優勢是在某些情況下它比其他的算法(比如RSA加密算法)使用更小的**並提供相當的或更高等級的安全。ECC的另一個優勢是可以定義羣之間的雙線性映射,基於Weil對或是Tate對;雙線性映射已經在密碼學中發現了大量的應用,例如基於身份的加密。不過一個缺點是加密和解密操作的實現比其他機制花費的時間長。橢圓曲線密碼學的許多形式有稍微的不同,所有的都依賴於被廣泛承認的解決橢圓曲線離散對數問題的困難性上,對應有限域上橢圓曲線的羣。

  • 橢圓曲線方程: y 2 = x 3 + a x + b y^2=x^3+ax+b

  • 公開{p,G,a,b,Y}

  • 保密{x}

  • 參數說明,p爲一個大素數,G是循環羣的階爲n(大素數)的生成元,a,b是方程的參數,Y=xG,x爲私鑰,Y爲公鑰

  • 加法運算規則
    在這裏插入圖片描述

  • 加密過程:
    對明文m鑲嵌到橢圓曲線上
    在這裏插入圖片描述
    隨機選取k<n,這個k與上面的不一樣
    C 1 = k G C_1 = kG
    C 2 = P m + k Y C_2 = P_m+kY
    得出密文: ( C 1 , C 2 ) (C_1,C_2)

  • 解密過程: P m = C 1 x C 2 P_m=C_1-x*C_2

DSA

DSA簽名
  • 描述
    數字簽名算法(DSA)是用於數字簽名的聯邦信息處理標準,基於模算數和離散對數的複雜度。DSA是Schnorr和ElGamal簽名方案的變體。 美國國家標準技術研究所(NIST)於1991年提出將DSA用於其數字簽名標準(DSS),並於1994年將其作爲FIPS 186採用。[2]已對初始規範進行了四次修訂。DSA已獲得專利,但NIST已將此專利在全球範圍內買斷式授權。 DSA的橢圓曲線密碼學版本是ECDSA。DSA算法工作在框架公鑰加密、模算數和離散對數問題,這被認爲是難解問題。該算法使用由公鑰和私鑰組成的**對。私鑰用於生成消息的數字簽名,並且可以通過使用簽名者的相應公鑰來驗證這種簽名。數字簽名提供信息鑑定(接收者可以驗證消息的來源),完整性(接收方可以驗證消息自簽名以來未被修改)和不可否認性(發送方不能錯誤地聲稱它們沒有簽署消息)。
  • 公開:{p,q,g,y}
  • 保密:{x}
  • 參數說明:
    512<=L<=1024,L是64的倍數,選取大素數 2 L 1 < p < 2 l 2^{L-1}<p<2^l ,另外一個大素數q | p-1,q是160比特
    隨機選取h,h<p-1, g = h ( p 1 / q ) m o d   p g= h^{(p-1/q)} mod\ p
    隨機選取x,x<p , y = g x   m o d   p y=g^x\ mod\ p ,y爲公鑰,x爲私鑰
  • 簽名過程:
    r = g k m o d   p   m o d   q r= g^k mod\ p\ mod\ q
    s = ( h ( m ) + x r ) k 1   m o d q s=(h(m)+xr)k^{-1}\ mod q
  • 驗證過程:
    u 1 = h ( m ) s 1   m o d   q u_1=h(m)s^{-1}\ mod\ q
    u 2 = r s 1   m o d   q u_2=r*s^{-1}\ mod\ q
    g u 1 y u 2   m o d   p   m o d   q = r g^{u_1}*y^{u_2}\ mod\ p\ mod\ q=r