冪加密
① 簡述加密技術的基本原理,並指出有哪些常用的加密體制及其代表演算法
1、對稱加密演算法
對稱加密演算法用來對敏感數據等信息進行加密,常用的演算法包括:
DES(Data Encryption Standard):數據加密標准,速度較快,適用於加密大量數據的場合。
3DES(Triple DES):是基於DES,對一塊數據用三個不同的密鑰進行三次加密,強度更高。
AES(Advanced Encryption Standard):高級加密標准,是下一代的加密演算法標准,速度快,安全級別高;
演算法原理
AES 演算法基於排列和置換運算。排列是對數據重新進行安排,置換是將一個數據單元替換為另一個。AES 使用幾種不同的方法來執行排列和置換運算。
2、非對稱演算法
常見的非對稱加密演算法如下:
RSA:由 RSA 公司發明,是一個支持變長密鑰的公共密鑰演算法,需要加密的文件塊的長度也是可變的;
DSA(Digital Signature Algorithm):數字簽名演算法,是一種標準的 DSS(數字簽名標准);
ECC(Elliptic Curves Cryptography):橢圓曲線密碼編碼學。
演算法原理——橢圓曲線上的難題
橢圓曲線上離散對數問題ECDLP定義如下:給定素數p和橢圓曲線E,對Q=kP,在已知P,Q 的情況下求出小於p的正整數k。可以證明由k和P計算Q比較容易,而由Q和P計算k則比較困難。
將橢圓曲線中的加法運算與離散對數中的模乘運算相對應,將橢圓曲線中的乘法運算與離散對數中的模冪運算相對應,我們就可以建立基於橢圓曲線的對應的密碼體制。
② 給出p、q、e、M,求公鑰,私鑰,並且利用RSA演算法加密和解密
假定用戶A要發送消息m給用戶B,1)用戶B要產生兩個素數p和q;2)用戶B計算n=pq和φ(n)=(p-1)(q-1);3)用戶B選著一個數e(0<e<φ(n)),使得e和φ(n)互為素數;4)用戶B通過計算得出d,使得de除φ(n)的余數為1;5)用戶B將n和e作為公鑰公開;6)用戶A通過公開渠道查到n和e;7)用戶A對消息m進行加密,即E=m^e mod n=c(也就是說m的e次方除n的余數為c);8)用戶B收到密文c後,進行解密D=c^d mod n。
公鑰就是(n,e) 私鑰就是(n,d)
ps:若不想產生數據溢出(mod後的數大於25)的話,n最好選取0~25之間的數;如若是解密後的明文不出現差錯,選取的n最好大於m中十進制數最大的數。
example:令26個英文字母對應於0-25的整數,用戶B產生兩個素數p=3,q=11,φ(n)=2*10=20,取e=3,則d=7,用戶B將n=33和e=3公開
如果A想發送in給B,則A會通過公共渠道找到(n,e),然後將信息加密,E(i)=8^3 mod 33=17,E(n)=13^3 mod 33=19 則它對應的密文為c=rt;用戶B收到A給的密文解密:D(r)=17^7 mod 33=8即明文i,D(t)=19 ^7 mod 33=13,即明文n。
③ RSA加密演算法,求大神幫解答
如果用一段已經知道的明文,經過公鑰加密,得到密文。現在已知明文密文和n, 是不是就可以通過解密的公式不斷的冪運算求出私鑰d呢?
④ 如何進行冪模運算
模冪乘運算採用平方乘演算法,將模冪乘運算轉化為模乘和模平方運算實現.
平方-乘演算法:一般地,求S=ABmodN,其中A<N,B<N;將指數B表示為二進制,即
觀察演算法,由於指數B化為二進制後的長度不確定,多數情況下高位會存在很多個0.如果完全按照該演算法實現,指數B從最高位起開始運算,在第一個1出現以前,雖進行了多次運算,但D的值一直為1;當B出現第一個1後才進入有效的模乘運算.在具體實現時,設計專門的電路從高到低掃描指數B的每一位,當在找到第一個1之前,不做任何運算,找到第一個1時,使D=A,以後根據每次掃描的6[i]值,調用模乘實現運算.
經過對多種公鑰加解密演算法的分析——如RSA演算法,通常公鑰的有效位較短,而私鑰有效位較長.加密中的模冪乘運算,指數有效位很少,所以上面的改進可大大減少模乘次數,加快加密過程.以目前常用的私鑰和模數1 024 bit,公鑰128bit情況為例,採用上述改進可減少896次不必要的模乘.解密過程使用中國余數定理(CRT),可有效降低解密指數的長度,整個演算法的執行效率得到進一步提高.
2.2 模乘及模加的實現方法
模乘採用改進的Blakley加法型演算法,原理與平方-乘演算法類似,核心是將模乘轉化為模加實現.如通常S=(A×B)modN,A<N,B<N可以按如下方式考慮.
將B表示成二進制:
由上式可知,可以像平方一乘演算法一樣,將模乘轉化為模加實現.
一般模加運算表示為S=(A+B)modN,觀察以上模乘及模冪乘演算法原理描述,可知在其調用的模加運算中,因為A<N且B<N,則(A+B)<2N,所以,
因此考慮在運算中同時計算(A+B)和(A+B-N)兩個結果,運算完成後通過判斷加法器與減法器的進位輸出(CO)與借位輸出(BO).決定哪個為本次模加的正確結果.同上,A,B,N均為l位的二進制數,若CO=1,則說明(A+B)為l+1位二進制數,必大於l位的N;若CO=0,則(A+B)和N同為l位,當BO=1時(A+B)<N,當BO=0時N≤(A+B).
從而可以在一次運算中完成加法和求模過程,使模加的運算速度提高1倍.
⑤ 高中生如何理解比特幣加密演算法
加密演算法是數字貨幣的基石,比特幣的公鑰體系採用橢圓曲線演算法來保證交易的安全性。這是因為要攻破橢圓曲線加密就要面對離散對數難題,目前為止還沒有找到在多項式時間內解決的辦法,在演算法所用的空間足夠大的情況下,被認為是安全的。本文不涉及高深的數學理論,希望高中生都能看懂。
密碼學具有久遠的歷史,幾乎人人都可以構造出加解密的方法,比如說簡單地循環移位。古老或簡單的方法需要保密加密演算法和秘鑰。但是從歷史上長期的攻防斗爭來看,基於加密方式的保密並不可靠,同時,長期以來,秘鑰的傳遞也是一個很大的問題,往往面臨秘鑰泄漏或遭遇中間人攻擊的風險。
上世紀70年代,密碼學迎來了突破。Ralph C. Merkle在1974年首先提出非對稱加密的思想,兩年以後,Whitfield Diffie和Whitfield Diffie兩位學者以單向函數和單向暗門函數為基礎提出了具體的思路。隨後,大量的研究和演算法涌現,其中最為著名的就是RSA演算法和一系列的橢圓曲線演算法。
無論哪一種演算法,都是站在前人的肩膀之上,主要以素數為研究對象的數論的發展,群論和有限域理論為基礎。內容加密的秘鑰不再需要傳遞,而是通過運算產生,這樣,即使在不安全的網路中進行通信也是安全的。密文的破解依賴於秘鑰的破解,但秘鑰的破解面臨難題,對於RSA演算法,這個難題是大數因式分解,對於橢圓曲線演算法,這個難題是類離散對數求解。兩者在目前都沒有多項式時間內的解決辦法,也就是說,當位數增多時,難度差不多時指數級上升的。
那麼加解密如何在公私鑰體系中進行的呢?一句話,通過在一個有限域內的運算進行,這是因為加解密都必須是精確的。一個有限域就是一個具有有限個元素的集合。加密就是在把其中一個元素映射到另一個元素,而解密就是再做一次映射。而有限域的構成與素數的性質有關。
前段時間,黎曼猜想(與素數定理關系密切)被熱炒的時候,有一位區塊鏈項目的技術總監說橢圓曲線演算法與素數無關,不受黎曼猜想證明的影響,就完全是瞎說了。可見區塊鏈項目內魚龍混雜,確實需要好好洗洗。
比特幣及多數區塊鏈項目採用的公鑰體系都是橢圓曲線演算法,而非RSA。而介紹橢圓曲線演算法之前,了解一下離散對數問題對其安全性的理解很有幫助。
先來看一下 費馬小定理 :
原根 定義:
設(a, p)=1 (a與p互素),滿足
的最下正整數 l,叫作a模p的階,模p階為(最大值)p-1的整數a叫作模p的原根。
兩個定理:
基於此,我們可以看到,{1, 2, 3, … p-1} 就是一個有限域,而且定義運算 gi (mod p), 落在這個有限域內,同時,當i取0~p-2的不同數時,運算結果不同。這和我們在高中學到的求冪基本上是一樣的,只不過加了一層求模運算而已。
另一點需要說明的是,g的指數可以不限於0~p-2, 其實可以是所有自然數,但是由於
所以,所有的函數值都是在有限域內,而且是連續循環的。
離散對數定義:
設g為模p的原根,(a,p) = 1,
我們稱 i 為a(對於模p的原根g)的指數,表示成:
這里ind 就是 index的前3個字母。
這個定義是不是和log的定義很像?其實這也就是我們高中學到的對數定義的擴展,只不過現在應用到一個有限域上。
但是,這與實數域上的對數計算不同,實數域是一個連續空間,其上的對數計算有公式和規律可循,但往往很難做到精確。我們的加密體系裡需要精確,但是在一個有限域上的運算極為困難,當你知道冪值a和對數底g,求其離散對數值i非常困難。
當選擇的素數P足夠大時,求i在時間上和運算量上變得不可能。因此我們可以說i是不能被計算出來的,也就是說是安全的,不能被破解的。
比特幣的橢圓曲線演算法具體而言採用的是 secp256k1演算法。網上關於橢圓曲線演算法的介紹很多,這里不做詳細闡述,大家只要知道其實它是一個三次曲線(不是一個橢圓函數),定義如下:
那麼這里有參數a, b;取值不同,橢圓曲線也就不同,當然x, y 這里定義在實數域上,在密碼體系裡是行不通的,真正採用的時候,x, y要定義在一個有限域上,都是自然數,而且小於一個素數P。那麼當這個橢圓曲線定義好後,它反應在坐標系中就是一些離散的點,一點也不像曲線。但是,在設定的有限域上,其各種運算是完備的。也就是說,能夠通過加密運算找到對應的點,通過解密運算得到加密前的點。
同時,與前面講到的離散對數問題一樣,我們希望在這個橢圓曲線的離散點陣中找到一個有限的子群,其具有我們前面提到的遍歷和循環性質。而我們的所有計算將使用這個子群。這樣就建立好了我們需要的一個有限域。那麼這里就需要子群的階(一個素數n)和在子群中的基點G(一個坐標,它通過加法運算可以遍歷n階子群)。
根據上面的描述,我們知道橢圓曲線的定義包含一個五元祖(P, a, b, G, n, h);具體的定義和概念如下:
P: 一個大素數,用來定義橢圓曲線的有限域(群)
a, b: 橢圓曲線的參數,定義橢圓曲線函數
G: 循環子群中的基點,運算的基礎
n: 循環子群的階(另一個大素數,< P )
h:子群的相關因子,也即群的階除以子群的階的整數部分。
好了,是時候來看一下比特幣的橢圓曲線演算法是一個怎樣的橢圓曲線了。簡單地說,就是上述參數取以下值的橢圓曲線:
橢圓曲線定義了加法,其定義是兩個點相連,交與圖像的第三點的關於x軸的對稱點為兩個點的和。網上這部分內容已經有很多,這里不就其細節進行闡述。
但細心的同學可能有個疑問,離散對數問題的難題表現在求冪容易,但求其指數非常難,然而,橢圓曲線演算法中,沒有求冪,只有求乘積。這怎麼體現的是離散對數問題呢?
其實,這是一個定義問題,最初橢圓曲線演算法定義的時候把這種運算定義為求和,但是,你只要把這種運算定義為求積,整個體系也是沒有問題的。而且如果定義為求積,你會發現所有的操作形式上和離散對數問題一致,在有限域的選擇的原則上也是一致的。所以,本質上這還是一個離散對數問題。但又不完全是簡單的離散對數問題,實際上比一般的離散對數問題要難,因為這里不是簡單地求數的離散對數,而是在一個自定義的計算上求類似於離散對數的值。這也是為什麼橢圓曲線演算法採用比RSA所需要的(一般2048位)少得多的私鑰位數(256位)就非常安全了。
⑥ 理論分析和舉例說明RSA的加密和解密是互逆的
由於沒有辦法打出fai這個希臘字母 n的歐拉函數我用@(n)來表示
^ 代表冪的意思
e*d=1(mod @(n))
m為明文 c為密文
加密:c=m^e(mod n)
解密:m=c^d(mod n)
證明加密解密互逆也就是證明:
m=(m^e)^d(mod n) //把加密式子過程的c 帶到解密過程那個式子中
也就是證明 m=m^(e*d) (mod n)
因為 e*d=1(mod @(n)) 可以推導出 e*d=k*@(n)+1
所以m=m*(k*@(n)+1) (mod n)
也就可以寫出m=m*m^(k*@(n)) (mod n)
因為根據費馬定理 m^(@(n))=1 (mod n)
所以m^(k*@(n)) =1^k(mod n)=1(mod n)
m*m^(k*@(n)) (mod n)=m*1 (mod n)=m(mod n)證明就ok了
主要把握2點: 費馬定理
公私鑰關於@(n)互逆 就鬆鬆搞定
⑦ 零知識證明
https://arxiv.org/abs/1906.07221
零知識簡潔的非交互知識論證(zk SNARK)是一種真正巧妙的方法,可以在不透露任何其他信息的情況下證明某件事是真的,然而,為什麼它首先是有用的呢?
零知識證明在無數應用中是有利的,包括:
關於私人數據的證明聲明:
匿名授權:
匿名付款:
外包計算:
盡管表面上聽起來很棒,但底層方法是數學和密碼學的「奇跡」,自 1985 年在主要著作「互動式證明系統的知識復雜性中引入以來,已經進行了第四個十年的研究 隨後引入了非互動式證明,這在區塊鏈的背景下尤為重要。
在任何零知識證明系統中,都有一個驗證人想要說服驗證人某些陳述是真實的,而不披露任何其他信息,例如,驗證人了解到驗證人的銀行賬戶中有X多個,但沒有其他信息(即,未披露實際金額)。協議應滿足三個屬性:
讓我們從簡單開始,並嘗試證明某些東西,而不必擔心零知識,非交互性,其形式和適用性。
想像一下,我們有一個長度為 10 數組,我們想向驗證者(例如程序)證明所有這些位都設置為 1,即我們知道一個數組,使得每個元素都等於 1。
驗證者一次只能檢查 (即讀取) 一個元素。為了驗證語句,可以通過以某種任意順序讀取元素,並檢查它是否真正等於1,如果是,則在第一次檢查後該語句的置信度為10%,或者如果該位不等於1,則語句完全無效。驗證者必須進入下一輪,直到他獲得足夠的信心。在一些情況下,可以信任證明者並且只需要50% 置信度,在需要95% 置信度的其他情況下,必須檢查所有單元。很明顯,這種證明協議的缺點是,必須進行與元素數量成比例的檢查數量,如果我們考慮數百萬個元素的數組,這是不切實際的。
讓我們考慮多項式,有一個曲線對應於多項式: 。多項式有一個有利的性質,即如果我們有兩個不相等的次數最多為 d 的多項式,它們相交的點不超過 d。 例如,讓我們稍微修改原始多項式 。如果我們想找到兩個多項式的交點,我們需要將它們等同起來。例如,要找到多項式與x軸相交的位置 (即 ),我們將 等同,並且此類方程的解將是那些共享點: , 和 。
同樣,我們可以將多項式的原始版本和修改版本等同起來,以找到它們的交點。所得的多項式為1,且有明顯的解 。因此只有一個交點。
對於任意次數為 d 的多項式,任何此類方程的結果始終是另一個次數最多為 d 的多項式,因為沒有乘法可以產生更高的次數。 示例: ,簡化為 。代數基本定理告訴我們,d 次多項式最多可以有 d 個解。因此,我們可以得出結論,任意點處的任何多項式的求值類似於其唯一身份的表示。讓我們在x = 10處評估我們的示例多項式。
事實上,在所有要計算的x選項中,最多隻有3個選項在這些多項式中具有相同的計算,而所有其他選項都會不同。這就是為什麼如果證明者聲稱知道一些多項式 (無論其次數有多大),他們可以遵循一個簡單的協議來驗證語句:
例如,如果我們考慮 x 從 1 到 的整數范圍,則評估不同的點數為 。 此後,x 意外「擊中」任何 個共享點的概率等於 ,這被認為可以忽略不計。
注意:與無效位檢查協議相比,新協議只需要一輪,並且在聲明中給出了壓倒性的信心(假設 d 充分小於范圍的上限,幾乎 100%)。
這就是為什麼多項式是zk-SNARK的核心,盡管也可能存在其他證明介質。
我們從證明多項式知識的問題開始,然後採用通用方法。 在此過程中,我們將發現多項式的許多其他性質。 到目前為止的討論集中,關注一個弱的證明概念上,即各方必須相互信任,因為還沒有措施來執行協議的規則。 例如,證明者不需要知道多項式,他可以使用任何其他可用的方法來得出正確的結果。 此外,如果驗證者的多項式評估的幅度不大,比如說 10,驗證者可以猜測一個數字,並且它被接受的概率是不可忽略的。 我們必須解決協議的這種弱點,但首先知道多項式意味著什麼? 多項式可以表示為以下形式(其中 n 是多項式的次數):
如果有人說他知道一個 1 次多項式(即 ),那意味著他真正知道的是系數 。 此外,系數可以有任何值,包括 0。讓我們說,證明者聲稱知道3次多項式,使得x = 1和x = 2是所有可能解中的兩個。這樣的有效多項式之一是 。
代數的基本定理指出,只要多項式是可解的,任何多項式都可以分解為線性多項式 (即代表直線的1次多項式)。因此,我們可以將任何有效多項式表示為其因子的乘積:
同樣,如果這些因子中的任何一個為零,則整個方程為零,因此,所有 都是唯一的解。我們的示例可以分解為以下多項式:
x的值是:0,1,2,你可以很容易地在多項式的任一形式上檢查這一點。
回到證明者聲稱他知道根為 1 和 2 的 3 次多項式,這意味著他的多項式具有以下形式:
換句話說,(x − 1) 和 (x − 2) 是所討論的多項式的余因子。因此,如果證明者想要證明他的多項式確實具有這些根而不公開多項式本身,則他需要證明他的多項式p(x) 是那些協因子 的乘法,稱為目標多項式,和一些任意多項式h(x) ,即:
換句話說,p(x) 具有t(x) 的所有根。找到h(x) 的自然方法是通過除法 。如果證明者找不到這樣的h(x),這意味著p(x) 沒有必要的協因子t(x),在這種情況下,多項式除法將具有餘數。在我們的示例中,如果我們將 除以 。我們得到了無余數的結果 。
使用我們的多項式身份檢查協議,我們可以比較多項式 和 :
為了將其付諸實踐,讓我們在示例中執行此協議:
相反,如果證明者使用不同的 ,它沒有正確的輔因子,例如 ,那麼:
我們將得到 ,余數為 ,即: 。這意味著證明者必須將余數除以 才能評估 。因此,由於驗證者對x的隨機選擇,因此對於余數 被t(x) 整除的概率很低,因此,如果驗證者將檢查p和h補是整數,這樣的證明將被拒絕。但是,該檢查要求多項式系數也必須是整數。
現在,我們可以在不學習多項式本身的情況下檢查多項式的特定屬性,因此這已經為我們提供了某種形式的零知識和簡潔。盡管如此,此構造仍存在多個問題:
我們將在以下部分解決所有問題。
在上文中,如果將 和 不是明文給出,而是作為黑匣子給出,那將是理想的選擇,因此人們無法篡改協議,但仍然能夠計算對這些模糊值。類似於哈希函數,因此在計算時很難返回到原始輸入。
這正是同態加密的目的。也就是說,它允許對一個值進行加密,並能夠對這種加密應用算術運算。有多種方法可以實現加密的同態特性,我們將簡要介紹一種簡單的方法。
一般的想法是,我們選擇一個基數的自然數g(比如5),然後對一個值進行加密,我們將g乘以該值的冪。例如,如果我們想要加密數字3:
其中125是3的加密。如果要將這個加密的數字乘以2,則將其提高為2的指數:
我們能夠將未知值乘以2,並對其進行加密。我們還可以通過乘法添加兩個加密值,例如3+2:
同樣,我們可以通過除法減去加密的數字,例如5 − 3:
但是,由於基數5是公共的,因此很容易回到秘密數字,將加密的數字除以5,直到結果為1。除法的次數即為明文。
這就是模演算法發揮作用的地方。模運算的思想如下:我們聲明只選擇前n個自然數,即0,1,…,n-1而不是擁有一個無限的數字集。如果任何給定的整數不在這個范圍內,我們將其「環繞」。例如,讓我們先選擇六個數字。為了說明這一點,請考慮一個具有六個相等單位刻度的圓;這是我們的射程。
現在讓我們看看數字8將落在哪裡。 打個比方,我們可以把它想像成一根繩子,它的長度是八個單位。如果我們把繩子連接到圓圈的開頭並開始將繩子纏繞在它周圍,旋轉一圈後,我們還剩下一部分繩子.因此,如果我們繼續這個過程,繩子將在2處結束。
它是模運算的結果。 不管繩子有多長,它總是會停在圓圈的刻度之一處。 因此,模運算將使其保持在一定范圍內。 15 個單位的繩索將在 3 處停止,即 6 + 6 + 3(兩個完整的圓圈,剩餘 3 個單位)。 負數的工作方式相同,唯一的區別是我們將其包裝在相反的方向,對於 -8,結果將是 4。
而且,我們可以進行算術運算,結果總是在n個數的范圍內。 我們現在將使用符號「mod 」來表示數字的范圍。 例如:3 × 5 = 3 (mod 6); 5 + 2 = 1 (mod 6).
此外,最重要的特性是運算順序無關緊要,例如,我們可以先執行所有運算,然後在每次運算後應用模或應用模。例如: 相當於:2 × 4 = 2 (mod 6); 2 − 1 = 1 (mod 6); 1 × 3 = 3 (mod 6).
那到底為什麼有幫助呢?事實證明,如果我們使用模算術,則具有運算結果,回到原始數字是不平凡的,因為許多不同的組合將具有相同的結果: 5 × 4 = 2 (mod 6); 4 × 2 = 2 (mod 6); 2 × 1 = 2 (mod 6).
如果沒有模算術,結果的大小為它的解決方案提供了線索。 否則,這條信息會被隱藏,而常見的算術屬性會被保留。
如果我們回到同態加密並使用模運算,例如模 7,我們將得到:
和不同的指數會有相同的結果:
這是很難找到指數的地方。 事實上,如果模數足夠大,這樣做就變得不可行,而現代密碼學的很大一部分是基於這個問題的「難度」。該方案的所有同態屬性都保留在模領域中:
encryption:
multiplication:
addition:
讓我們明確說明加密函數: ,其中 v 是我們要加密的值。
這種同態加密方案存在局限性,盡管我們可以將加密值乘以未加密值,但我們不能將兩個加密值乘以 (和除以),也不能對加密值求冪。雖然從第一印象來看是不幸的,但這些屬性將成為zk-SNARK的基石。
有了這樣的工具,我們現在可以評估一個加密隨機值為x的多項式,並相應地修改零知識協議。
讓我們看看如何評估多項式 。正如我們以前建立的那樣,多項式就是知道它的系數,在這種情況下,它們是: 1,-3,2。因為同態加密不允許對加密值求冪,所以我們必須得到從1到3的x冪的加密值: , , ,這樣我們可以對加密多項式求值如下:
作為這些操作的結果,我們在我們未知的某個 x 處對我們的多項式進行了加密。 這是一個非常強大的機制,並且由於同態特性,相同多項式的加密計算在加密空間中總是相同的。我們現在可以更新協議的先前版本,對於d次多項式:
Verifier:
Prover:
Verifier:
由於證明者對s一無所知,因此很難提出不合法但仍匹配的評估。
雖然在這樣的協議中,證明者的敏捷性是有限的,但他仍然可以使用任何其他方法來偽造證明,而無需實際使用所提供的 s 冪的加密,例如,如果證明者聲稱僅使用 2 次冪 和 有一個令人滿意的多項式 ,這在當前協議中無法驗證。
多項式的知識是其系數 。 我們在協議中「分配」這些系數的方式是通過對秘密值 s 的相應加密冪求冪(即 )。 我們已經在選擇 s 的加密冪時限制了證明者,但這種限制並未強制執行,例如,可以使用任何可能的方法來找到滿足方程 的任意值 和 並將它們提供給驗證者而不是 和 。 例如,對於一些隨機 , 和 ,其中 可以從提供的 s 的加密冪計算。 這就是為什麼驗證者需要證明僅使用 s 的冪的加密來計算 和 而沒有別的。
讓我們考慮一個1次多項式的基本例子,該多項式具有一個變數和一個系數 ,相應地,s的加密 。我們正在尋找的是確保只有s的加密,即 ,被一些任意系數c同態「乘以」,而不是其他任何東西。所以對於任意的c,結果必須是 形式。
一種方法是要求對另一個移位的加密值與原始值一起執行相同的操作,充當「校驗和」的算術模擬,確保結果是原始值的取冪。這是通過引入的指數知識假設Knowledge-of-Exponent Assumption (或KEA) 來實現的,更確切地說:
Alice有一個值a,她希望Bob指數到任何冪,唯一的要求是只有這個a可以指數,沒有別的,以確保她:
因為 Bob 無法從元組 中提取 ,因此推測 Bob 可以產生有效響應的唯一方法是通過以下過程:
最終,這樣的協議向Alice提供了一個證據,證明Bob確實將a乘以他已知的某個值,並且他不能進行任何其他操作,例如乘法、加法,因為這將消除 移位關系。
在同態加密上下文中,冪運算是加密值的乘法。我們可以在簡單的單系數多項式 的情況下應用相同的構造:
這種結構限制證明者僅使用提供的加密 s,因此證明者可以僅將系數 c 分配給驗證者提供的多項式。 我們現在可以將這種單項多項式方法縮放為多項多項式,因為每個項的系數分配是單獨計算的,然後同態地「相加」在一起。 因此,如果向證明者提供 s 的加密冪以及它們的移位值,他可以評估原始多項式和移位多項式,其中必須進行相同的檢查。 特別是對於 d 次多項式:
對於我們之前的示例多項式 ,這將是:
現在我們可以確定,驗證程序除了使用驗證程序提供的多項式外,沒有使用任何其他方法,因為沒有其他方法來保持 移位。此外,如果驗證者希望確保在驗證者的多項式中排除一些s的冪,例如j,他將不提供加密 及其移位 。
與我們一開始的相比,我們現在有了一個健壯的協議。 然而,無論加密如何,零知識屬性仍然存在一個明顯的缺點:雖然理論上多項式系數 可以有很大范圍的值,但實際上它可能非常有限(上例中為 6),這意味著 驗證者可以暴力破解有限范圍的系數組合,直到結果等於證明者的答案。 例如,如果我們考慮每個系數的 100 個值的范圍,則 2 次多項式將總共有 100 萬個不同的組合,考慮到蠻力將需要不到 100 萬次迭代。 此外,即使在只有一個系數且其值為 1 的情況下,安全協議也應該是安全的。
因為驗證器只能從驗證器發送的數據中提取關於未知多項式p(x)的知識,所以讓我們考慮那些提供的值(證明): 。他們參與以下檢查:
gp=gh(多項式p(x)有t(x)的根)
(gp)α=gp′t(s)(使用正確形式的多項式)
問題是我們如何改變證據,使支票仍然有效,但無法提取任何知識?從上一節可以得出一個答案:我們可以用一些隨機數δ(δ)來「移位」這些值,例如(gp)δ。現在,為了提取知識,首先需要找到被認為不可行的δ。此外,這種隨機化在統計學上與隨機性是無法區分的。
為了保持關系,讓我們檢查驗證者的檢查。證明者的值之一位於方程式的每一側。因此,如果我們用相同的 δ 「移動」 它們中的每一個,方程必須保持平衡。
具體地,證明者對隨機 δ 進行采樣,並用g α p(s) δ gh(s) δ 對其證明值求冪,並提供給驗證者進行驗證:
(gp)δ = gh δ t(s) (gp)δ α = gp′ δ
合並後,我們可以觀察到支票仍然有效:
注意: 零知識是多麼容易被編織到建築中,這通常被稱為 「免費」 零知識。
到目前為止,我們有一個互動式零知識方案。為什麼會這樣?由於該證明僅對原始驗證者有效,其他任何人(其他驗證者)都不能信任同一證明,因為:
因此,為了證明語句(在這種情況下是多項式的知識),需要與每個驗證者進行單獨的交互。
雖然互動式證明系統有其使用案例,例如,當證明人只想說服一個專用的驗證人(稱為指定驗證人),這樣證明就不能再用於向其他人證明同一陳述時,當一個人需要同時(例如,在區塊鏈等分布式系統中)或永久地說服多方時,這是非常有效的。驗證方需要始終保持在線,並對每個驗證方執行相同的計算。
因此,我們需要的秘密參數是可重用的,公開的,可信的和不可濫用的。
讓我們首先考慮在秘密 (t(s),α) 產生後如何保護它們。我們可以像驗證者在發送給證明者之前對s的指數進行加密一樣對它們進行加密。然而,我們使用的同態加密不支持兩個加密值的乘法,這對於驗證檢查以使t(s) 和h以及p和 α 的加密相乘都是必需的。這就是密碼配對的地方。
密碼配對(雙線性映射)是一種數學構造,用函數 , 給定來自一組數字的兩個加密輸入(例如, ,允許將它們確定地映射到不同數字輸出集中的乘法表示,即, 。
由於源和輸出編號集合不同,因此配對的結果不能用作另一個配對操作的輸入。我們可以將輸出集 (也稱為 「目標集」) 視為來自 「不同的宇宙」。因此,我們不能將結果乘以另一個加密值,並通過名稱本身建議我們一次只能乘以兩個加密值。在某種意義上,它類似於一個散列函數,它將所有可能的輸入值映射到一組可能的輸出值中的一個元素,並且它不是平凡可逆的。
注意: 乍一看,這種限制只能阻礙依賴的功能,具有諷刺意味的是,在zk-SNARK情況下,它是該方案的安全性所擁有的最重要的屬性。
配對函數 的一個基本(技術上不正確)的數學類比是說明有一種方法可以「交換」每個輸入的基數和指數,這樣基數 在轉換過程中會被修改成指數,例如 。 然後將兩個「交換的」輸入相乘,使得原始 a 和 b 值在相同的指數下相乘,例如:
因此,由於在「交換」期間使用結果 在另一個配對(例如, )中改變了鹼基,因此不會產生所需的加密乘法 。配對的核心屬性可以用等式表示:
e(ga, gb) = e(gb, ga) = e(gab, g1) = e(g1, gab) = e(g1, ga)b= e(g1, g1) ab= . . .
從技術上講,配對的結果是目標集不同生成器g下原始值的加密產物,即 。因此,它具有同態加密的特性,例如,我們可以將多對的加密產物添加到一起:
注意:加密配對利用橢圓曲線來實現這些屬性,因此從現在起,符號 將表示曲線上的生成器點,該點將被添加到自身 次,而不是我們在前面部分中使用的乘法群生成器。
有了加密配對,我們現在可以設置安全的公共和可重用參數。讓我們假設我們信任一個誠實的一方來生成秘密 s 和 α。一旦 α 和具有相應 α 位移的 s 的所有必要冪被加密(gα, gsi , gαsi for i in 0, 1, ..., d),必須刪除原始值。
這些參數通常被稱為公共參考字元串common reference string或CRS。CRS生成後,任何prover和verifier都可以使用它來執行非互動式零知識證明協議。雖然不重要,但CRS的優化版本將包括對目標多項式target polynomial 的加密評估。
此外,CRS分為兩組(對於 中的 ):
由於能夠乘以加密值,verifier可以在協議的最後一步檢查多項式,讓verification key verifier進程從證明者那裡接收到加密多項式評估 gp、gh、gp':
雖然可信設置是有效的,但它並不有效,因為 CRS 的多個用戶將不得不相信一個刪除的 和 ,因為目前沒有辦法證明這一點。 因此,有必要最小化或消除這種信任。 否則,不誠實的一方將能夠在不被發現的情況下製作假證據。
實現這一點的一種方法是由多方使用前面部分中介紹的數學工具生成復合 CRS,這樣這些方都不知道秘密。這是一種方法,讓我們考慮三個參與者 Alice、Bob 和 Carol,對應的索引為 A、B 和 C,對於 i 在 1、2、...中。 . . , d:
作為這種協議的結果,我們有復合 和 並且沒有參與者知道其他參與者的秘密參數,除非他們串通。事實上,為了學習 和 ,必須與其他所有參與者串通一氣。因此,即使一個人是誠實的,也無法提供假證明。
注意:此過程可以根據需要對盡可能多的參與者重復。
可能存在的問題是如何驗證參與者是否與 CRS 的每個值一致,因為對手可以采樣多個不同的 s1、s2、...。 . . 和α1, α2, . . .,並將它們隨機用於 s 的不同冪(或提供隨機數作為增強的公共參考字元串),從而使 CRS 無效且不可用。
幸運的是,因為我們可以使用配對來乘以加密值,所以我們能夠執行一致性檢查,從第一個參數開始,並確保每個下一個參數都是從它派生的。參與者發布的每個 CRS 都可以檢查如下:
請注意,雖然我們驗證每個參與者都與他們的秘密參數一致,但使用先前發布的 CRS 的要求並未對每個下一個參與者強制執行(在我們的示例中為 Bob 和 Carol)。因此,如果對手是鏈中的最後一個,他可以忽略先前的 CRS 並從頭開始構造有效參數,就好像他是鏈中的第一個,因此是唯一知道秘密 s 和 α 的人。
我們可以通過額外要求除第一個參與者之外的每個參與者加密和發布他的秘密參數來解決這個問題,例如,Bob 還發布:
這允許驗證 Bob 的 CRS 是 Alice 參數的適當倍數,因為 i in 1, 2, . . . , d:
同樣,Carol必須證明她的CRS是Alice-Bob的CRS的適當倍數。
這是一個強大的CRS設置方案,不完全依賴任何一方。實際上,即使只有一方是誠實的,並且刪除並且從不共享其秘密參數,即使所有其他各方都合謀,它也是非常明智的。因此,CRS 設置中不相關的參與者越多,偽造證據的可能性就越小,如果競爭方參與,其可能性就可以忽略不計。該方案允許涉及對設置的易讀性有疑問的其他不受信任的各方,因為驗證步驟確保他們不會破壞最終的公共參考字元串 (也包括使用弱 α 和s)。
我們現在准備鞏固進化的zk-SNARKOP協議。形式上,為簡潔起見,我們將使用大括弧來表示由其旁邊的下標填充的一組元素,例如si i ∈[d] 表示集合s1,s2,...,sd。
已商定目標多項式t(x)和校準儀多項式的d次:
Setup:
⑧ RSA加密解密問題,我現在有公鑰和冪,怎麼使用來給數據加密,最好有C/C++代碼,謝謝
rsa演算法利用的是大素數分解的困難性來保證安全的
加密:明文的公鑰次冪,在模n(應該就是你說的冪了)
解密:密文的密匙次冪,在模n,即可得到明文
⑨ 加密技術06-加密總結
對稱密碼是一種用相同的密鑰進行加密和解密的技術,用於確保消息的機密性。在對稱密碼的演算法方面,目前主要使用的是 AES。盡管對稱密碼能夠確保消息的機密性,但需要解決將解密密鑰配送給接受者的密鑰配送問題。
主要演算法
DES
數據加密標准(英語:Data Encryption Standard,縮寫為 DES)是一種對稱密鑰加密塊密碼演算法,1976年被美國聯邦政府的國家標准局確定為聯邦資料處理標准(FIPS),隨後在國際上廣泛流傳開來。它基於使用56位密鑰的對稱演算法。
DES現在已經不是一種安全的加密方法,主要因為它使用的56位密鑰過短。
原理請參考: 加密技術01-對稱加密-DES原理
3DES
三重數據加密演算法(英語:Triple Data Encryption Algorithm,縮寫為TDEA,Triple DEA),或稱3DES(Triple DES),是一種對稱密鑰加密塊密碼,相當於是對每個數據塊應用三次DES演算法。由於計算機運算能力的增強,原版DES由於密鑰長度過低容易被暴力破解;3DES即是設計用來提供一種相對簡單的方法,即通過增加DES的密鑰長度來避免類似的攻擊,而不是設計一種全新的塊密碼演算法。
注意:有3個獨立密鑰的3DES的密鑰安全性為168位,但由於中途相遇攻擊(知道明文和密文),它的有效安全性僅為112位。
3DES使用「密鑰包」,其包含3個DES密鑰,K1,K2和K3,均為56位(除去奇偶校驗位)。
密文 = E k3 (D k2 (E k1 (明文)))
而解密則為其反過程:
明文 = D k3 (E k2 (D k1 (密文)))
AES
AES 全稱 Advanced Encryption Standard(高級加密標准)。它的出現主要是為了取代 DES 加密演算法的,因為 DES 演算法的密鑰長度是 56 位,因此演算法的理論安全強度是 56 位。於是 1997 年 1 月 2 號,美國國家標准技術研究所宣布希望徵集高級加密標准,用以取代 DES。AES 也得到了全世界很多密碼工作者的響應,先後有很多人提交了自己設計的演算法。最終有5個候選演算法進入最後一輪:Rijndael,Serpent,Twofish,RC6 和 MARS。最終經過安全性分析、軟硬體性能評估等嚴格的步驟,Rijndael 演算法獲勝。
AES 密碼與分組密碼 Rijndael 基本上完全一致,Rijndael 分組大小和密鑰大小都可以為 128 位、192 位和 256 位。然而 AES 只要求分組大小為 128 位,因此只有分組長度為 128 位的 Rijndael 才稱為 AES 演算法。
本文 AES 默認是分組長度為 128 位的 Rijndael 演算法
原理請參考: 加密技術02-對稱加密-AES原理
演算法對比
公鑰密碼是一種用不同的密鑰進行加密和解密的技術,和對稱密碼一樣用於確保消息的機密性。使用最廣泛的一種公鑰密碼演算法是 RAS。和對稱密碼相比,公鑰密碼的速度非常慢,因此一般都會和對稱密碼一起組成混合密碼系統來使用。公鑰密碼能夠解決對稱密碼中的密鑰交換問題,但存在通過中間人攻擊被偽裝的風險,因此需要對帶有數字簽名的公鑰進行認證。
公鑰密碼學的概念是為了解決對稱密碼學中最困難的兩個問題而提出
應用場景
幾個誤解
主要演算法
Diffie–Hellman 密鑰交換
迪菲-赫爾曼密鑰交換(英語:Diffie–Hellman key exchange,縮寫為D-H) 是一種安全協議。它可以讓雙方在完全沒有對方任何預先信息的條件下通過不安全信道創建起一個密鑰。這個密鑰可以在後續的通訊中作為對稱密鑰來加密通訊內容。公鑰交換的概念最早由瑞夫·墨克(Ralph C. Merkle)提出,而這個密鑰交換方法,由惠特菲爾德·迪菲(Bailey Whitfield Diffie)和馬丁·赫爾曼(Martin Edward Hellman)在1976年發表,也是在公開文獻中發布的第一個非對稱方案。
Diffie–Hellman 演算法的有效性是建立在計算離散對數很困難的基礎上。簡單地說,我們可如下定義離散對數。首先定義素數 p 的本原跟。素數 p 的本原根是一個整數,且其冪可以產生 1 到 p-1 之間所有整數,也就是說若 a 是素數 p 的本原根,則
a mod p, a 2 mod p,..., a p-1 mod p 各不相同,它是整數 1 到 p-1 的一個置換。
對任意整數 b 和素數 p 的本原跟 a,我們可以找到唯一的指數 i 使得
b ≡ a i (mod p) 其中 0 <= i <= p-1
其中 a, b, p 這些是公開的,i 是私有的,破解難度就是計算 i 的難度。
Elgamal
1985年,T.Elgamal 提出了一種基於離散對數的公開密鑰體制,一種與 Diffie-Hellman 密鑰分配體制密切相關。Elgamal 密碼體系應用於一些技術標准中,如數字簽名標准(DSS) 和 S/MIME 電子郵件標准。
基本原理就是利用 Diffie–Hellman 進行密鑰交換,假設交換的密鑰為 K,然後用 K 對要發送的消息 M,進行加密處理。
所以 Elgamal 的安全系數取決於 Diffie–Hellman 密鑰交換。
另外 Elgamal 加密後消息發送的長度會增加一倍。
RSA
MIT 的羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)在 1977 年提出並於 1978 年首次發表的演算法。RSA 是最早滿足要求的公鑰演算法之一,自誕生日起就成為被廣泛接受且被實現的通用的公鑰加密方法。
RSA 演算法的有效性主要依據是大數因式分解是很困難的。
原理請參考: 加密技術03-非對稱加密-RSA原理
ECC
大多數使用公鑰密碼學進行加密和數字簽名的產品和標准都使用 RSA 演算法。我們知道,為了保證 RSA 使用的安全性,最近這些年來密鑰的位數一直在增加,這對使用 RSA 的應用是很重的負擔,對進行大量安全交易的電子商務更是如此。近來,出現的一種具有強大競爭力的橢圓曲線密碼學(ECC)對 RSA 提出了挑戰。在標准化過程中,如關於公鑰密碼學的 IEEE P1363 標准中,人們也已考慮了 ECC。
與 RSA 相比,ECC 的主要誘人之處在於,它可以使用比 RSA 短得多的密鑰得到相同安全性,因此可以減少處理負荷。
ECC 比 RSA 或 Diffie-Hellman 原理復雜很多,本文就不多闡述了。
演算法對比
公鑰密碼體制的應用
密碼分析所需計算量( NIST SP-800-57 )
註:L=公鑰的大小,N=私鑰的大小
散列函數是一種將長消息轉換為短散列值的技術,用於確保消息的完整性。在散列演算法方面,SHA-1 曾被廣泛使用,但由於人們已經發現了一些針對該演算法理論上可行的攻擊方式,因此該演算法不應再被用於新的用途。今後我們應該主要使用的演算法包括目前已經在廣泛使用的 SHA-2,以及具有全新結構的 SHA-3 演算法。散列函數可以單獨使用,也可以作為消息認證、數字簽名以及偽隨機數生成器等技術的組成元素來使用。
主要應用
主要演算法
MD5
MD5消息摘要演算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼散列函數,可以產生出一個 128 位( 16 位元組,被表示為 32 位十六進制數字)的散列值(hash value),用於確保信息傳輸完整一致。MD5 由美國密碼學家羅納德·李維斯特(Ronald Linn Rivest)設計,於 1992 年公開,用以取代 MD4 演算法。這套演算法的程序在 RFC 1321 中被加以規范。
2009年,中國科學院的謝濤和馮登國僅用了 2 20.96 的碰撞演算法復雜度,破解了MD5的碰撞抵抗,該攻擊在普通計算機上運行只需要數秒鍾。2011年,RFC 6151 禁止MD5用作密鑰散列消息認證碼。
原理請參考: 加密技術04-哈希演算法-MD5原理
SHA-1
SHA-1(英語:Secure Hash Algorithm 1,中文名:安全散列演算法1)是一種密碼散列函數,美國國家安全局設計,並由美國國家標准技術研究所(NIST)發布為聯邦資料處理標准(FIPS)。SHA-1可以生成一個被稱為消息摘要的160位(20位元組)散列值,散列值通常的呈現形式為40個十六進制數。
2005年,密碼分析人員發現了對SHA-1的有效攻擊方法,這表明該演算法可能不夠安全,不能繼續使用,自2010年以來,許多組織建議用SHA-2或SHA-3來替換SHA-1。Microsoft、Google以及Mozilla都宣布,它們旗下的瀏覽器將在2017年停止接受使用SHA-1演算法簽名的SSL證書。
2017年2月23日,CWI Amsterdam與Google宣布了一個成功的SHA-1碰撞攻擊,發布了兩份內容不同但SHA-1散列值相同的PDF文件作為概念證明。
2020年,針對SHA-1的選擇前綴沖突攻擊已經實際可行。建議盡可能用SHA-2或SHA-3取代SHA-1。
原理請參考: 加密技術05-哈希演算法-SHA系列原理
SHA-2
SHA-2,名稱來自於安全散列演算法2(英語:Secure Hash Algorithm 2)的縮寫,一種密碼散列函數演算法標准,由美國國家安全局研發,由美國國家標准與技術研究院(NIST)在2001年發布。屬於SHA演算法之一,是SHA-1的後繼者。其下又可再分為六個不同的演算法標准,包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。
SHA-2 系列的演算法主要思路和 SHA-1 基本一致
原理請參考: 加密技術05-哈希演算法-SHA系列原理
SHA-3
SHA-3 第三代安全散列演算法(Secure Hash Algorithm 3),之前名為 Keccak 演算法。
Keccak 是一個加密散列演算法,由 Guido Bertoni,Joan Daemen,Michaël Peeters,以及 Gilles Van Assche 在 RadioGatún 上設計。
2012年10月2日,Keccak 被選為 NIST 散列函數競賽的勝利者。SHA-2 目前沒有出現明顯的弱點。由於對 MD5、SHA-0 和 SHA-1 出現成功的破解,NIST 感覺需要一個與之前演算法不同的,可替換的加密散列演算法,也就是現在的 SHA-3。
SHA-3 在2015年8月5日由 NIST 通過 FIPS 202 正式發表。
原理請參考: 加密技術05-哈希演算法-SHA系列原理
演算法對比
