京東雲開發者|經典同態加密演算法Paillier解讀 - 原理、實現和應用
摘要
隨著雲端計算和人工智慧的興起,如何安全有效地利用資料,對持有大量數字資產的企業來說至關重要。同態加密,是解決雲端計算和分散式機器學習中資料安全問題的關鍵技術,也是隱私計算中,橫跨多方安全計算,聯邦學習和可信執行環境多個技術分支的熱門研究方向。
本文對經典同態加密演算法Pailier演算法及其相關技術進行介紹,重點分析了Paillier的實現原理和效能最佳化方案,同時對基於公鑰的加密演算法中的熱門演算法進行了橫向對比。最後介紹了Paillier演算法的一些實際應用。
【關鍵詞】:同態加密,多方安全計算,聯邦學習,隱私計算
1 背景知識
1.1 同態加密
同態加密(Homomorphic Encryption,HE)[1]是將資料加密後,對加密資料進行運算處理,之後對資料進行解密,解密結果等同於資料未進行加密,並進行同樣的運算處理。同態加密的概念最初在1978年,由Ron Rivest,Leonard Adleman和Michael L. Dertouzos共同提出,旨在解決在不接觸資料的前提下,對資料進行加工處理的問題。
目前,同態加密支援的運算主要為加法運算和乘法運算。按照其支援的運算程度,同態機密分為半同態加密(Partially Homomorphic Encryption, PHE)和全同態加密(Fully Homomorphic Encryption, FHE)。半同態加密在資料加密後只持加法運算或乘法運算中的一種,根據其支援的運算的不同,又稱為加法同態加密或乘法同態加密。半同態加密由於機制相對簡單,相對於全同態加密技術,擁有著更好的效能。全同態加密對加密後的資料支援任意次數的加法和乘法運算。
1.2 複合剩餘類問題
如果存在一個數那麼符合公式z yn (mod n2)的數z,稱為y的模n2的n階剩餘。複合剩餘類問題(decisional composite residuosity assumption , DCRA),指的是給定一個合數n和整數z,很難確定模n2的n階剩餘數z是否存在。
1.3 中國剩餘定理
中國剩餘定理(Chinese Remainder Theorem, CRT),又稱為孫子定理,源於《孫子算經》,是數論中的一個關於一元線性同餘方程組的定理,說明了一元線性同餘方程組有解的準則以及求解方法。
有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二。問物幾何?
翻譯為數學語言為:
其通用方程為:
中國剩餘定理的解法流程為:
2 Paillier演算法原理
2.1 Paillier簡介
在Paillier演算法出現之前,基於公鑰加密的演算法主要有兩個分支:
以RSA為代表的,基於大數因數分解難題的公鑰加密演算法
以ElGama為代表的,基於大數離散對數難題的公鑰加密演算法
Paillier加密演算法,由Pascal Paillier於1999年發表,給出了公鑰加密演算法的一個新的分支領域。Paillier基於複合剩餘類難題,滿足加法同態和數乘同態,具有非常高效的執行時效能。
2.2 一個典型的應用場景
同態加密演算法使得密文資料,在沒有額外資料洩露的情況下,可以在第三方平臺進行進一步加工處理。隨著大規模雲端計算的興起,尤其是涉及到敏感資料的雲端計算,同態加密演算法將是其中至關重要的技術基礎。我們以一個典型的聯邦學習的例子為切入點,看看Paillier演算法的原理和在實踐中應用的問題。
假設Alice和Bob想共同訓練一個網路模型,Alice和Bob各自持有一部分訓練資料,並且他們不想把自己的資料洩露給對方。那麼在訓練期間,Alice和Bob需要互動各自訓練的梯度資料,並根據雙方的梯度資料,共同計算一個對雙方都合適的梯度值,用來執行聯合梯度下降過程。
2019年,Ligeng Zhu等人發表的“Deep Leakage from Gradients”論文中給出了一種演算法,可以從幾次迭代的梯度資料中,推斷出訓練的資料,標籤,模型等一系列隱私資訊。這使得在分散式機器學習中,透過傳輸梯度資料來進聯合模型訓練變得不再安全。那麼如果在梯度資料傳輸的過程中,傳輸的是加密後的梯度資料,並且這些加密資料可以進行二次計算,那麼便可以規避梯度資料傳輸過程帶來的安全風險。
2.3 Paillier演算法
2.3.1 金鑰生成
類似於RSA演算法,Paillier也擁有公鑰和私鑰對。
在上述過程中,Alice總計生成了6個數字:
p = 11 q = 19 n = 209 λ = 90 g = 147 μ = 153
Alice將 n 和g 封裝成公鑰 public-key = (n, g)
將λ和μ封裝成私鑰: private-key = (λ, μ)
2.3.2 加密
假設Bob需要加密明文m, 0 <= m < n. 且Bob收到了Alice傳送過來的公鑰(n, g)
Bob選擇一個隨機數r,滿足0 < r < n
Bob計算加密後的密文 c = gm.rn mod n2
m = 8 r = 3 n_square = pow(n, 2) # n_square = 43681 c = gmpy2.mod(pow(g, m)*pow(r, n), n_square) # c = 32948
2.3.3 解密
假設c是Bob傳送過來的密文,且$c\in {\mathbb Z}_{{n^{{2}}}}^{{*}}$
Alice計算明文
m = L(cλ mod n2) * μ mod n
c = 32948 m = gmpy2.mod(L(gmpy2.mod(pow(c, lam), n_square), n) * mu, n) # m = 8
正確性證明
為了證明解密操作的正確性,我們把加密的公式代入:
根據卡米切爾定理(Carmichael’s function)有:
繼續化簡得:
由於g Zn2*, n + 1 Zn2*, 那麼一定存在唯一一對(a, b)使得:
gλ mod n2 = (1 + naλ) * bnλ mod n2 = 1 + aλn mod n2
把上述公式帶入,高階多項式按二項式定理展開,得:
DEC(c) = L( (1 + naλ) * bnλ mod n2 ) * μ mod n = L(1 + amλ*n mod n2) * μ mod n
這裡我們再看下μ的取值,同樣按照公式展開,得
μ = L(gλ mod n2)-1 mod n = L(1 + aλn mod n2)-1 mod n
最後把函式L展開,得:
DEC(c) = (amλ mod n2) * (a * λ mod n2)-1 mod n = m
2.3.4 同態加
假設Alice計算的梯度資料為m1, Bob計算的梯度資料為m2,Bob需要計算雙方梯度資料的均值(m1 + m2)/ 2, 作為分散式梯度下降的梯度資料。
同態加的原理是利用了冪函式的ax1 * ax2 = ax1+x1的特性。對於Alice持有的資料m1的密文c1和Bob持有資料m2的密文c2,Bob使用如下公式計算同態加法運算:
c = c1 * c2 mod n2
Alice使用私鑰計算DEC(c) = m1 + m2
正確性證明
為了證明同態加的正確性, 我們把加密的公式代入同態加運算:
c = ((gm1rn mod n2) * (gm2rn mod n2)) mod n2 = (gm1rngm2rn) mod n2 = (gm1 + m2r2n) mod n2 = ENC(m1 + m2)
解密c等價於:
DEC(c) = DEC(ENC(m1 + m2)) = m1 + m2
對於密文和明文相加的同態運算,我們當然可以先對明文加密,之後再對兩個密文進行同態加運算的方式來計算。不過從上面的公式可以看出,擾動資料rn中的r是一個任意值。那麼我們可以把計算密文c1和明文m2的和的計算轉換為:
c1 + m2 = (gm1rn mod n2 * gm2 mod n2) mod n2 = gm1+krn mod n2 = E(m1+m2)
這樣少了一次計算rn的運算量,提升了明文和密文相加運算的效率。
2.3.5 同態數乘
Paillier演算法目前只支援明文和密文相乘的計算方式,不支援密文和密文相乘。
同態數乘的原理是利用了冪函式的axk = akx的特性。
Bob使用Alice對明文m1加密後的密文c1和明文k,計算
c = c1k mod n2
Alice使用私鑰計算DEC(c) = k*m1
正確性證明
為了證明同態數乘的正確性, 我們把加密的公式代入同態數乘運算:
c = c1k mod n2 = (gm1*rn mod n2)k mod n2 = gk*m1* r1n mod n2 = E(k*m1)
解密c等價於:
DEC(c) = DEC(ENC(k * m1)) = k * m1
2.4 演算法最佳化
2.4.1 引數g最佳化
在原始Paillier方案中,g的取值只需滿足。Ivan和Mads在論文中給出了使用g = n + 1 的最佳化方案[3],並且證明了使用此方案後,可以和原始Paillier演算法保持相同的安全性。
在使用g = n + 1後,實現金鑰生成和加密過程的效能提升。
金鑰生成:
把g = n + 1帶入μ的生成公式,得
μ = L(gλ mod n2)-1 mod n = L((n + 1)}λ mod n2)}-1 mod n = L((1 + λ * n) mod n2)-1 mod n = λ-1 mod n
μ 生成可以直接取λ 對 n的模反元素。
加密:
把g = n+1,帶入加密公式,得c = gmrn mod n2 = (n + 1)mrn mod n2 = (n * m + 1) * rn mod n2
加密過程把計算g的m次冪的操作,變成了簡單的乘法操作:
c = (n*m+1)*rn mod n2
2.4.2 高階冪運算最佳化
在最佳化了原始Paillier加密過程的gm冪運算後,加密操作中最耗效能的操作就是對rn高階冪函式的計算。2010年,Ivan Damg˚ard, Mads Jurik 和 Jesper Buus Nielsen給出了最佳化rn這個高階冪函式計算的方案[5],並證明了使用此方案後,可以和原始Paillier演算法保持相同的安全性。
金鑰生成:
要求p q 3 (mod 4), 且gcd(p – 1, q – 1) = 2.
λ = (p - 1)(q - 1) / 2
選擇一個隨機數x,且$x Zn*, h = -x2 mod n。
選擇一個自然數s,對於原版Paillier, 相當於為s設定了s = 1
hs = hns mod ns + 1
最佳化後,新的公鑰為public-key=(n, hs)
加密:
生成一個隨機數α,, 其中k是金鑰長度
最佳化後使用如下公式進行加密操作:
c = (n * m + 1)hsα mod ns + 1
因為取值α << n, 使得加密計算過程中,計算hsα的效能,優於計算rn的效能.
2.4.3 使用中國剩餘定理
用中國剩餘定理,可以把諸如 ax mod n形式的高階冪函式取模操作,分解為低階冪函式對n的因子取模的操作。
由於分解操作,需要使用到生成私鑰的關鍵資料p和q,所以使用中國剩餘定理對高階冪函式取模操作的最佳化,只能應用在使用私鑰的解密操作中。
解密:
使用中國剩餘定理最佳化解密演算法的步驟如下:
定義分解因子p和q對應的函式 Lp(x) = (x-1) / p, Lq(x) = (x - 1) / q
計算hp (p - 1) * q (mod p), hq (q - 1) * p (mod q)
計算mp = Lp(cp - 1 mod p2) hp mod p, mq = Lq(cq - 1 mod q2) hq mod q
計算m = CRT(m_p, m_q) mod n, m 即為使用中國剩餘定理最佳化的解密後的明文
2.4.4 效能最佳化對比
演算法使用Python程式碼實現,金鑰長度取2048bit, s引數取1,取模之前的冪運算均採用模冪方法最佳化。其中後面的最佳化均是在前面最佳化的基礎上進行的最佳化。
原版 | 引數g最佳化 | 冪運算最佳化(s=1) | 中國剩餘定理(s =1) | |
---|---|---|---|---|
金鑰生成 | 98.412 | 77.913 | 169.511 | 169.812 |
加密 | 20.043 | 9.107 | 4.704 | 4.704 |
解密 | 11.692 | 8.859 | 8.859 | 2.705 |
從表1和圖2中可以看到,經過引數g最佳化和冪運算最佳化後,加密運算的效率較之原版方案提升了約3.26倍。經過使用中國剩餘定理最佳化後,解密運算的效率較之原版方案提升了約3.32倍。在金鑰生成上,使用了冪運算最佳化後,金鑰生成的時間增加了約42%。考慮到金鑰生成運算的次數,通常遠小於加解密運算的次數,相比之下金鑰生成的效能損失通常可以忽略不計。
2.5 來自多方計算的安全問題
在上面Alice和Bob使用Paillier同態加密來進行分散式梯度值計算時,Alice持有私鑰,對Bob加密後的梯度資料,進行同態運算,並生成最終分散式梯度計算的梯度值。這裡有一個問題,在這個場景下,雖然Alice沒有獲得Bob的直接或加密後的梯度資料,但Alice知道最終的梯度值,這使得Alice可以根據差分結果,猜測出Bob本次計算的梯度資料,從而產生安全問題。
在多方安全計算中,由於同態計算的演算法,不一定能夠提供安全保證,使得我們必須應對計算過程中可能出現的安全問題。對於Alice和Bob的計算分散式梯度值的場景,可以根據當前的學習率引入合適的擾動資料來規避差分隱私問題,或者參與計算的多方至少是三方。
3 功能擴充套件
在原版Paillier中,明文m的定義域是[0, n)。在Alice和Bob的進行的分散式機器學習場景中,需要能夠對浮點和負數進行加密運算。在實際應用中,如果只能加密正整數,那麼Paillier的應用場景會受到較大的限制。實際上,計算機的布林電路只能對0和1的二進位制資料進行計算,無論是浮點數還是負數,甚至是整數的計算,都是透過特定的計算規則來完成的,我們可以參照這些規則,實現Paiiler演算法對浮點數和負數的支援。
3.1 浮點數支援
IEEE 754標準中,單精度浮點表示採用1位符號,8位階碼和23位分數。
對於浮點數,我們可以將所有參與計算的數值,編碼為更小的單位,在計算完成後再解碼。比如浮點數3.14,可以預先乘以100, 即3.14 = 314 * 10-2。之後計算過程中,整數部分和指數部分分別運算。
在計算機中,浮點數以符號位(Sign),階碼(Exponent)和分數(Fraction)三部分聯合來標識,底數(Base)固定為2。我們仍舊以3.14為例,3.14 = 0.785 * 22 = [11.0010001]2。實際使用中,為了表示更大的範圍,分數部分的取值範圍要求 1 <= fraction < 2, 這樣保證了分數部分的首位總是為1,這樣小數部分可以隱藏首位的1。為了使階碼可以使用負數,浮點標準規定了指數部分使用一個偏移值(Bias),這樣浮點數的值的計算方式為:
x = -1sign * (1 + Fraction) * 2(Exponent - Bias)
在擴充Paillier演算法定義域到浮點數時,浮點數各個部分的計算,均需程式來實現。這裡我們參照浮點數的表示法,且不使用隱藏位,假設給定Bias=8,那麼3.14就可以編碼為(E = 2,F=200(0.785 * 28))。我們再把整數2,經過同樣的編碼,得到(E=2, F=128)
在Paillier計算中,由於階碼相同,3.14 + 2 = (E = 2, F = 328)。最終執行解碼,得到328 * 2-8} * 22 = 5.125。計算結果存在較大的精度損失,實際應用中,我們可以透過增大Bias的值,來提升計算結果的精度。
對於同態數乘來說,由於不需要階碼對齊,那麼只需對F值做數乘,即可得到正確的結果。同樣對於3.14, 乘以3後得到(E = 2, F = 600),之後解碼,得到600 * 2-8 * 22 = 9.375。同樣由於示例中Bias取值問題,計算結果出現了較大的誤差。
3.2 負數支援
在計算機中,負數是以補碼的方式標識的。整數和負數相加,是透過溢位來使得計算結果符合預期值,如果我們把負數的位元組擴充,那麼會得到一個原有位元組空間的最大值和對應負數之和的正數,在此基礎上使用此正數進行四則運算,之後再縮容到原來的位元組空間,那麼得到的仍舊是正確的結果。
類似的,為了使Paillier能夠支援負數的計算,我們可以給負數m_1增加一個週期值n, 來把負數m_1轉換為正整數。那麼對於同態加運算來說,計算結果c=ENC(m1 + m2 + n)。
此時同態加計算的結果為:
當 m1 + m2 >= 0時,DEC(c) = m1 + m2
當-n <= m1 + m2 < 0時, DEC(c) = m1 + m2 + n
當m1 + m2 < -n 時,計算結果不正確
同態數乘的計算結果為:
當k * m1 >= 0 , 時DEC(c) = k * m1
當-n <= k * m1 < 0時,DEC(c) = k * m1 + n
當k * m1 < -n時,計算結果不正確
為了統一以上出現的各種場景,我們可以做如下限定:
運算元在參與同態計算前對n取模,用來統一正數可以直接參與計算,負數則需要補n再進行計算的問題。
設定運算元的最大值MAX_VALUE,比如32位整型的最大值。並使得n的取值大於3 * MAX_VALUE,這樣使得對於合法的m1和m2,不存在m1+ m2 < -n的場景,且m1 + m1 < 0時,計算結果總是大於MAX_VALUE。
至此,我們可以使用統一的規則,來處理負數參與同態運算時的各種場景。
4 主要公鑰加密演算法對比
Paillier,RSA和ELGamal演算法均為典型的基於公鑰的加密演算法,我們從功能指標和效能指標兩個方向,來對比這些加密演算法的區別和聯絡。
4.1 功能指標對比
Paillier | RSA | ELGamal | |
---|---|---|---|
安全基礎 | 複合剩餘類問題 | 大數分解問題 | 離散對數問題 |
語義安全 | 是 | 否(可以使用諸如OAEP的隨機填充演算法來達到語義安全的效果) | 是 |
公鑰加密/私鑰解密 | 支援 | 支援 | 支援 |
私鑰簽名/公鑰驗籤 | 不支援(可以實現更為複雜的門限簽名) | 支援 | 支援 |
演算法複雜程度(非時間複雜度) | 高 | 低 | 中 |
同態計算 | 同態加,同態數乘 | 同態乘 | 同態乘 |
4.2 效能指標對比
對4096-bit大小的明文進行加密:
Paillier | RSA | ELGamal | ||||
---|---|---|---|---|---|---|
s=1 | s=2 | s=3 | s=4 | |||
金鑰長度 | 4096 | 2048 | 1366 | 1024 | 4096 | 4096 |
密文大小 | 8192 | 6144 | 5462 | 5120 | 4096 | 8192 |
膨脹係數 | 2 | 1.5 | 1.33 | 1.25 | 1 | 2 |
對1-bit大小的資料進行加密和解密運算,統計資料單位為ms。
Paillier | RSA | ELGamal | |||
---|---|---|---|---|---|
s=1 | s=2 | s=4 | |||
加密 | |||||
1024 | 0.262 | 0.284 | 0.387 | 0.002 | 0.264 |
2048 | 0.955 | 1.067 | 1.480 | 0.004 | 0.967 |
4096 | 3.705 | 4.146 | 5.755 | 0.008 | 3.711 |
8192 | 14.507 | 16.244 | 22.617 | 0.015 | 14.467 |
解密 | |||||
1024 | 0.149 | 0.153 | 0.214 | 0.039 | 0.132 |
2048 | 0.503 | 0.559 | 0.780 | 0.132 | 0.489 |
4096 | 1.898 | 2.128 | 2.958 | 0.486 | 1.865 |
8192 | 7.349 | 8.244 | 11.461 | 1.854 | 7.286 |
5 同態加密的應用
同態加密使得雲端計算和人工智慧時代的資料,演算法,算力可以解耦,對於一家企業來說,無需完整具備以上三個條件也可以在雲端計算和人工智慧時代獲取一席之地。
我們可以假設這樣一個場景,協和醫院擁有大量的高價值醫療行業資料,並想透過京東雲服務的雲端計算和人工智慧來進行資料分析。在同態加密之前,能夠採取的方案要麼時協和將隱私資料的明文提供給京東雲端計算來進行資料分析,使得隱私資料外洩;要麼是京東為持有敏感資料的企業,採用傳統的On-Premise模式,放棄雲端計算帶來的各種便利。而同態加密,使得協和可以以安全的方式向京東雲服務提供隱私資料,京東雲端計算也可以在不解密的情況下使用這些資料進行資料分析,從而解決了這個兩難問題。依靠同態加密,使得基於數理統計相關的演算法和資料可以獨立開來,既可以依託於雲端計算的演算法和算力,又完美地保護了客戶的隱私資料。
同態加密的應用不止限於簡單的資料分析,在以下很多場景下都有其用武之地:
隱私集合求交
在隱私集合求交中,其中一個參與方構建如下的多項式
其中ri為隨機數,ci 是另一參與方提供的求交資料的同態加密之後的密文,x是己方持有的求交資料同態加密後的密文。如果ci 和x中任一資料相同,那麼得到的di,在解密後的值為0,否則不為0。
聯邦學習
在聯邦學習過程中,聯邦學習的參與者之間使用同態加密傳遞學習過程中的中間資訊,從而避免資訊接收方推斷出其它參與聯邦學習的參與方的私密資訊,保證了聯邦學習過程中的資訊保安性。
門限簽名
門限簽名是秘密共享和數字簽名技術的一種結合。傳統的簽名技術,私鑰被儲存在一個可信的中心節點中。(t, n)門限簽名方案,把秘密分發給n個成員,組成一個簽名群體。在這個群體中,單個成員不再具有簽名的許可權,只有集齊了t個或更多誠實的成員,才能對資料進行數字簽名,這個的t即是門限值。門限簽名防止了單箇中心節點導致的秘密洩露或職權濫用,在證照頒發,多方身份識別,資產託管,電子投票等諸多領域具有應用價值。
聯合風控
在銀行或金融機構進行風險評估時,需要大量關於企業和個人的隱私資訊。對於參與聯合風控的資料提供方來說,不希望自身的隱私資料暴露給銀行或金融機構,而銀行和金融機構也不希望風控規則在三方環境下執行。參與聯合風控的資料提供方,透過對自身資料進行同態加密,使得銀行或金融機構能夠正常進行風險評估,同時又不洩露資料提供方的資料資訊。
同態加密技術被譽為隱私計算技術“皇冠上的明珠”,這項技術使得我們在不需要信賴雲服務提供商的前提下,使用雲服務提供商的計算和儲存能力,從而解決了雲端計算中的隱私資料保護問題。同態加密技術的特點,使其在數字貨幣,金融應用,醫療保健等領域有著非常廣泛的應用場景和實踐價值。同態加密技術為雲端計算和雲端儲存在應對隱私資料時,提供了一種可靠的解決方案。對同態加密技術的關注和研究,使得企業具有更多的理論和方案,來應對和解決私密資訊的計算和儲存問題,為資料的全面互聯互通,提供了一種行之有效的解決方案。
作者:孫曉軍
參考文獻
[1] P. Paillier, “Public-key cryptosystems based on composite degree residuosity classes,” in Proceedings of Advances in Cryptology (EUROCRYPT’99),pp. 223–238, Prague, Czech Republic, May 1999.
[2] Zhu, L., Liu, Z., Han, S.: Deep leakage from gradients. In: Annual Conference on Neural Information Processing Systems (NeurIPS) (2019)
[3] D. Choi, S. Choi, and D. Won, “Paillier’s cryptosystem revisited,” in Proceedings of the 8th ACM Conference on Computer and Communications Security(CCS’01), pp. 206–214, Philadelphia, Pennsylvania, USA, Nov. 2001
[4] I. Damgard and M. Jurik. A generalization, of Paillier's Eurocrypt '99, volume 1592 of LNCS. IACR,Springer-Verlag, 1999.
[5] I. Damg˚ard, J. Jurik, and J. Nielsen, “A generalization of paillier’s public-key system with applications to electronic voting,” International Journal of Information Security, no. 9, pp. 371–385, 2010.
[6] Cao, Z. and Liu, L., "The Paillier's Cryptosystem and Some Variants Revisited." arXiv preprint arXiv:1511.05787,2015.
相關文章
- Tongsuo 支援半同態加密演算法 Paillier2022-11-24加密演算法AI
- 一種高效的同態加密方案及其應用-解讀2022-04-25加密
- 用 PHP 實現經典排序演算法2020-04-06PHP排序演算法
- 深入瞭解Rabbit加密技術:原理、實現與應用2023-11-26加密
- 京東雲開發者|提高IT運維效率,深度解讀京東雲AIOps落地實踐2022-11-01運維AI
- JavaScript實現經典排序演算法2019-04-08JavaScript排序演算法
- 經典排序演算法PHP實現2018-08-21排序演算法PHP
- 經典加密演算法入門-RSA2019-03-04加密演算法
- 解讀現代儲存系統背後的經典演算法2019-03-03演算法
- Java實現十個經典排序演算法(帶動態效果圖)2021-04-19Java排序演算法
- 經典排序演算法及其 Java 實現2018-01-17排序演算法Java
- Swift實現八種經典排序演算法2019-03-04Swift排序演算法
- 協同過濾(CF)演算法詳解和實現2016-06-24演算法
- 經典原理法則效應(轉)2013-06-17
- 開發者必讀的十大經典書籍2017-08-27
- 深入理解DES演算法:原理、實現與應用2024-04-14演算法
- HTML程式碼混淆技術:原理、應用和實現方法詳解2023-12-05HTML
- AQS:JAVA經典之鎖實現演算法(一)2019-01-21AQSJava演算法
- 線段樹詳解 (原理,實現與應用)2015-09-09
- BabaSSL:支援半同態加密演算法 EC-ElGamal2022-03-09加密演算法GAM
- 解讀Promise內部實現原理2017-12-13Promise
- 十大經典排序演算法動畫解析和 Java 程式碼實現2019-01-09排序演算法動畫Java
- C++經典書籍解讀2010-11-23C++
- 機器學習10種經典演算法的Python實現2019-08-13機器學習演算法Python
- 經典排序演算法的 C語言 | Java 實現2018-08-02排序演算法C語言Java
- 經典演算法之基數排序兩種實現2017-12-07演算法排序
- 利用京東雲Web應用防火牆實現Web入侵防護2022-09-08Web防火牆
- 重讀經典《作業系統:設計與實現》2024-03-03作業系統
- 從原始碼解讀Category實現原理2018-03-06原始碼Go
- 解讀神經形態計算:從基本原理到實驗驗證2017-06-16
- 一種適用於RFID讀寫器的加密演算法及其實現2017-11-10加密演算法
- AQS:JAVA經典之鎖實現演算法(二)-Condition2019-02-28AQSJava演算法
- Eclipse經典實用操作2017-09-12Eclipse
- C# Span 原始碼解讀和應用實踐2020-11-14C#原始碼
- 僅花一天時間,開發者重製 32 年前經典 Mac 應用!2024-08-19Mac
- 經典演算法2017-04-05演算法
- 《Redis深度歷險:核心原理和應用實踐》讀書筆記2020-12-21Redis筆記
- 看的見的演算法 7個經典應用詮釋演算法精髓2019-05-22演算法