我正在開發一個加密項目。我們需要使用NTL的大數字庫,特別是使用庫的CRT函數來生成公鑰。該庫的CRT函數不使用標準的中國剩餘定理算法;它是一個修改版本,我無法準確理解它是如何工作的。理解/使用改進的CRT功能時遇到的問題
CRT(A,B,C,d)
從我可以告訴CRT如果A%B == C%d返回1,但它並非總是如此,如下面的結果,我集合b = 5,d = 6且a = c是1-6之間的隨機整數:
A%b:3 C%d:3 CRT:1
A%b:0 C%d :5 CRT:1
A%b:2 C%d:2 CRT:0
A%b:1個C%d:1 CR T:0
A%B:4 C%d:4 CRT:1
A%B:1個C%d:0 CRT:1
下面是從CRT函數的代碼圖書館。 ZZ是用於表示大量數據的庫特定類型。
long CRT(ZZ& gg, ZZ& a, const ZZ& G, const ZZ& p){
long modified = 0;
ZZ g;
if (!CRTInRange(gg, a)) {
modified = 1;
ZZ a1;
rem(g, gg, a); // g = gg%a
RightShift(a1, a, 1); // a1 = (a >> 1)
if (g > a1) sub(g, g, a);
}
else
g = gg;
ZZ p1;
RightShift(p1, p, 1);
ZZ a_inv;
rem(a_inv, a, p);
InvMod(a_inv, a_inv, p); // a_inv = a_inv^{-1} mod p, 0 <= a_inv < p
ZZ h;
rem(h, g, p);
SubMod(h, G, h, p); // return h = (G-h)%p
MulMod(h, h, a_inv, p); // return h = (h*a_inv)%p
if (h > p1)
sub(h, h, p);
if (h != 0) {
modified = 1;
ZZ ah;
mul(ah, a, h);
if (!IsOdd(p) && g > 0 && (h == p1))
sub(g, g, ah);
else
add(g, g, ah);
}
mul(a, a, p);
gg = g;
return modified;
}
以下是圖書館提供的唯一信息。離散數學我不擅長。任何人都可以用通俗的話來解釋這個函數的功能嗎?
中國殘留。
該版本新增至v3.7,並且明顯比以前的版本更簡單,更快速地使用 。
該函數作爲輸入G,A,G,P, 使得> 0,0 < = G < p和GCD(A,P)= 1 它計算一個」 = A * P和g',使得 * g'= g(mod a); * g'= G(mod p); * -a'/ 2 < g'< = a'/ 2。 然後設置g:= g'和a:= a',並且如果g已經改變則返回1。
在正常使用情況下,輸入值g滿足-a/2 < g < = a/2; 然而,這在早期版本中沒有記錄或執行,因此爲了保持向後兼容性,在g上沒有限制 。這個例程運行得更快,但是,如果-a/2 < = a/2, 並且例程所做的第一件事是使條件 成立。
此外,在正常使用情況下,a和p都是奇數;然而,例程 仍然會工作,即使情況並非如此。
該例程基於以下簡單事實。設置-a/2 < g < = a/2,並且讓h滿足 * g + a h = G(mod p); * -p/2 < h < = p/2。此外,如果p = 2 * h並且g> 0,則設置 g':= g-a h;否則,設 g':= g + a h。 然後g'如此定義滿足上述要求。 看到g滿足同餘條件是微不足道的。 唯一要檢查的是「平衡」條件 -a'/ 2 < g'< = a'/ 2也成立。
我真的很討厭縮寫:陰極射線管(終端)(CRT),C運行時間庫。 – 2014-10-31 19:51:04
我把它寫在第一段:中國剩餘定理 – nhoughto 2014-10-31 20:35:17