當前位置:首頁 » 密碼管理 » 加密值法

加密值法

發布時間: 2024-11-21 03:05:48

A. 哪種加密演算法最安全銀行用的是哪種加密演算法

現在流行的有兩種,一種是加密後不可逆的但是每個值加密後都是唯一的,比如MD5,用在用戶密碼設置。本地在發送密碼前先進行md5加密,然後直接存在用戶伺服器中。下次登錄分別都是在輸入密碼後進行加密再跟伺服器端資料庫中的同樣的加密碼進行匹配。但是現在很多人都在窮舉法一個個的將輸入和輸出進行匹配,現在很多簡單密碼加密後的md5都可以當查字典一樣查到。

還有一種是公鑰和私鑰的加密方法。公鑰和私鑰分別代表兩個值, 數據進行加密依靠這兩個值進行操作,操作完後,私鑰留在本地,公鑰和加密文發給另外一方,另外一方也有私鑰所以可以解密但是中途任何人截獲到了因為沒有私鑰都不能解密。這個一般用在VPN和網銀。 網銀的那個長得像u盤的東西裡面存的就是私鑰和解密程序是不可讀的。不過這個方法一樣有弊端,任何人泄露了其中的東西整個加密系統就會瓦解。

所以沒有絕對安全的加密演算法

B. 如何防止單片機內部代碼被竊取

通常情況下可以採用將單片機上鎖,也就是通過鎖掉晶元防止單片機內部的image被盜。上鎖後的晶元外部的調試介面將不能訪問片內地址。例如飛思卡爾的Kinetis系列微處理器都是可以給晶元加鎖,加鎖的過程是在Flash配置區域寫入加密值。

C. 別再用簡單版MD5加密了,大佬們都這么是使用——>MD5鹽值加密多方法詳解

MD5加密,盡管曾經廣泛應用,但由於其易被破解,現在已經不再被視為安全的加密手段。實際上,MD5的單向加密特性使其容易遭受暴力破解攻擊。因此,現代開發實踐中,大佬們更傾向於使用MD5鹽值加密,以提高安全性。

MD5鹽值加密是一種在原始MD5值中加入隨機鹽值的增強版加密方法,使得即使相同的輸入,經過鹽值處理後的輸出也會不同。它提供了更好的身份驗證和數據保護。Apache的DigestUtils工具可以用來實現MD5鹽值加密,但推薦使用Spring框架提供的BCryptPasswordEncoder,如需自定義鹽值,可以按照其規則操作。

在使用BCryptPasswordEncoder時,雖然加密結果看起來不同,但通過工具提供的校驗方法,我們可以在資料庫中存儲鹽值,確保安全驗證。總的來說,MD5鹽值加密通過引入隨機性,有效提高了數據的安全性,是現代開發者應當優先選擇的加密方式。

如果你對這些內容感興趣,或者覺得有幫助,不妨給予支持,比如點贊或分享。我將持續分享更多知識,期待你的關注!

D. 資料庫里加密的密碼是怎麼實現的

C#中有數據加密的類using System.Security.Cryptography,在這個類中你可以調用它的兩個方法分別是加密方法
public static string Encrypt(string text)
{}
解密方法
public static string Decrypt(string text)
{}
我們一般使用連接資料庫加密的話,都會使用一個配置文件在配置文件中對資料庫鏈接進行讀寫,通過加密方法把鏈接寫到配置文件,然後讀取的時候再使用解密方法。
希望可以幫到你,謝謝!

E. 零知識證明

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:

F. 什麼是ssl

ssl加密的方法
關鍵詞: ssl加密的方法
隨著計算機網路技術的發展,方便快捷的互連網使人們漸漸習慣了從Web頁上收發E-mail、購物和
交易,這時Web頁面上需要傳輸重要或敏感的數據,例如用戶的銀行帳戶、密碼等,所以網路安全
就成為現代計算機網路應用急需解決的問題。

現行網上銀行和電子商務等大型的網上交易系統普遍採用HTTP和SSL相結合的方式。伺服器端採用
支持SSL的Web伺服器,用戶端採用支持SSL的瀏覽器實現安全通信。
SSL是Secure Socket Layer(安全套接層協議)的縮寫,可以在Internet上提供秘密性傳輸。
Netscape公司在推出第一個Web瀏覽器的同時,提出了SSL協議標准,目前已有3.0版本。SSL採用公
開密鑰技術。其目標是保證兩個應用間通信的保密性和可靠性,可在伺服器端和用戶端同時實現支
持。目前,利用公開密鑰技術的SSL協議,已成為Internet上保密通訊的工業標准。本文著重在
SSL協議和SSL程序設計兩方面談談作者對SSL的理解。

SSL協議初步介紹
安全套接層協議能使用戶/伺服器應用之間的通信不被攻擊者竊聽,並且始終對伺服器進行認證,
還可選擇對用戶進行認證。SSL協議要求建立在可靠的傳輸層協議(TCP)之上。SSL協議的優勢在於
它是與應用層協議獨立無關的,高層的應用層協議(例如:HTTP,FTP,TELNET等)能透明地建立於
SSL協議之上。SSL協議在應用層協議通信之前就已經完成加密演算法、通信密鑰的協商及伺服器認證
工作。在此之後應用層協議所傳送的數據都會被加密,從而保證通信的私密性。
通過以上敘述,SSL協議提供的安全信道有以下三個特性:
1.數據的保密性
信息加密就是把明碼的輸入文件用加密演算法轉換成加密的文件以實現數據的保密。加密的過程需要
用到密匙來加密數據然後再解密。沒有了密鑰,就無法解開加密的數據。數據加密之後,只有密匙
要用一個安全的方法傳送。加密過的數據可以公開地傳送。
2.數據的一致性
加密也能保證數據的一致性。例如:消息驗證碼(MAC),能夠校驗用戶提供的加密信息,接收者可
以用MAC來校驗加密數據,保證數據在傳輸過程中沒有被篡改過。
3.安全驗證
加密的另外一個用途是用來作為個人的標識,用戶的密匙可以作為他的安全驗證的標識。
SSL是利用公開密鑰的加密技術(RSA)來作為用戶端與伺服器端在傳送機密資料時的加密通訊協定。
目前,大部分的Web 伺服器及瀏覽器都廣泛支持SSL 技術。當瀏覽器試圖連接一個具有SSL認證加
密的伺服器時,就會喚醒一個SSL會話,瀏覽器檢查認證,必須具備下面三個條件:
1)有一個權威機構發放證書,當然可以創建自我簽訂的證書(x509 結構)。
2)證書不能過期。
3)證書是屬於它所連接的伺服器的。
只有全部具備了這三個條件,瀏覽器才能成功完成認證。通過這三個條件,用戶能確認其瀏覽器連接
到正確的伺服器,而不是連接到一些想盜取用戶密碼等重要信息的虛假的伺服器上。
在當今的電子商務中還有一項被廣泛使用的安全協議是SET協議。SET(Secure Electronic Transaction,
安全電子交易)協議是由VISA和MasterCard兩大信用卡公司於1997年5月聯合推出的規范。SET能在電
子交易環節上提供更大的信任度、更完整的交易信息、更高的安全性和更少受欺詐的可能性。SET交
易分三個階段進行:用戶向商家購物並確定支付;商家與銀行核實;銀行向商家支付貨款。每個階段都
涉及到RSA對數據加密,以及RSA數字簽名。使用SET協議,在一次交易中,要完成多次加密與解密操作,
故有很高的安全性,但SET協議比SSL協議復雜,商家和銀行都需要改造系統以實現互操作。
在Linux 下,比較流行支持SSL認證的是OpenSSL伺服器。OpenSSL項目是一個合作的項目,開發一個
健壯的、商業等級的、完整的開放源代碼的工具包,用強大的加密演算法來實現安全的Socket層
(Secure Sockets Layer,SSL v2/v3)和傳輸層的安全性(Transport Layer Security,TLS v1)。
這個項目是由全世界的志願者管理和開發OpenSSL工具包和相關文檔。
如何在Linux下配置OpenSSL伺服器,首先從OpenSSL的主頁(http://www.openssl.org/)上下載
openssl-version.tar.gz軟體包來編譯安裝,與Apache伺服器配合可以建立支持SSL的Web伺服器,
並可以使用自我簽訂的證書做認證,關於如何編譯、安裝OpenSSL伺服器,可以參考一下OpenSSL HOWTO
文檔。

SSL 程序設計初步介紹
SSL 通訊模型為標準的C/S 結構,除了在 TCP 層之上進行傳輸之外,與一般的通訊沒有什麼明顯的區
別。在這里,我們主要介紹如何使用OpenSSL進行安全通訊的程序設計。關於OpenSSL 的一些詳細的信
息請參考OpenSSL的官方主頁 http://www.openssl.org。
在使用OpenSSL前,必須先對OpenSSL 進行初始化,以下的三個函數任選其一:
SSL_library_init(void);
OpenSSL_add_ssl_algorithms();
SSLeay_add_ssl_algorithms();
事實上 後面的兩個函數只是第一個函數的宏。
如果要使用OpenSSL的出錯信息,使用SSL_load_error_strings (void)進行錯誤信息的初始化。以後
可以使用void ERR_print_errors_fp(FILE *fp) 列印SSL的錯誤信息。
一次SSL連接會話一般要先申請一個SSL 環境,基本的過程是:
1. SSL_METHOD* meth = TLSv1_client_method(); 創建本次會話連接所使用的協議,如果是客戶端可
以使用
SSL_METHOD* TLSv1_client_method(void); TLSv1.0 協議
SSL_METHOD* SSLv2_client_method(void); SSLv2 協議
SSL_METHOD* SSLv3_client_method(void); SSLv3 協議
SSL_METHOD* SSLv23_client_method(void); SSLv2/v3 協議
伺服器同樣需要創建本次會話所使用的協議:
SSL_METHOD *TLSv1_server_method(void);
SSL_METHOD *SSLv2_server_method(void);
SSL_METHOD *SSLv3_server_method(void);
SSL_METHOD *SSLv23_server_method(void);
需要注意的是客戶端和伺服器需要使用相同的協議。
2.申請SSL會話的環境 CTX,使用不同的協議進行會話,其環境也是不同的。申請SSL會話環
境的OpenSSL函數是
SSLK_CTX* SSL_CTX_new (SSL_METHOD*); 參數就是前面我們申請的 SSL通訊方式。返回當前
的SSL 連接環境的指針。
然後根據自己的需要設置CTX的屬性,典型的是設置SSL 握手階段證書的驗證方式和載入自己
的證書。
void SSL_CTX_set_verify (SSL_CTX* , int , int* (int, X509_STORE_CTX*) )
設置證書驗證的方式。
第一個參數是當前的CTX 指針,第二個是驗證方式,如果是要驗證對方的話,就使用
SSL_VERIFY_PEER。不需要的話,使用SSL_VERIFY_NONE.一般情況下,客戶端需要驗證對方,而
伺服器不需要。第三個參數是處理驗證的回調函數,如果沒有特殊的需要,使用空指針就可以了。
void SSL_CTX_load_verify_locations(SSL_CTX*, const char* , const char*);
載入證書;
第一個參數同上,參數二是證書文件的名稱,參數三是證書文件的路徑;
int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type);
載入本地的證書;type 指明證書文件的結構類型;失敗返回-1
int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type);
載入自己的私鑰;type 參數指明私鑰文件的結構類型;失敗返回-1
載入了證書和文件之後,就可以驗證私鑰和證書是否相符:
BOOl SSL_CTX_check_private_key (SSL_CTX*);
3.既然SSL 使用TCP 協議,當然需要把SSL attach 到已經連接的套接字上了:
SSL* SSL_new (SSL_CTX*); 申請一個SSL 套節字;
int SSL_set_rfd (SSL*); 綁定只讀套接字
int SSL_set_wfd (SSL*); 綁定只寫套接字
int SSL_set_fd ( SSL*); 綁定讀寫套接字
綁定成功返回 1, 失敗返回0;
4. 接下來就是SSL 握手的動作了
int SSL_connect (SSL*); 失敗返回 -1
5. 握手成功之後,就可以進行通訊了,使用SSL_read 和SS_write 讀寫SSL 套接字代替傳統的
read 、write
int SSL_read (SSL *ssl, char *buf, int num );
int SSL_write (SSL *ssl, char *buf, int num);
如果是伺服器,則使用 SSL_accept 代替傳統的 accept 調用
int SSL_accept(SSL *ssl);
6. 通訊結束,需要釋放前面申請的 SSL資源
int SSL_shutdown(SSL *ssl); 關閉SSL套接字;
void SSL_free (ssl); 釋放SSL套接字;
void SSL_CTX_free (ctx); 釋放SSL環境;
OpenSSL 雖然已經發展到了0.9.96版本,但是它的文檔還很少,甚至連最基本的man 函數手
冊都沒有完成。所以,本文緊緊是講述了使用OpenSSL 進行程序設計的框架。更加詳細的資
料可以參考OpenSSL 的文檔或者 Apache mod_ssl 的文檔。
通過以上的介紹,我想讀者對SSL協議已經有了一定的了解,作者有機會將會繼續給大家介紹
SSL協議的其他方面的內容。

SSL原理解密
本文出自:
http://noc.cstnet.net.cn/
范曉明

RSA公鑰加密在計算機產業中被廣泛使用在認證和加密。可以從RSA Data Security Inc.獲得的RSA公鑰加密許可證。公鑰加密是使用一對非對稱的密碼加密或解密的方法。每一對密碼由公鑰和私鑰組成。公鑰被廣泛發布。私鑰是隱密的,不公開。用公鑰加密的數據只能夠被私鑰解密。反過來,使用私鑰加密的數據只能用公鑰解密。這個非對稱的特性使得公鑰加密很有用。

使用公鑰加密法認證

認證是一個身份認證的過程。在下列例子中包括甲和乙,公鑰加密會非常輕松地校驗身份。符號{數據} key意味著"數據"已經使用密碼加密或解密。假如甲想校驗乙的身份。乙有一對密碼,一個是公開的,另一個是私有的。乙透露給甲他的公鑰。甲產生一個隨機信息發送給乙。甲——〉乙:random-message

乙使用他的私鑰加密消息,返回甲加密後的消息。 乙——〉甲:{random-message}乙的私鑰

甲收到這個消息然後使用乙的以前公開過的公鑰解密。他比較解密後的消息與他原先發給乙的消息。如果它們完全一致,就會知道在與乙說話。任意一個中間人不會知道乙的私鑰,也不能正確加密甲檢查的隨機消息。

除非你清楚知道你加密的消息。用私鑰加密消息,然後發送給其他人不是一個好主意。因為加密值可能被用來對付你,需要注意的是:因為只有你才有私鑰,所以只有你才能加密消息。所以,代替加密甲發來的原始消息,乙創建了一個信息段並且加密。信息段取自隨機消息(random-message)並具有以下有用的特性:

1. 這個信息段難以還原。任何人即使偽裝成乙,也不能從信息段中得到原始消息;

2. 假冒者將發現不同的消息計算出相同的信息段值;

3. 使用信息段,乙能夠保護自己。他計算甲發出的隨機信息段,並且加密結果,並發送加密信息段返回甲。甲能夠計算出相同的信息段並且解密乙的消息認證乙。

這個技術僅僅描繪了數字簽名。通過加密甲產生的隨機消息,乙已經在甲產生的消息簽名。因此我們的認證協議還需要一次加密。一些消息由乙產生:

甲——〉乙:你好,你是乙么?

乙——〉甲:甲,我是乙

{信息段[甲,我是乙] } 乙的私鑰

當你使用這個協議,乙知道他發送給乙的消息,他不介意在上面簽名。他先發送不加密的信息,"甲,我是乙。",然後發送信息段加密的消息版本。甲可以非常方便地校驗乙就是乙,同時,乙還沒有在他不想要的信息上簽名。

提交公鑰

那麼,乙怎樣以可信的方式提交他的公鑰呢?看看認證協議如下所示:

甲——〉乙:你好

乙——〉甲:嗨,我是乙,乙的公鑰

甲——〉乙:prove it

乙——〉甲:甲,我是乙 {信息段[甲,我是乙] } 乙的私鑰

在這個協議下,任何人都能夠成為"乙"。所有你所要的只是公鑰和私鑰。你發送給甲說你就是乙,這樣你的公鑰就代替了乙的密碼。然後,你發送用你的私鑰加密的消息,證明你的身份。甲卻不能發覺你並不是乙。為了解決這個問題,標准組織已經發明了證書。一個證書有以下的內容:

* 證書的發行者姓名

* 發行證書的組織

* 標題的公鑰

* 郵戳

證書使用發行者的私鑰加密。每一個人都知道證書發行者的公鑰(這樣,每個證書的發行者擁有一個證書)。證書是一個把公鑰與姓名綁定的協議。通過使用證書技術,每一個人都可以檢查乙的證書,判斷是否被假冒。假設乙控制好他的私鑰,並且他確實是得到證書的乙,就萬事大吉了。

這些是修訂後的協議:

甲——〉乙:你好

乙——〉甲:嗨,我是乙,乙的校驗

甲——〉乙:prove it

乙——〉甲:甲,我是乙 {信息段[甲, 我是乙] } 乙的私鑰

現在當甲收到乙的第一個消息,他能檢查證書,簽名(如上所述,使用信息段和公鑰解密),然後檢查標題(乙的姓名),確定是乙。他就能相信公鑰就是乙的公鑰和要求乙證明自己的身份。乙通過上面的過程,製作一個信息段,用一個簽名版本答復甲。甲可以校驗乙的信息段通過使用從證書上得到的公鑰並檢查結果。

如果一個黑客,叫H

甲——〉H:你好

H——〉不能建立一個令甲相信的從乙的消息。

交換密碼(secret)

一旦甲已經驗證乙後,他可以發送給乙一個只有乙可以解密、閱讀的消息:

甲——〉乙:{secret}乙的公鑰

唯一找到密碼的方法只有使用乙的私鑰解碼上述的信息。交換密碼是另一個有效使用密碼加密的方法。即使在甲和乙之間的通訊被偵聽,只有乙才能得到密碼。

使用密碼作為另一個secret-key增強了網路的安全性,但是這次這是一個對稱的加密演算法(例如DES、RC4、IDE甲)。因為甲在發送給乙之前產生了密碼,所以甲知道密碼。乙知道密碼因為乙有私鑰,能夠解密甲的信息。但他們都知道密碼,他們都能夠初始化一個對稱密碼演算法,而且開始發送加密後的信息。這兒是修定後的協議:

甲——〉乙:你好

乙——〉甲:嗨,我是乙,乙的校驗

甲——〉乙:prove it

乙——〉甲:甲,我是乙 {信息段[甲,我是乙] }乙的私鑰

甲——〉乙:ok 乙,here is a secret {secret}乙的公鑰

乙——〉甲:{some message}secret-key

黑客竊聽

那麼如果有一個惡意的黑客H在甲和乙中間,雖然不能發現甲和乙已經交換的密碼,但能幹擾他們的交談。他可以放過大部分信息,選擇破壞一定的信息(這是非常簡單的,因為他知道甲和乙通話採用的協議)。

甲——〉H:你好

H——〉乙:你好

乙——〉H:嗨,我是乙,乙的校驗

H——〉甲:嗨,我是乙,乙的校驗

甲——〉H:prove it

H——〉乙:prove it

乙——〉H:甲,我是乙 {信息段[甲,我是乙] }乙的私鑰

H——〉甲:甲,我是乙 {信息段[甲,我是乙] }乙的私鑰

甲——〉H:ok 乙,here is a secret {secret} 乙的公鑰

H——〉乙:ok 乙,here is a secret {secret} 乙的公鑰

乙——〉H:{some message}secret-key

H——〉甲:Garble[{some message}secret-key ]

H忽略一些數據不修改,直到甲和乙交換密碼。然後H干擾乙給甲的信息。在這一點上,甲相信乙,所以他可能相信已經被干擾的消息並且盡力解密。

需要注意的是,H不知道密碼,他所能做的就是毀壞使用秘鑰加密後的數據。基於協議,H可能不能產生一個有效的消息。但下一次呢?

為了阻止這種破壞,甲和乙在他們的協議中產生一個校驗碼消息(message authentication code)。一個校驗碼消息(MAC)是一部分由密碼和一些傳輸消息產生的數據。信息段演算法描述的上述特性正是它們抵禦H的功能:

MAC= Digest[some message,secret ]

因為H不知道密碼,他不能得出正確的值。即使H隨機干擾消息,只要數據量大,他成功的機會微乎其微。例如,使用HD5(一個RSA發明的好的加密演算法),甲和乙能夠發送128位MAC值和他們的消息。H猜測正確的MAC的幾率將近1/18,446,744,073,709,551,616約等於零。

這是又一次修改後的協議:

甲——〉乙:你好

乙——〉甲:嗨,我是乙,乙的校驗

甲——〉乙:prove it

乙——〉甲:嗨,我是乙,乙的校驗

甲,我是乙

{信息段[甲,我是乙] } 乙的私鑰

ok 乙,here is a secret {secret} 乙的公鑰

{some message,MAC}secret-key

現在H已經無技可施了。他干擾了得到的所有消息,但MAC計算機能夠發現他。甲和乙能夠發現偽造的MAC值並且停止交談。H不再能與乙通訊。

OpenSSL FAQ

熱點內容
安卓上哪裡下大型游戲 發布:2024-12-23 15:10:58 瀏覽:189
明日之後目前適用於什麼配置 發布:2024-12-23 14:56:09 瀏覽:56
php全形半形 發布:2024-12-23 14:55:17 瀏覽:829
手機上傳助手 發布:2024-12-23 14:55:14 瀏覽:733
什麼樣的主機配置吃雞開全效 發布:2024-12-23 14:55:13 瀏覽:831
安卓我的世界114版本有什麼 發布:2024-12-23 14:42:17 瀏覽:711
vbox源碼 發布:2024-12-23 14:41:32 瀏覽:279
詩經是怎麼存儲 發布:2024-12-23 14:41:29 瀏覽:661
屏蔽視頻廣告腳本 發布:2024-12-23 14:41:24 瀏覽:420
php解析pdf 發布:2024-12-23 14:40:01 瀏覽:821