區塊鏈中的密碼學系列之對稱加密算法DES(六)

2021-01-18 郝俊語

1. 前言

DES是一種數據加密標準( Data Encryption Standard) , 有30多年歷史,是一種對稱密碼算法,是第一個得到廣泛應用的密碼算法,是一種分組加密算法,輸入的明文為64位,密鑰為64位(實際上只有56位,原因是每隔7個比特設置一個奇偶校驗位),生成的密文分組長度為64位。但是現在已經不再安全。

課件來自我們老師上課的PPT。

2. Feistel網絡

我們可以參考這裡,Feistel講解

下面簡單說下:

Feistel網絡利用乘積密碼實現關鍵密碼模塊。所謂乘積密碼就是順序或循環地執行兩個或多個基本密碼模塊,提高密碼強度。其思想就是Shannon提出的利用乘積密碼

實現擴散和混淆。

Feistel網絡的加密結構:將2w bit明文分成為左右兩半、長為1 w bit的段,以L和R表示。然後進行n輪迭代,其第i輪迭代的輸入為上一輪(第i-1輪)輸出。

其中Ki是第i輪用的子密鑰, f是密碼設計者選取或設計密碼輪函數。 稱這種分組密碼算法為Feistel網絡( Feistel Network) , 它保證加密和解密可採用同一算法實施。

每次迭代稱為一輪(Round)。 相應函數f 稱作輪函數。

Feistel網絡的解密結構:Feistel解密過程本質上與加密過程一樣。密文作為輸入,使用子密鑰Ki的次序與加密過程相反, Kn,Kn-1,…,K1。保證了加密與解密過程可採用同一算法。

3. DES算法框架

輪函數:

Li=Ri-1;

Ri=Li-1⊕f(Ri-1, Ki)。

4. DES加密模塊

4.1 初始置換IP

4.2 DES的輪結構

擴充變換:擴充變換E的作用是將32比特的明文擴充為48比特。設m=m1m2…m31m32; c=c1c2…c47c48。滿足E(m)=c, c1=m32,c2=m1,…,c7=m4,…,c48=m1。

8個S盒:

每個S盒Sj將6比特輸入縮減為4比特輸出。 8個S盒總共將48比特輸入縮減為32比特輸出。

每個S盒的輸入為6比特串m=m1m2m3m4m5m6,輸出為4比特串c=c1c2c3c4。

將m1m6, m2m3m4m5, c1c2c3c4都用10進位來表示,則在下表中位於m1m6 (0~3)行 m2m3m4m5 (0~15)列的數就是S盒的輸出 c1c2c3c4(十進位轉化成二進位)。

例如若S1的輸入為100110,則通過查表(S1)輸出應該是表中的第2(10)行第3(0011)列的數字8,所以二進位輸出為1000。

置換P:

置換P將32比特的輸入,改變位置順序:輸出的第1位為輸入的第16位,輸出的第2位為輸入的第7位, …,輸出的第32位為輸入的第25位。

4.3 子密鑰生成算法

64位密鑰(8位奇偶校驗位,有效位為56位)經過置換選擇1、循環左移、置換選擇2等變換,產生出16個48位長的子密鑰。

置換選擇1:

64位密鑰分為8個字節。每個字節的前7位是真正的密鑰位,第8位是奇偶校驗位。奇偶校驗位可以從前7位密鑰位計算得出,不是隨機的,因而不起密鑰的作用。因此,DES真正的密鑰只有56位。

置換選擇1的作用有兩個:一是從64位密鑰中去掉8個奇偶校驗位;二是把其餘56位密鑰位打亂重排,且將前28位作為C0,後28位作為D0。

置換選擇1的矩陣如下:

循環左移:

每一次迭代,將Ci-1和Di-1按照一定的位數循環左移分別得到Ci和Di。

循環左移位數表如下:

置換選擇2

將Ci和Di合併成一個56位的中間數據,置換選擇2從中選擇出一個48位的子密鑰Ki。置換選擇2的矩陣如下:

縮減變換PC-1, PC-2 : PC-1將64比特串縮為56比特; PC-2將56比特長的串縮為48比特。兩個變換的輸出比特順序如下:

5. DES的加解密過程

DES的加密過程:

64位密鑰經子密鑰產生算法產生出16個48位子密鑰:K1,K2,...,K16,分別供第1次,第2次,...,第16次加密迭代使用。64位明文首先經過初始置換IP,將數據打亂重新排列並分成左右兩半,左邊32位構成L0,右邊32位構成R0。第i次加密迭代:由輪函數f實現子密鑰Ki對Ri-1的加密,結果為32位的數據組f ( Ri-1 , Ki )。f ( Ri-1 , Ki )再與Li-1模2相加,又得到一個32位的數據組Li-1 ⊕ f ( Ri-1 , Ki )。以Li ⊕ f ( Ri-1 , Ki )作為下一次加密迭代的Ri,以Ri-1作為下一次加密迭代的Li ( i = 1,2,...,16)。按照上一步的規則進行16次加密迭代。第16次加密迭代結束後,以R16為左,L16為右,合併產生一個64位的數據組。再經過逆初始置換IP-1,將數據重新排列,便得到64位密文。DES的解密過程:

64位密鑰經子密鑰產生算法產生出16個48位子密鑰:K1,K2,...,K16,分別供第1次,第2次,...,第16次解密迭代使用。64位密文首先經過初始置換IP,將數據打亂重新排列並分成左右兩半,左邊32位構成R16,右邊32位構成L16。第17-i次解密迭代:由輪函數f實現子密鑰Ki對Li的解密,結果為32位的數據組f ( Li , Ki )。f ( Li , Ki )再與Ri模2相加,又得到一個32位的數據組Ri ⊕ f ( Li , Ki )。以Ri ⊕ f ( Li , Ki )作為下一次解密迭代的Li-1,以Li作為下一次解密迭代的Li-1 ( i = 16,15,...,1)。按照上一步的規則進行16次解密迭代。第16次解密迭代結束後,以L0為左,R0為右,合併產生一個64位的數據組。再經過逆初始置換IP-1,將數據重新排列,便得到64位明文。6. DES的安全性

DES算法中除了S盒是非線性變換外,其餘變換均為線性變換,所以DES安全的關鍵是S盒(保密 )。因為算法中使用了16次迭代,從而使得改變輸入明文或密鑰中的1位,密文都會發生大約32位的變化,具有良好的雪崩效應,大大提高了保密性。S盒用來提供混淆,使明文、密鑰、密文之間的關係錯綜複雜,而P置換用來提供擴散,把S盒提供的混淆作用充分擴散開來。這樣,S盒和P置換互相配合,形成了很強的抗差分攻擊和抗線性攻擊能力,其中抗差分攻擊能力更強些。

7. DES加密的一個例子

取16進位明文X: 0123456789ABCDEF

密鑰K為: 133457799BBCDFF1

去掉奇偶校驗位以二進位形式表示的密鑰是

00010010011010010101101111001001101101111011011111

111000

應用IP,我們得到:

L0=11001100000000001100110011111111

L1=R0=11110000101010101111000010101010

然後進行16輪加密。

最後對L16, R16使用IP-1得到密文: 85E813540F0AB405

8. java版的DES算法

DES工具類:

public class DESUtil {//置換選擇1矩陣 static int[] replace1C = { 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36 }; static int[] replace1D = { 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4 }; //循環左移位數表 static int[] moveNum = {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1}; //置換選擇2矩陣 static int[] replace2 = { 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32 }; //初始置換矩陣 static int[] IP = { 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 }; //選擇運算矩陣 static int[] E = { 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25, 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1 }; //代替函數組 static int[][][] S = { //S1 { {14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7}, { 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8}, { 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0}, {15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13} }, //S2 { {15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10}, { 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5}, { 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15}, {13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9} }, //S3 { {10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8}, {13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1}, {13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7}, { 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12} }, //S4 { { 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15}, {13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9}, {10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4}, { 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14} }, //S5 { { 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9}, {14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6}, { 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14}, {11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3} }, //S6 { {12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11}, {10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8}, { 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6}, { 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13} }, //S7 { { 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1}, {13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6}, { 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2}, { 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12} }, //S8 { {13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7}, { 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2}, { 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8}, { 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11} } }; //置換運算矩陣 static int[] P = { 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10, 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25 }; //逆初始置換矩陣 static int[] rIP = { 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25 };/***************************子密鑰的產生**********************************************************************/ /** * 子密鑰的產生 * @param sKey 64位密鑰 * @return 16個48位子密鑰 */ static byte[][] generateKeys(byte[] sKey) { byte[] C = new byte[28]; byte[] D = new byte[28]; byte[][] keys = new byte[16][48]; //置換選擇1 //一是從64位密鑰中去掉8個奇偶校驗位;二是把其餘56位密鑰位打亂重排 for (int i = 0; i < 28; i++) { C[i] = sKey[replace1C[i] - 1]; D[i] = sKey[replace1D[i] - 1]; } for (int i = 0; i < 16; i++) { //循環左移 C = RSHR(C, moveNum[i]); D = RSHR(D, moveNum[i]); //置換選擇2 for (int j = 0; j < 48; j++) { if (replace2[j] <= 28) keys[i][j] = C[replace2[j] - 1]; else keys[i][j] = D[replace2[j] - 29]; } } return keys; } /** * 循環左移 * @param b 數組 * @param n 位數 * @return */ static byte[] RSHR(byte[] b, int n) { String s = new String(b); s = (s + s.substring(0, n)).substring(n); return s.getBytes(); }/**********************初始置換IP**************************************************************************/ /** * 初始置換IP * @param text 64位數據 * @return */ static byte[] IP(byte[] text) { byte[] newtext = new byte[64]; for (int i = 0; i < 64; i++) newtext[i] = text[IP[i] - 1]; return newtext; }/**********************輪函數**************************************************************************/ /** * 輪函數 * @param A 32位輸入 * @param K 48位子密鑰 * @return 32位輸出 */ static byte[] f(byte[] A, byte[] K) { byte[] t = new byte[48]; byte[] r = new byte[32]; byte[] result = new byte[32]; //選擇運算E,擴充變換為48bit for (int i = 0; i < 48; i++) t[i] = A[E[i] - 1]; //模2相加,逐位異或,得到一個48位的結果 for (int i = 0; i < 48; i++) t[i] = (byte) (t[i] ^ K[i]); //代替函數組S, 8個S盒總共將48比特輸入縮減為32比特輸出。 for (int i = 0, a = 0; i < 48; i += 6, a += 4) { int j = t[i] * 2 + t[i + 5]; //b1b6 int k = t[i + 1] * 8 + t[i + 2] * 4 + t[i + 3] * 2 + t[i + 4]; //b2b3b4b5 byte[] b = Integer.toBinaryString(S[i / 6][j][k] + 16).substring(1).getBytes(); for (int n = 0; n < 4; n++) r[a + n] = (byte) (b[n] - '0'); } //置換運算P,重新打亂順序輸出 for (int i = 0; i < 32; i++) result[i] = r[P[i] - 1]; return result; }/**********************逆初始置換IP^-1**************************************************************************/ /** * 逆初始置換IP^-1 * @param text 64位數據 * @return */ static byte[] rIP(byte[] text) { byte[] newtext = new byte[64]; for (int i = 0; i < 64; i++) newtext[i] = text[rIP[i] - 1]; return newtext; }}

DES實現類:

public class DES {/** * 加密 * @param plaintext 64位明文 * @param sKey 64位密鑰 * @return 64位密文 */ static byte[] encrypt(byte[] plaintext, byte[] sKey) { byte[][] L = new byte[17][32]; byte[][] R = new byte[17][32]; byte[] ciphertext = new byte[64]; //子密鑰的產生 byte[][] K = DESUtil.generateKeys(sKey); //初始置換IP plaintext = DESUtil.IP(plaintext); //將明文分成左半部分L0和右半部分R0 for (int i = 0; i < 32; i++) { L[0][i] = plaintext[i]; R[0][i] = plaintext[i + 32]; } //加密迭代 for (int i = 1; i <= 16; i++) { L[i] = R[i - 1]; R[i] = xor(L[i - 1], DESUtil.f(R[i - 1], K[i - 1])); } //以R16為左半部分,L16為右半部分合併 for (int i = 0; i < 32; i++) { ciphertext[i] = R[16][i]; ciphertext[i + 32] = L[16][i]; } //逆初始置換IP^-1 ciphertext = DESUtil.rIP(ciphertext); return ciphertext; } /** * 解密 * @param ciphertext 64位密文 * @param sKey 64位密鑰 * @return 64位明文 */ static byte[] decrypt(byte[] ciphertext, byte[] sKey) { byte[][] L = new byte[17][32]; byte[][] R = new byte[17][32]; byte[] plaintext = new byte[64]; //子密鑰的產生 byte[][] K = DESUtil.generateKeys(sKey); //初始置換IP ciphertext = DESUtil.IP(ciphertext); //將密文分成左半部分R16和右半部分L16 for (int i = 0; i < 32; i++) { R[16][i] = ciphertext[i]; L[16][i] = ciphertext[i + 32]; } //解密迭代 for (int i = 16; i >= 1; i--) { L[i - 1] = xor(R[i], DESUtil.f(L[i], K[i - 1])); R[i - 1] = L[i]; R[i] = xor(L[i - 1], DESUtil.f(R[i - 1], K[i - 1])); } //以L0為左半部分,R0為右半部分合併 for (int i = 0; i < 32; i++) { plaintext[i] = L[0][i]; plaintext[i + 32] = R[0][i]; } //逆初始置換IP^-1 plaintext = DESUtil.rIP(plaintext); return plaintext; } /** * 兩數組異或 * @param a * @param b * @return */ static byte[] xor(byte[] a, byte[] b) { byte[] c = new byte[a.length]; for (int i = 0; i < a.length; i++) c[i] = (byte) (a[i] ^ b[i]); return c; }}

DES測試:

public class TestDES {public static void main(String[] args) { String strKey = "0011000100110010001100110011010000110101001101100011011100111000"; byte[] sKey = strKey.getBytes(); for (int i = 0; i < sKey.length; i++) sKey[i] -= '0'; System.out.print("密鑰:"); printByteArr(sKey); String strPlain = "0011000000110001001100100011001100110100001101010011011000110111"; byte[] plaintext = strPlain.getBytes(); for (int i = 0; i < plaintext.length; i++) plaintext[i] -= '0'; System.out.print("明文:"); printByteArr(plaintext); byte[] ciphertext = DES.encrypt(plaintext, sKey); System.out.print("密文:"); printByteArr(ciphertext); byte[] plainText = DES.decrypt(ciphertext, sKey); System.out.print("明文:"); printByteArr(plainText); } static void printByteArr(byte[] b) { for (int i = 0; i < b.length; i++) { System.out.print(b[i]); if (i % 8 == 7) System.out.print(" "); } System.out.println(); }}

測試結果:

9. 3DES

為提高安全性, 並利用實現DES的現有軟硬體, 將DES算法在多密鑰下重複使用。

三重DES:

兩個密鑰的三重DES。C=Ek1[Dk2[Ek1[P]]]

三個密鑰的三重DES。C=Ek3[Dk2[Ek1[P]]]

10. 結束語

我們學習了DES加密算法。DES作為對稱加密,其實現還是比較複雜的。我們來簡單回顧下,DES的加密過程。首先,我們需要生成16*48位的子密鑰(子密鑰的生成需要三步,即置換選擇1,循環左移和置換選擇2)。然後執行輪函數(分為四步,分別是擴充變換E,與密鑰按位異或,S盒變換,P盒變換)。最後進行逆初始變換即可得到加密後的密文。

解密與之類似。不再贅述。

相關焦點

  • 區塊鏈丨非對稱加密算法,區塊鏈的加密秘訣!
    關注「區鏈數科」,讓你從入門到精通區塊鏈!前面講到了對稱加密算法,今天講講非對稱加密算法。可以說非對稱算法是對稱算法的升級,因為非對稱算法是基於對稱算法而被研究出來的。非對稱算法與對稱算法的不同之處在於非對稱算法省去了對稱加密算法時要分發密鑰的麻煩,所以說是對稱加密算法的升級。
  • 數據加密中的DES加密算法詳解
    [摘要] 本文詳細介紹了DES數據加密算法的原理,並給出了一個例子演示了如何使用c#中的加密包進行DES算法加密,最後對DES進行了評價。信息加密技術是一門涉及數學、密碼學和計算機的交叉學科。現代密碼學的發展,使信息加密技術已經不再依賴於對加密算法本身的保密,而是通過在統計學意義上提高破解的成本來提供高加密算法的安全性。密碼學是一門古老而又年輕的科學,它用於保護軍事和外交通信,可追溯到幾千年前。1976年Diffie和Hellman的「密碼學的新方向」一文引發的密碼學的一場革命,開創了公鑰密碼學的新紀元。
  • 被證明的黎曼猜想跟區塊鏈加密算法有什麼關係?
    而區塊鏈屆跟著躁動,加密算法要被破解了。而除了研究意義外,黎曼猜想因為能揭示素數分布的統計規律,跟需要用到素數的加密算法有一定聯繫,也觸發了一些區塊鏈自媒體和幣圈人士的「G」點。查閱資料了解到,一直以來,素數的分布很難捕捉到規律,黎曼在其論文中指出素數的分布完全蘊藏在一個特殊的函數中(黎曼函數),這也構成了黎曼猜想關於素數的分布。而目前區塊鏈領域用到的加密算法,和素數的分布軌跡有一定聯繫。
  • 「黎曼猜想」要摧毀區塊鏈和加密貨幣?
    本來以為只是數學界的一件大事,但網上傳言,這能對區塊鏈造成影響,甚至毀滅加密貨幣。這話是不是危言聳聽呢?1.「黎曼猜想」在猜什麼「黎曼猜想」由數學家波恩哈德·黎曼於1859年提出。簡單的理解,黎曼猜想就是一個找素數的方法。我們開始一起回憶下小學數學:素數在自然數中是一種特別的數,它只能被1和自己整除,比如2、3、5、7。
  • 區塊鏈加密機制的不同算法及其原理解析
    在EKT中Token鏈是一個並行多鏈的結構,多鏈多共識,共享用戶基礎,這也意味著使用EKT公鏈,可以把Token鏈和Dapp鏈分離,並自由的選擇共識算法和加密算法。比特幣採用SHA256算法,該算法屬於SHA-2系列,在中本聰發明比特幣時(2008)被公認為最安全最先進的算法之一。除了生成地址中有一個環節使用了REPID-160算法,比特幣系統中但凡有需要做Hash運算的地方都是用SHA256。
  • 常見加密算法DES、AES和RSA的原理和特點
    1DES加密算法1.DES含義DES全稱為Data Encryption Standard,即數據加密標準,是一種使用密鑰加密的塊算法,1977年被美國聯邦政府的國家標準局確定為聯邦資料處理標準(FIPS),並授權在非密級政府通信中使用,隨後該算法在國際上廣泛流傳開來。DES是對稱性加密裡常見的一種,是一種使用秘鑰加密的塊算法。
  • 「從零學習區塊鏈之12」區塊鏈世界,你不可不知的四大核心技術
    從2013年進入中國市場開始,區塊鏈行業在市場與政策演變起伏中,逐漸趨於成熟化。如今,區塊鏈在中國早已走出理論階段邁向實踐區域,從虛擬經濟跨步實體經濟之中。近十年來,區塊鏈技術正在與人工智慧、大數據、物聯網等前沿技術一起引領著全球新一輪技術變革和產業變革,諮詢機構麥肯錫甚至將其稱之為繼蒸汽機、電力、信息和網際網路科技之後,最具潛力觸發第五輪顛覆性革命浪潮的核心技術。作為比特幣的底層開發技術,區塊鏈獲得了長足的進步,分布式帳本、共識機制、密碼學和智能合約四大核心也在不斷的迭代完善。
  • 從交易所到一站式區塊鏈平臺,VTOKEN如何捕獲加密價值?
    其中代表性的有融合Git、自證明文件系統(SFS)、BitTorrent和DHT等技術的星際文件系統(IPFS),其提供全球統一的可尋址空間,可以用作區塊鏈的底層協議,支持與區塊鏈系統進行數據交互。高效的上線機制vtoken有完善的項目實施團隊,整個項目環節都有專人負責、提前規劃,再加上vtoken成熟的產品體系,分秒必爭,快速上線,相關產品的上線基於可驗證隨機函數算法,此算法由SilvioMicali等在1999年提出,被用於VTOKEN共識機制中提供抽籤功能。
  • 吳軍:《數學之美》中的密碼學原理,古代密碼學和現代密碼學
    在《數學之美》的第17章,吳軍由於很喜歡電視劇《暗算》的構思和演員的表演,給我們科普了密碼學原理。密碼學聽起來很神秘,也比較有趣,那麼密碼學原理究竟是什麼?古代密碼學和現代密碼學又有什麼區別呢?古代密碼學在現代體育競技還有著廣泛的應用。比如我們經常看到籃球或足球比賽中,同隊運動員相互之間打手勢布置戰術就是。1871年,上海大北水線電報公司選用了6899個漢字,代以四碼數字,成為中國最初的商用明碼本,同時也設計了由明碼本改編為密本及進行加亂的方法。在此基礎上,逐步發展為各種比較複雜的密碼。
  • 什麼是後量子密碼學?
    量子密碼學對經典公鑰密碼學意味著什麼?量子密碼學可以解決什麼問題。什麼是後量子密碼學?在前一篇文章中,討論了量子計算機的出現對經典公鑰密碼學意味著什麼。我們現有部署的所有公鑰技術都基於大整數分解或求解離散對數問題。
  • 基於區塊鏈的鏈上數據安全共享體系研究
    該方案實現了用戶身份識別、認證、安全數據交換等一系列要求 。同年,Zhang A等人提出一種基於安全和隱私保護的、基於區塊鏈的個人醫療信息共享方案。通過應用基於公鑰密碼學的可搜索加密,該方案允許用戶的醫療信息被安全和受控地訪問及用於改善醫療診斷服務。李康等人歸納並總結了基於零知識證明的隱私保護方案在區塊鏈技術中的應用。祝烈煌等人介紹了以混幣機制為代表的區塊鏈交易數據隱私保護方案。
  • 量子計算將會如何影響區塊鏈技術
    量子計算和密碼學、區塊鏈加密技術息息相關,自那時候起,「量子計算」相關的討論就沒有停止過。本文作者的主要觀點是,量子計算機在未來十年可能會突破,抗量子計算的區塊鏈會成為新的趨勢,比特幣也許需要新的算法升級。
  • 人工智慧、量子計算,為區塊鏈帶來了新曙光
    DAS項目方的首席密碼學專家Bruce.Lan具有多年的密碼學經驗,他也承認簡單地密碼學設置在抵禦量子計算的衝擊有很大缺陷,尤其是實用RSA加密技術的區塊鏈項目更容易受到量子計算的攻擊。 然而,面對量子計算的衝擊,區塊鏈領域的開發人員也並不是毫無辦法和頭緒。
  • 院士說丨王小雲院士:密碼技術與區塊鏈
    中國科學院院士,國際密碼協會會士(IACRFellow),清華大學高等研究院「楊振寧講座」教授王小雲發表《密碼技術與區塊鏈》主題演講,她認為密碼技術解決信息安全性,哈希函數保障數據完整性,哈希函數和數字籤名算法一起保障可認證性和抵賴性。其中,哈希函數與區塊鏈關係十分密切,保障了區塊鏈的安全性。
  • 專家:區塊鏈發展應以密碼應用創新為根基
    廣義來講,區塊鏈是利用加密鏈式區塊結構來驗證與存儲數據、利用分布式節點共識算法生成和更新數據、利用自動化腳本代碼編程和操作數據的一種去中心化基礎架構與分布式計算範式,是一種分布式的基礎架構和計算規則。霍煒說,區塊鏈創新構造了一個實用化的分布式信任模式,提供在弱中心/多中心下的帳本共識信任基點,在需要多方協商共識的業務場景中具有特殊應用價值。
  • EKT多鏈技術談丨加密貨幣如何加密
    在EKT中Token鏈是一個並行多鏈的結構,多鏈多共識,共享用戶基礎,這也意味著使用EKT公鏈,可以把Token鏈和Dapp鏈分離,並自由的選擇共識算法和加密算法。比特幣採用SHA256算法,該算法屬於SHA-2系列,在中本聰發明比特幣時(2008)被公認為最安全最先進的算法之一。除了生成地址中有一個環節使用了REPID-160算法,比特幣系統中但凡有需要做Hash運算的地方都是用SHA256。
  • 區塊鏈的安全性 將被黎曼猜想的證明所顛覆?
    作為數學領域最大的瓜之一,各路群眾紛紛表示做好開吃準備,一些致力於區塊鏈研究與報導的媒體也不忘來刷屏,聲稱黎曼猜想的得證可以破解密碼學體系,以顛覆區塊鏈的安全性,甚至區塊鏈的未來也由此覆滅。那麼,黎曼猜想究竟和區塊鏈有何關係?筆者試圖在本文為您解答。什麼是黎曼猜想?
  • 若黎曼猜想被證明,區塊鏈會受影響嗎?
    讓我們來看它另一個變形公式:若黎曼猜想被證明,區塊鏈會受影響嗎?公式中的 P 為素數,又稱為質數。結合方程與根的關係,這就意味著,這個公式蘊涵著有關素數分布的重要信息。也就是說,該猜想假設了質數分布的規律是「隨機而均勻的」,與非平凡零點密切相關。質數在密碼學的應用那麼,為什麼要證明質數的分布規律呢?質數如何影響到現實中的應用呢?
  • 區塊鏈與量子計算的較量
    正如我在《區塊鏈技術在信用、智慧財產權、溯源等場景中的應用與思考》《5G、區塊鏈與智慧計量》(請關注回看)兩篇文章中所說,區塊鏈技術本身是沒有問題的,但是要用區塊鏈貨幣取代國家法幣是沒門的。比特幣的發明人中本聰可能沒有系統學過經濟學知識,比特幣運行這麼多年來,在經濟學界看來是存在不少缺陷的。2019年11月6日下午,華為在深圳總部舉行與任正非咖啡對話。
  • NGK引入反量子加密系統來應對量子計算攻擊
    當前,區塊鏈和分布式帳本技術已有了長足發展並廣泛應用與多種場景中,原因在於其提供透明性,冗餘性和問責性的能力。就區塊鏈而言,此類特徵是通過公鑰加密和哈希函數提供的。但是,隨著量子計算機技術的發展和量子霸權的實現,通用量子計算機不再是理論上可望而不可及的聖杯,並將在可預見的未來帶來一系列深刻的變化。基於大數分解和離散對數問題的非對稱密碼體制的崩塌是這一轉換中最突出的特徵之一。目前Grover和Shor(格羅弗和舒爾)算法對公鑰密碼學和散列函數構成了重要威脅,迫使我們重新設計具有量子抗性的區塊鏈密碼系統,以承受潛在的量子攻擊。