Professional Documents
Culture Documents
Më ®Çu.......................................................................3
Ch¬ng i C¬ së to¸n häc...............................................5
1.Lý thuyÕt th«ng tin................................ ......................5
1.1 Entropy.................................................. ................5
1.2 Tèc ®é cña ng«n ng÷. (Rate of Language)............6
1.3 An toµn cña hÖ thèng m· ho¸................................7
2.Lý thuyÕt ®é phøc t¹p...................... ...........................9
3.Lý thuyÕt to¸n häc.................................... .................11
3.1 Modular sè häc...................................................11
3.2 Sè nguyªn tè........................................... .............13
3.3 ¦íc sè chung lín nhÊt. ..........................................13
3.4 Sè nghÞch ®¶o Modulo.......................................14
3.5 Ký hiÖu La gr¨ng (Legendre Symboy)..................16
3.6 Ký hiÖu Jacobi (Jacobi Symboy).......................... ..17
3.7 §Þnh lý phÇn d trung hoa............................. ........19
3.8 §Þnh lý Fermat............................... ......................20
4. C¸c phÐp kiÓm tra sè nguyªn tè...............................20
4.1 Soloway-Strassen................................................21
4.2 Rabin-Miller....................................................... ...22
4.3 Lehmann............................................................. .22
4.4 Strong Primes...................... ................................23
Ch¬ng II MËt m·.......................................... ...............25
1. Kh¸i niÖm c¬ b¶n.......................... ...........................25
2. Protocol ................................................................... .27
2.1 Giíi thiÖu Protocol........................... .....................27
2.2 Protocol mËt m·...................................................28
2.3 Môc ®Ých cña Protocol....................... .................28
2.4 TruyÒn th«ng sö dông hÖ mËt m· ®èi xøng........30
2.5 TruyÒn th«ng sö dông hÖ mËt m· c«ng khai........31
3. Kho¸...................................................................... ....35
3.1 §é dµi kho¸..........................................................35
3.2 Qu¶n lý kho¸ c«ng khai................................... .....37
4. M· dßng, m· khèi (CFB, CBC) ....................................39
4.1 M« h×nh m· ho¸ khèi. ...................... ...................39
4.1.1 M« h×nh d©y truyÒn khèi m· ho¸.................39
4.1.2 M« h×nh m· ho¸ víi th«ng tin ph¶n håi..........42
4.2 M« h×nh m· ho¸ dßng. .................................... ....42
Khoa C«ng NghÖ Th«ng Tin
Më ®Çu
ThÕ kû XXI thÕ kû c«ng nghÖ th«ng tin, th«ng tin ®· vµ
®ang t¸c ®éng trùc tiÕp ®Õn mäi mÆt ho¹t ®éng kinh tÕ
x· héi cña hÇu hÕt c¸c quèc gia trªn thÕ giíi. Th«ng tin cã
mét vai trß hÕt søc quan träng, bëi vËy chóng ta ph¶i lµm
sao ®¶m b¶o ®îc tÝnh trong suèt cña th«ng tin nghÜa lµ
th«ng tin kh«ng bÞ sai lÖch, bÞ thay ®æi, bÞ lé trong qu¸
tr×nh truyÒn tõ n¬i göi ®Õn n¬i nhËn.
Víi sù ph¸t triÓn rÊt nhanh cña c«ng nghÖ m¹ng m¸y tÝnh
®Æc biÖt lµ m¹ng INTERNET th× khèi lîng th«ng tin ngµy
cµng chuyÓn t¶i nhiÒu h¬n. Nh÷ng tËp ®oµn c«ng
nghiÖp, nh÷ng c«ng ty ®a quèc gia, thÞ trêng chøng
kho¸n tiÕn hµnh xö lý vµ truyÒn nhËn nh÷ng th«ng tin
®¾t gi¸, nh÷ng phiªn giao dÞch hay mua b¸n cæ phiÕu,
tr¸i phiÕu ®Òu ®îc tiÕn hµnh qua m¹ng. Giê ®©y víi sù
t¨ng trëng nhanh cña c¸c siªu thÞ ®iÖn tö, th¬ng m¹i
®iÖn tö th× hµng ngµy cã mét khèi lîng tiÒn rÊt lín ®îc lu
chuyÓn trªn m¹ng toµn cÇu INTERNET, vÊn ®Ò khã kh¨n
®Æt ra lµ lµm sao gi÷ ®îc th«ng tin bÝ mËt vµ gi÷ cho
tiÒn ®Õn ®óng ®îc ®Þa chØ cÇn ®Õn.
B¹n sÏ ra sao nÕu nh b¹n göi th cho mét ngêi b¹n nhng l¹i
bÞ mét kÎ l¹ mÆt nµo ®ã xem trém vµ söa ®æi néi dung
bøc th tr¸i víi chñ ý cña b¹n, tÖ h¹i h¬n n÷a lµ khi b¹n ký
mét hîp ®ång, göi th«ng qua m¹ng vµ l¹i bÞ kÎ xÊu söa
®æi nh÷ng ®iÒu kho¶n trong ®ã, vµ sÏ cßn nhiÒu ®iÒu
t¬ng tù nh vËy n÷a ... HËu qu¶ sÏ nh thÕ nµo nhØ ? B¹n bÞ
ngêi kh¸c hiÓu nhÇm v× néi dung bøc th bÞ thay ®æi, cßn
X©y dùng th viÖn c¸c hµm m· ho¸.
Khoa C«ng NghÖ Th«ng Tin
1.1 Entropy
Lý thuyÕt th«ng tin ®îc ®Þnh nghÜa lµ khèi lîng th«ng tin
trong mét th«ng b¸o nh lµ sè bÝt nhá nhÊt cÇn thiÕt ®Ó
m· ho¸ tÊt c¶ nh÷ng nghÜa cã thÓ cña th«ng b¸o ®ã.
VÝ dô, trêng ngay_thang trong mét c¬ së d÷ liÖu
chøa kh«ng qu¸ 3 bÝt th«ng tin, bëi v× th«ng tin t¹i ®©y
cã thÓ m· ho¸ víi 3 bÝt.
X©y dùng th viÖn c¸c hµm m· ho¸.
Khoa C«ng NghÖ Th«ng Tin
000 = Sunday
001 = Monday
010 = Tuesday
011 = Wednesday
100 = Thursday
101 = Friday
110 = Saturday
111 is unused
NÕu th«ng tin nµy ®îc biÓu diÔn bëi chuçi ký tù ASCII t-
¬ng øng, nã sÏ chiÕm nhiÒu kh«ng gian nhí h¬n, nhng
còng kh«ng chøa nhiÒu th«ng tin h¬n. T¬ng tù nh trêng
gioi_tinh cña mét c¬ së d÷ liÖu chøa chØ 1 bÝt th«ng tin,
nã cã thÓ lu tr÷ nh mét trong hai x©u ký tù ASCII : Nam,
N÷.
Khèi lîng th«ng tin trong mét th«ng b¸o M lµ ®o bëi
Entropy cña th«ng b¸o ®ã, ký hiÖu bëi H(M). Entropy cña
th«ng b¸o gioi_tinh chØ ra lµ 1 bÝt, ký hiÖu H(gioi_tinh) =
1, Entropy cña th«ng b¸o sè ngµy trong tuÇn lµ nhá h¬n
3bits.
Trong trêng hîp tæng qu¸t, Entropy cña mét th«ng b¸o lµ
log2n, víi n lµ sè kh¶ n¨ng cã thÓ.
H(M) = log2n
trong trêng hîp nµy N lµ ®é dµi cña th«ng b¸o. Tèc ®é cña
tiÕng Anh b×nh thêng cã mét vµi gi¸ trÞ gi÷a 1.0 bits/ch÷
c¸i vµ 1.5 bits/ch÷ c¸i, ¸p dông víi gi¸ trÞ N rÊt lín.
Tèc ®é tuyÖt ®èi cña ng«n ng÷ lµ sè bits lín nhÊt, chóng
cã thÓ m· ho¸ trong mçi ký tù. NÕu cã L ký tù trong mét
ng«n ng÷, th× tèc ®é tuyÖt ®èi
lµ :
R = log2L
§©y lµ sè Entropy lín nhÊt cña mçi ký tù ®¬n lÎ. §èi víi
tiÕng Anh gåm 26 ch÷ c¸i, tèc ®é tuyÖt ®èi lµ log 226 =
4.7bits/ch÷ c¸i. SÏ kh«ng cã ®iÒu g× lµ ng¹c nhiªn ®èi víi
tÊt c¶ mäi ngêi r»ng thùc tÕ tèc ®é cña tiÕng Anh nhá
h¬n nhiÒu so víi tèc ®é tuyÖt ®èi.
t¹p cho biÕt nÕu liÖu chóng cã thÓ bÞ b¹i lé tríc khi vò trô
xôp ®æ hay kh«ng.
§é phøc t¹p thêi gian cña thuËt to¸n lµ hµm sè víi ®é dµi
®Çu vµo. ThuËt to¸n cã ®é phøc t¹p thêi gian f(n) ®èi víi
mäi n vµ ®é dµi ®Çu vµo n, nghÜa lµ sù thùc hiÖn cña
thuËt to¸n lín h¬n f(n) bíc.
§é phøc t¹p thêi gian thuËt to¸n phô thuéc vµo m« h×nh
cña c¸c thuËt to¸n, sè c¸c bíc nhá h¬n nÕu c¸c ho¹t ®éng
®îc tËp chung nhiÒu trong mét bíc.
C¸c líp cña thuËt to¸n, thêi gian ch¹y ®îc chØ râ nh hµm sè
mò cña ®Çu vµo lµ "kh«ng cã kh¶ n¨ng thùc hiÖn ®îc".
C¸c thuËt to¸n cã ®é phøc t¹p gièng nhau ®îc ph©n lo¹i
vµo trong c¸c líp t¬ng ®¬ng. VÝ dô tÊt c¶ c¸c thuËt to¸n
cã ®é phøc t¹p lµ n3 ®îc ph©n vµo trong líp n3 vµ ký hiÖu
bëi O(n3). Cã hai líp tæng qu¸t sÏ ®îc chØ dÉn lµ líp P vµ líp
NP.
C¸c thuËt to¸n thuéc líp P cã ®é phøc t¹p lµ hµm ®a thøc
cña ®Çu vµo. NÕu mçi bíc tiÕp theo cña thuËt to¸n lµ duy
nhÊt th× thuËt to¸n gäi lµ ®¬n ®Þnh. TÊt c¶ thuËt to¸n
thuéc líp P ®¬n ®Þnh cã thêi gian giíi h¹n lµ P_time, ®iÒu
nµy cho biÕt chóng sÏ thùc hiÖn trong thêi gian ®a thøc, t-
¬ng ®¬ng víi ®é phøc t¹p ®a thøc trong ®é dµi ®Çu vµo.
ThuËt to¸n mµ ë bíc tiÕp theo sù tÝnh to¸n ph¶i lùa chän
gi¶i ph¸p tõ nh÷ng giíi h¹n gi¸ trÞ cña ho¹t ®éng gäi lµ
kh«ng ®¬n ®Þnh. Lý thuyÕt ®é phøc t¹p sö dông c¸c m¸y
®Æc biÖt m« t¶ ®Æc ®iÓm b»ng c¸ch ®a ra kÕt luËn bëi
c¸c chuÈn. M¸y Turinglµ mét m¸y ®Æc biÖt, m¸y ho¹t
®éng trong thêi gian rêi r¹c, t¹i mét thêi ®iÓm nã n»m
trong kho¶ng tr¹ng th¸i ®Çy ®ñ sè cña tÊt c¶ c¸c tr¹ng
th¸i cã thÓ lµ h÷u h¹n. Chóng ta cã thÓ ®Þnh nghÜa hµm
®é phøc t¹p thêi gian kÕt hîp víi m¸y Turing A.
fA(n) = max{m/A kÕt thóc sau m bíc víi ®Çu vµo w =
n3 }
Chóng ta gi¶ sö r»ng A lµ tr¹ng th¸i kÕt thóc ®èi víi tÊt c¶
c¸c ®Çu vµo, vÊn ®Ò sÏ trë nªn khã kh¨n h¬n nÕu c¸c
tr¹ng th¸i kh«ng n»m trong P . M¸y Turing kh«ng ®¬n
®Þnh ho¹t ®éng trong thuËt to¸n NP. M¸y Turing kh«ng
®¬n ®Þnh cã thÓ cã mét vµi tr¹ng th¸i chÝnh x¸c. S(w) lµ
tr¹ng th¸i ®o sù thµnh c«ng ng¾n nhÊt cña thuËt to¸n,
(NghÜa lµ sù tÝnh to¸n dÉn ®Õn tr¹ng th¸i cuèi cïng)
Hµm sè ®é phøc t¹p thêi gian cña m¸y Turing kh«ng ®¬n
®Þnh A ®îc ®Þnh nghÜa :
fA(n)=max{1,m/s(w) cã m bíc ®èi víi w/w=n},
ë mçi bíc m¸y Turing kh«ng ®¬n ®Þnh bè trÝ nhiÒu b¶n
sao cña chÝnh nã nh cã mét vµi gi¶i ph¸p vµ tÝnh to¸n
®éc lËp víi mäi lêi gi¶i.
C¸c thuËt to¸n thuéc líp NP lµ kh«ng ®¬n ®Þnh vµ cã thÓ
tÝnh to¸n trªn m¸y Turing kh«ng ®¬n ®Þnh trong thêi
gian P.
x=-x;
if(y<0)
y=-y ;
g=y;
while(x>0){
g=x;
x=y%x;
y=g;
}
return g;
}
4 × x ≡ 1 mod 7
Ph¬ng tr×nh trªn t¬ng ®¬ng víi t×m x vµ k sao cho
4x = 7k+1
víi ®iÒu kiÖn lµ c¶ x vµ k ®Òu lµ sè nguyªn.
VÊn ®Ò chung ®Æt ra t¹i ®©y lµ t×m x sao cho
1 = (a × x) mod n
cã thÓ viÕt l¹i nh sau :
a-1 ≡ x(mod n )
Sù thu nhá vÊn ®Ò Modulo lµ rÊt khã gi¶i quyÕt. §«i khi nã
lµ mét vÊn ®Ò, nhng ®«i khi l¹i kh«ng ph¶i vËy.
VÝ dô : nghÞch ®¶o cña 5 modulo 14 lµ 3 bëi
5 × 3 = 15 ≡ 1 (mod 14).
Trong trêng hîp chung a-1 ≡ x (mod n) chØ cã duy nhÊt mét
gi¶i ph¸p nÕu a vµ n lµ mét cÆp sè nguyªn tè. NÕu a vµ n
kh«ng ph¶i lµ cÆp sè nguyªn tè, th× a-1 ≡ x (mod n) kh«ng
cã gi¶i ph¸p nµo. ThuËt to¸n Euclid cã thÓ tÝnh ra ®îc sè
nghÞch ®¶o cña sè Modulo n, ®«i khi thuËt to¸n nµy cßn
gäi lµ thuËt to¸n Euclid më réng. Sau ®©y thuËt to¸n ®îc
m« t¶ trong ng«n ng÷ C.
tn = *un-vn*q;
*un = *vn;
*vn = tn;
}
while(v3>0){
q=u3/v3;
Update(&u1,&v1,q);
Update(&u3,&v,q);
}
*u1_out=u1;
*u2_out=(u3-u1*u)/v;
return u3;
}
ThuËt to¸n nµy tÝnh ra sè Jacobi tuÇn hoµn theo c«ng thøc
sau :
1. J(1,k) = 1
2. J(a×b,k) = J(a,k) × J(b,k)
3. J(2,k) =1 NÕu (k2-1)/8 lµ chia hÕt
J(2,k) =-1 trong c¸c trêng hîp kh¸c.
4. J(b,a) = J((b mod a),a)
5. NÕu GCD(a,b)=1 :
a. J(a,b) × J(b,a) = 1 nÕu (a-1)(b-1)/4 lµ chia hÕt.
b. J(a,b) × J(b,a) = -1 nÕu (a-1)(b-1)/4 lµ cßn d.
Sau ®©y lµ thuËt to¸n trong ng«n ng÷ C :
int jacobi(int a,int b)
{
int a1,a2;
if(a>=b)
a%=b;
if(a==0)
return 0;
if(a==1)
return 1;
if(a==2)
if(((b*b-1)/8)%2==0)
return 1;
else
return -1;
if(a&b&1) (c¶ a vµ b ®Òu lµ sè d)
if(((a-1)*(b-1)/4)%2==0)
return +jacobi(b,a);
else
return -jacobi(b,a);
if(gcd(a,b)==1)
if(((a-1)*(b-1)/4)%2==0)
return +jacobi(b,a);
else
return -jacobi(b,a);
factor2(a,&a1,&a2);
return jacobi(a1,b) * jacobi(a2,b);
}
NÕu p lµ sè nguyªn tè cã c¸ch tèt h¬n ®Ó tÝnh sè Jacobi
nh díi ®©y :
1. NÕu a=1 th× J(a/p)=1
2. NÕu a lµ sè chai hÕt, th× J(a,p)=J(a/2,p) × (-1)(p^2 –
1)/8
int n;
modulus = 1;
for ( i=0; i<r:++i )
modulus *=m[i];
n=0;
for ( i=0; i<r:++i )
{
n+=u[i]*modexp(modulus/m[i],totient(m[i]),m[i]);
n%=modulus;
}
return n;
}
4.1 Soloway-Strassen
Soloway vµ Strassen ®· ph¸t triÓn thuËt to¸n cã thÓ kiÓm
tra sè nguyªn tè. ThuËt to¸n nµy sö dông hµm Jacobi.
ThuËt to¸n kiÓm tra sè p lµ sè nguyªn tè :
1. Chän ngÉu nhiªn mét sè a nhá h¬n p.
2. NÕu íc sè chung lín nhÊt gcd(a,p) ≠ 1 th× p lµ hîp
sè.
3. TÝnh j = a(p-1)/2 mod p.
4. TÝnh sè Jacobi J(a,p).
5. NÕu j ≠ J(a,p), th× p kh«ng ph¶i lµ sè nguyªn tè.
6. NÕu j = J(a,p) th× nãi p cã thÓ lµ sè nguyªn tè víi
ch¾c ch¾n 50%.
LÆp l¹i c¸c bíc nµy n lÇn, víi nh÷ng n lµ gi¸ trÞ ngÉu nhiªn
kh¸c nhau cña a. PhÇn d cña hîp sè víi n phÐp thö lµ kh«ng
qu¸ 2n.
Thùc tÕ khi thùc hiÖn ch¬ng tr×nh, thuËt to¸n ch¹y víi tèc
®é nhanh.
4.2 Rabin-Miller
ThuËt to¸n nµy ®îc ph¸t triÓn bëi Rabin, dùa trªn mét
phÇn ý tëng cña Miller. Thùc tÕ nh÷ng phiªn b¶n cña thuËt
to¸n ®· ®îc giíi thiÖu t¹i NIST. (National Institute of
Standards and Technology).
§Çu tiªn lµ chän ngÉu nhiªn mét sè p ®Ó kiÓm tra. TÝnh b,
víi b lµ sè mò cña 2 chia cho p-1. TiÕp theo tÝnh m t¬ng
tù nh n = 1+2bm.
Sau ®©y lµ thuËt to¸n :
1. Chän mét s« ngÉu nhiªn a, vµ gi¶ sö a nhá h¬n p.
2. §Æt j=0 vµ z=am mod p.
3. NÕu z=1, hoÆc z=p-1 th× p ®· qua bíc kiÓm tra
vµ cã thÓ lµ sè nguyªn tè.
4. NÕu j > 0 vµ z=1 th× p kh«ng ph¶i lµ sè nguyªn
tè.
5. §Æt j = j+1. NÕu j < b vµ z ≠ p-1 th× ®Æt z=z2
mod p vµ trë l¹i bíc 4.
6. NÕu j = b vµ z ≠ p-1, th× p kh«ng ph¶i lµ sè
nguyªn tè.
4.3 Lehmann.
Mét ph¬ng ph¸p ®¬n gi¶n h¬n kiÓm tra sè nguyªn tè ®îc
ph¸t triÓn ®éc lËp bëi Lehmann. Sau ®©y lµ thuËt to¸n víi
sè bíc lÆp lµ 100.
1. Chän ngÉu nhiªn mét sè n ®Ó kiÓm tra.
2. Ch¾c ch¾n r»ng n kh«ng chia hÕt cho c¸c sè
nguyªn tè nhá nh 2,3,5,7 vµ 11.
Ch¬ng II MËt m·
Trong ch¬ng tríc chóng ta ®· nªu ra c¸c kh¸i niÖm c¬ b¶n
vÒ lý thuyÕt th«ng tin, vÒ ®é phøc t¹p cña thuËt to¸n, vµ
nh÷ng kh¸i niÖm c¬ b¶n vÒ to¸n häc cÇn thiÕt. Ch¬ng
nµy sÏ m« t¶ mét c¸ch tæng quan vÒ m· ho¸, bao gåm
nh÷ng kh¸i niÖm vÒ m· ho¸ th«ng tin, mét hÖ thèng m·
ho¸ bao gåm nh÷ng thµnh phÇn nµo, kh¸i niÖm protocol,
c¸c lo¹i protocol. M· ho¸ dßng lµ g×, m· ho¸ khèi lµ g×, thÕ
nµo lµ hÖ thèng m· ho¸ cæ ®iÓn, thÕ nµo lµ hÖ thèng m·
ho¸ c«ng khai. Vµ cuèi cïng lµ b»ng nh÷ng c¸ch nµo kÎ
®Þch tÊn c«ng hÖ thèng m· ho¸. Nh÷ng vÊn ®Ò sÏ ®îc
®Ò cËp trong ch¬ng nµy:
♦ Kh¸i niÖm c¬ b¶n cña m· ho¸.
♦ Protocol
♦ M· dßng , m· khèi (CFB, CBC)
♦ C¸c hÖ mËt m· ®èi xøng vµ c«ng khai
♦ C¸c c¸ch th¸m m·
®å sau:
®êng truyÒn tíi ngêi nhËn sau khi nhËn ®îc b¶n m· ngêi
nhËn gi¶i m· nã ®Ó t×m hiÓu néi dung.
DÔ dµng thÊy ®îc c«ng viÖc trªn khi sö dông ®Þnh nghÜa
hÖ mËt m· :
EK( P) = C vµ DK( C )
=P
2. Protocol
cÇn thiÕt mét nghi thøc chuÈn ®Ó lµm nh÷ng viÖc gièng
nhau nh con ngêi kh«ng ph¶i suy nghÜ. NÕu b¹n ®i tõ mét
®Þa ®iÓm nµy tíi ®Þa ®iÓm kh¸c, thËm chÝ tõ quèc gia
nµy tíi quèc gia kh¸c, b¹n thÊy mét tr¹m ®iÖn tho¹i c«ng
céng kh¸c hoµn toµn so víi c¸i b¹n ®· sö dông, b¹n dÔ
dµng ®¸p øng. Nhng m¸y tÝnh th× kh«ng mÒm dÎo nh
vËy.
ThËt ng©y th¬ khi b¹n tin r»ng mäi ngêi trªn m¹ng m¸y
tÝnh lµ ch©n thËt, vµ còng thËt ng©y th¬ khi tin tëng
r»ng ngêi qu¶n trÞ m¹ng, ngêi thiÕt kÕ m¹ng lµ ch©n thËt.
HÇu hÕt sÏ lµ ch©n thËt, nhng nã sÏ lµ kh«ng ch©n khi b¹n
cÇn ®Õn sù an toµn tiÕp theo. B»ng nh÷ng protocol
chÝnh thøc, chóng ta cã thÓ nghiªn cøu nh÷ng c¸ch
mµ nh÷ng kÎ kh«ng trung thùc cã thÓ lõa ®¶o vµ
ph¸t triÓn protocol ®Ó ®¸nh b¹i nh÷ng kÎ lõa ®¶o
®ã. Protocol rÊt h÷a Ých bëi v× hä trõu tîng ho¸ tiÕn
tr×nh hoµn thµnh nhiÖm vô tõ kü thuËt, nh vËy nhiÖm vô
®· ®îc hoµn thµnh.
Sù giao tiÕp gi÷a hai m¸y tÝnh gièng nh mét m¸y tÝnh lµ
IBM PC, m¸y kia lµ VAX hoÆc lo¹i m¸y t¬ng tù. Kh¸i niÖm
trõu tîng nµy cho phÐp chóng ta nghiªn cøu nh÷ng ®Æc
tÝnh tèt cña protocol mµ kh«ng bÞ xa lÇy vµo sù thùc hiÖn
chi tiÕt. Khi chóng ta tin r»ng chóng ta cã mét protocol tèt,
th× chóng ta cã thÓ thùc hiÖn nã trong mäi ®iÒu tõ mét
m¸y tÝnh ®Õn ®iÖn tho¹i, hay ®Õn mét lß níng b¸nh
th«ng minh.
hiÖn bíc 1 lµ c«ng khai, nhng ph¶i thùc hiÖn bíc 2 bÝ mËt.
Kho¸ ph¶i ®îc gi÷ bÝ mËt tríc, trong khi, vµ sau protocol,
mÆt kh¸c th«ng b¸o sÏ kh«ng gi÷ an toµn trong thêi gian
dµi.
Chóng ta h·y cïng xem xÐt khi m¸y Client göi th«ng b¸o tíi
Server sö dông hÖ m· ho¸ c«ng khai.
1. Client vµ Server nhÊt trÝ sö dông hÖ m· hãa
c«ng khai.
2. Server göi cho Client kho¸ c«ng khai cña Server.
3. Client lÊy b¶n râ vµ m· ho¸ sö dông kho¸ c«ng
khai cña Server. Sau ®ã göi b¶n m· tíi cho
Server.
4. Server gi¶i m· b¶n m· ®ã sö dông kho¸ riªng cña
m×nh.
3. Kho¸
Tãm l¹i c©u hái ®Æt ra trong môc nµy lµ : Kho¸ nªn dµi
bao nhiªu.
Tr¶ lêi c©u hái nµy phô thuéc vµo chÝnh nh÷ng øng dông
cô thÓ cña b¹n. D÷ liÖu cÇn an toµn cña b¹n dµi bao
nhiªu ? D÷ liÖu cña b¹n trÞ gi¸ bao nhiªu ? ... ThËm chÝ
b¹n cã thÓ chØ chØ râ nh÷ng an toµn cÇn thiÕt theo c¸ch
sau.
h¬n chø kh«ng chØ lµ kho¸ c«ng khai. Nã lu tr÷ th«ng tin
vÒ Bob nh tªn, ®Þa chØ, ... vµ nã ®îc viÕt bëi ai ®ã mµ
Eva tin tëng, ngêi ®ã thêng gäi lµ CA(certifying authority).
B»ng c¸ch x¸c nhËn c¶ kho¸ vµ th«ng tin vÒ Bob. CA x¸c
nhËn th«ng tin vÒ Bob lµ ®óng vµ kho¸ c«ng khai thuéc
quyÒn së h÷u cña Bob. Eva kiÓm tra l¹i c¸c dÊu hiÖu vµ
sau ®ã c« Êy cã thÓ sö dông kho¸ c«ng khai, sù an toµn
cho Bob vµ kh«ng mét ai kh¸c biÕt. Chøng nhËn ®ãng mét
vai trß rÊt quan träng trong protocol cña kho¸ c«ng khai.
4.1.1 thÓ hiÖn c¸c bíc trong d©y truyÒn khèi m· ho¸.
Sau khi khèi b¶n râ ®îc m· ho¸, kÕt qu¶ cña sù m· ho¸ ®îc
lu tr÷ trong thanh ghi th«ng tin ph¶n håi. Tríc khi khèi tiÕp
theo cña b¶n râ ®îc m· ho¸, nã sÏ XOR víi thanh ghi th«ng
tin ph¶n håi ®Ó trë thµnh ®Çu vµo cho tuyÕn m· ho¸ tiÕp
theo. KÕt qu¶ cña sù m· ho¸ tiÕp tôc ®îc lu tr÷ trong
thanh ghi th«ng tin ph¶n håi, vµ tiÕp tôc XOR víi khèi b¶n
râ tiÕp theo, tiÕp tôc nh vËy cho tíi kÕt thóc th«ng b¸o.
Sù m· ho¸ cña mçi khèi phô thuéc vµo tÊt c¶ c¸c khèi tríc
®ã.
IO
P2 M· ho¸ E(P2 ⊕ = C2
C1)
K
P3 M· ho¸ E(P3 ⊕ = C3
C2)
K
Bé sinh Bé sinh
Bé sinh
kho¸ Bé sinh
kho¸
kho¸ kho¸
Kho¸ Ki Kho¸
Kho¸
dßng Ki Kho¸
dßng Ki
dßng
B¶n râ B¶n m· dßng
B¶n râ
B¶n râ B¶n m· B¶n râ
gèc
Ci gèc P
Pi M· ho¸ Ci Gi¶i Pii
M· ho¸ Gi¶i
m·
m·
DK( C ) = P
K1 K2
K1 K2
viÖc m· ho¸ lµ kh¸c so víi kho¸ gi¶i m·. H¬n n÷a kho¸ gi¶i
m· kh«ng thÓ tÝnh to¸n ®îc tõ kho¸ m· ho¸. Chóng ®îc gäi
víi tªn hÖ thèng m· ho¸ c«ng khai bëi v× kho¸ ®Ó m· ho¸
cã thÓ c«ng khai, mét ngêi bÊt kú cã thÓ sö dông kho¸
c«ng khai ®Ó m· ho¸ th«ng b¸o, nhng chØ mét vµi ngêi cã
®óng kho¸ gi¶i m· th× míi cã kh¶ n¨ng gi¶i m·. Trong
nhiÒu hÖ thèng, kho¸ m· ho¸ gäi lµ kho¸ c«ng khai (public
key), kho¸ gi¶i m· thêng ®îc gäi lµ kho¸ riªng (private key).
3. Lùa chän b¶n râ. Ngêi ph©n tÝch kh«ng chØ truy
cËp ®îc b¶n m· vµ kÕt hîp b¶n râ cho mét vµi b¶n
tin, nhng mÆt kh¸c lùa chän b¶n râ ®· m· ho¸. Ph-
¬ng ph¸p nµy tá ra cã kh¶ n¨ng h¬n ph¬ng ph¸p
biÕt b¶n râ bëi v× ngêi ph©n tÝch cã thÓ chän
cô thÓ khèi b¶n râ cho m· ho¸, mét ®iÒu kh¸c cã
thÓ lµ s¶n lîng th«ng tin vÒ kho¸ nhiÒu h¬n.
Gi¶ thiÕt : P1, C1 = Ek(P1), P2, C2= Ek(P2), . . . Pi,
Ci = Ek(Pi) t¹i ®©y ngêi ph©n tÝch chän
P1, P2,. . . Pi
Suy luËn : Mçi k hoÆc thuËt to¸n kÕt luËn Pi+1 tõ
Ci+1 = Ek(Pi+1)
4. M« pháng lùa chän b¶n râ. §©y lµ trêng hîp
®Æc biÖt cña lùa chän b¶n râ. Kh«ng chØ cã thÓ
lùa chän b¶n râ ®· m· ho¸, nhng hä cßn cã thÓ söa
®æi sù lùa chän c¬ b¶n kÕt qu¶ cña sù m· ho¸ lÇn
tríc. Trong trêng lùa chän b¶n m· ngêi ph©n tÝch
cã thÓ ®· chän mét khèi lín b¶n râ ®· m· ho¸, nh-
ng trong trêng hîp nµy cã thÓ chän mét khèi nhá
h¬n vµ chän c¨n cø kh¸c trªn kÕt qu¶ cña lÇn ®Çu
tiªn.
5. Lùa chän b¶n m·. Ngêi ph©n tÝch cã thÓ chän
b¶n m· kh¸c nhau ®· ®îc m· ho¸ vµ truy cËp b¶n
râ ®· gi¶i m·. Trong vÝ dô khi mét ngêi ph©n tÝch
cã mét hép chøng cí x¸o chén kh«ng thÓ tù ®éng
gi¶i m·, c«ng viÖc lµ suy luËn ra kho¸.
Cïng víi viÖc thèng kª c¸c tÇn xuÊt cña c¸c ký tù trong
tiÕng Anh, viÖc thèng kª tÇn suÊt xuÊt hiÖn thêng xuyªn
cña c¸c d·y gåm 2 hoÆc 3 ký tù liªn tiÕp nhau còng cã mét
vai trß quan träng trong c«ng viÖc th¸m m·. Sysu Deck ®a
ra 30 bé ®«i xuÊt hiÖn thêng xuyªn cña tiÕng Anh ®îc
s¾p theo thø tù gi¶m dÇn nh sau :
TÝnh h÷u dông cña c¸c phÐp thèng kª ký tù vµ c¸c d·y ký
tù ®îc ngêi ph©n tÝch m· khai th¸c triÖt ®Ó trong nh÷ng
lÇn th¸m m·. Khi thùc hiÖn viÖc th¸m m· ngêi ph©n tÝch
thèng kª c¸c ký tù trong b¶n m·, tõ ®ã so s¸nh víi b¶n
thèng kª mÉu vµ ®a ra c¸c ký tù pháng ®o¸n t¬ng tù. Ph-
¬ng ph¸p nµy ®îc sö dông thêng xuyªn vµ ®em l¹i hiÖu
qu¶ kh¸ cao.
DÔ thÊy r»ng, b¶n râ ban ®Çu cÇn ®îc biÕn ®æi mét
c¸ch thÝch hîp thµnh b¶n m·, sau ®ã ®Ó cã thÓ t¸i t¹o l¹i
b¶n râ ban ®Çu tõ chÝnh b¶n m· ®ã :
P = DB(EB(P)) (3)
mËt kB ®îc tÝnh ra b»ng c«ng thøc (5). §iÒu nµy hoµn toµn
tÝnh ®îc v× khi B biÕt ®îc cÆp sè nguyªn tè (p,q) th× sÏ
tÝnh ®îc γ(N).
Chän p vµ
q
TÝnh N=p
×q
B¶n râ gèc
P
kÎ ®Þch cã kh¶ n¨ng t×m ra ®îc gi¸ trÞ cña kB hay kh«ng
nÕu cho tríc N vµ KB. RÊt khã cã thÓ t×m ra ®îc kB tõ KB
cÇn biÕt vÒ p vµ q, nh vËy cÇn ph©n tÝch N ra thµnh thõa
sè ®Ó tÝnh p vµ q. Nhng viÖc ph©n tÝch ra thõa sè lµ mét
viÖc lµm tèn rÊt nhiÒu thêi gian, víi kü thuËt hiÖn ®¹i
ngµy nay th× cÇn tíi hµng triÖu n¨m ®Ó ph©n tÝch mét
sè cã 200 ch÷ sè ra thõa sè.
§é an toµn cña thuËt to¸n RSA dùa trªn c¬ së nh÷ng khã
kh¨n cña viÖc x¸c ®Þnh c¸c thõa sè nguyªn tè cña mét sè
lín. B¶ng díi ®©y cho biÕt c¸c thêi gian dù ®o¸n, gi¶ sö
r»ng mçi phÐp to¸n thùc hiÖn trong mét micro gi©y.
liªn kÕt ®éng DLL (Dynamic Link Library) lµ mét tËp tin th
viÖn chøa c¸c hµm. Ngêi lËp tr×nh cã thÓ gäi mét tËp tin
DLL vµo trong ch¬ng tr×nh cña hä vµ sö dông c¸c hµm
trong DLL ®ã.
DLL lµ mét th viÖn liªn kÕt ®éng víi c¸c ch¬ng tr×nh sö
dông nã, nghÜa lµ khi b¹n t¹o ra tËp tin EXE cña ch¬ng
tr×nh mµ kh«ng cÇn liªn kÕt tËp tin DLL víi ch¬ng tr×nh
cña b¹n. TËp tin DLL sÏ ®îc liªn kÕt ®éng víi ch¬ng tr×nh
trong thêi gian thi hµnh ch¬ng tr×nh. Bëi vËy khi viÕt mét
øng dông cã sö dông DLL, b¹n ph¶i ph©n phèi tËp tin DLL
cïng víi tËp tin EXE cña ch¬ng tr×nh b¹n viÕt.
//=============================
// Ham Enciph.c
#include <stdio.h>
X©y dùng th viÖn c¸c hµm m· ho¸.
Khoa C«ng NghÖ Th«ng Tin
#include <conio.h>
#include <miracl.h>
#include <stdlib.h>
#include <string.h>
/*
#define RSA
*/
int enciph(char *sin,char *sout)
{ /* encipher using public key */
big x,ke;
FILE *ifile;
int ch,i,leng;
long seed;
miracl *mip=mirsys(100,0);
x=mirvar(0);
ke=mirvar(0);
mip->IOBASE=60;
if ((ifile=fopen("public.key","r"))==NULL)
{
return 1;
}
cinnum(ke,ifile);
fclose(ifile);
seed=123456789;
irand(seed);
bigrand(ke,x);
leng=strlen(sin);
for(i=0; i <= (leng-1); i++)
{ /* encipher character by character */
#ifdef RSA
power(x,3,ke,x);
X©y dùng th viÖn c¸c hµm m· ho¸.
Khoa C«ng NghÖ Th«ng Tin
#else
mad(x,x,x,ke,ke,x);
#endif
ch=*(sin+i);
ch^=x[1]; /* XOR with last byte of x */
sout[i]=ch;
}
return 0;
}
//=============================
miracl *mirsys(int nd,mr_small nb)
{ /* Initialize MIRACL system to *
* use numbers to base nb, and *
* nd digits or (-nd) bytes long */
int i;
mr_small b;
mr_mip=(miracl *)mr_alloc(1,sizeof(miracl));
mr_mip->depth=0;
mr_mip->trace[0]=0;
mr_mip->depth++;
mr_mip->trace[mr_mip->depth]=25;
if (MIRACL>=MR_IBITS) mr_mip->TOOBIG =(1<<(MR_IBITS-2));
else
mr_mip->TOOBIG =(1<<(MIRACL-1));
#ifdef MR_FLASH
mr_mip->BTS=MIRACL/2;
if (mr_mip->BTS==MR_IBITS) mr_mip->MSK=(-1);
else mr_mip->MSK=(1<<(mr_mip->BTS))-1;
#endif
#ifdef MR_NO_STANDARD_IO
mr_mip->ERCON=TRUE;
X©y dùng th viÖn c¸c hµm m· ho¸.
Khoa C«ng NghÖ Th«ng Tin
#else
mr_mip->ERCON=FALSE;
#endif
mr_mip->N=0;
mr_mip->MSBIT=((mr_small)1<<(MIRACL-1));
mr_mip->OBITS=mr_mip->MSBIT-1;
mr_mip->user=NULL;
mr_set_align(0);
#ifdef MR_NOFULLWIDTH
if (nb==0)
{
mr_berror(MR_ERR_BAD_BASE);
mr_mip->depth--;
return mr_mip;
}
#endif
if (nb==1 || nb>MAXBASE)
{
mr_berror(MR_ERR_BAD_BASE);
mr_mip->depth--;
return mr_mip;
}
mr_setbase(nb);
b=mr_mip->base;
mr_mip->lg2b=0;
mr_mip->base2=1;
if (b==0)
{
mr_mip->lg2b=MIRACL;
mr_mip->base2=0;
}
else while (b>1)
X©y dùng th viÖn c¸c hµm m· ho¸.
Khoa C«ng NghÖ Th«ng Tin
{
b/=2;
mr_mip->lg2b++;
mr_mip->base2*=2;
}
if (nd>0)
mr_mip->nib=(nd-1)/mr_mip->pack+1;
else
mr_mip->nib=(mr_mip->lg2b-8*nd-1)/mr_mip->lg2b;
if (mr_mip->nib<2) mr_mip->nib=2;
#ifdef MR_FLASH
mr_mip->workprec=mr_mip->nib;
mr_mip->stprec=mr_mip->nib;
while(mr_mip->stprec>2 && mr_mip->stprec> MR_FLASH/
mr_mip->lg2b)
mr_mip->stprec=(mr_mip->stprec+1)/2;
if (mr_mip->stprec<2) mr_mip->stprec=2;
mr_mip->pi=NULL;
#endif
mr_mip->check=ON;
mr_mip->IOBASE=10; mr_mip->ERNUM=0;
mr_mip->RPOINT=OFF;
mr_mip->NTRY=6;
mr_mip->EXACT=TRUE;
mr_mip->TRACER=OFF;
mr_mip->INPLEN=0;
mr_mip->PRIMES=NULL;
mr_mip->IOBUFF=mr_alloc(MR_IOBSIZ+1,1);
for (i=0;i<NK;i++) mr_mip->ira[i]=0L;
irand(0L);
mr_mip->nib=2*mr_mip->nib+1;
#ifdef MR_FLASH
if (mr_mip->nib!=(mr_mip->nib&(mr_mip->MSK)) ||
mr_mip->nib > mr_mip->TOOBIG)
#else
if(mr_mip->nib!=(mr_mip->nib&(mr_mip->OBITS)) ||
mr_mip->nib>mr_mip->TOOBIG)
#endif
{
mr_berror(MR_ERR_TOO_BIG);
mr_mip->nib=(mr_mip->nib-1)/2;
mr_mip->depth--;
return mr_mip;
}
mr_mip->modulus=NULL;
mr_mip->A=NULL;
mr_mip->B=NULL;
mr_mip->fin=FALSE;
mr_mip->fout=FALSE;
mr_mip->active=ON;
mr_mip->w0=mirvar(0); /* w0 is double length */
mr_mip->nib=(mr_mip->nib-1)/2;
#ifdef MR_KCM
mr_mip->big_ndash=NULL;
mr_mip->ws=mirvar(0);
#endif
mr_mip->w1=mirvar(0); /* initialize workspace */
mr_mip->w2=mirvar(0);
mr_mip->w3=mirvar(0);
mr_mip->w4=mirvar(0);
mr_mip->nib=2*mr_mip->nib+1;
mr_mip->w5=mirvar(0);
mr_mip->w6=mirvar(0);
mr_mip->w7=mirvar(0);
mr_mip->nib=(mr_mip->nib-1)/2;
X©y dùng th viÖn c¸c hµm m· ho¸.
Khoa C«ng NghÖ Th«ng Tin
mr_mip->w5d=&(mr_mip->w5[mr_mip->nib+1]);
mr_mip->w6d=&(mr_mip->w6[mr_mip->nib+1]);
mr_mip->w7d=&(mr_mip->w7[mr_mip->nib+1]);
mr_mip->w8=mirvar(0);
mr_mip->w9=mirvar(0);
mr_mip->w10=mirvar(0);
mr_mip->w11=mirvar(0);
mr_mip->w12=mirvar(0);
mr_mip->w13=mirvar(0);
mr_mip->w14=mirvar(0);
mr_mip->w15=mirvar(0);
mr_mip->depth--;
return mr_mip;
}
//=============================
flash mirvar(int iv)
{ /* initialize big/flash number */
flash x;
if (mr_mip->ERNUM) return NULL;
mr_mip->depth++;
mr_mip->trace[mr_mip->depth]=23;
if (mr_mip->TRACER) mr_track();
if (!(mr_mip->active))
{
mr_berror(MR_ERR_NO_MIRSYS);
mr_mip->depth--;
return NULL;
}
x=(mr_small *)mr_alloc(mr_mip->nib+1,sizeof(mr_small));
if (x==NULL)
{
mr_berror(MR_ERR_OUT_OF_MEMORY);
X©y dùng th viÖn c¸c hµm m· ho¸.
Khoa C«ng NghÖ Th«ng Tin
mr_mip->depth--;
return x;
}
convert(iv,x);
mr_mip->depth--;
return x;
}
//=============================
int cinnum(flash x,FILE *filep)
{ /* convert from string to flash x */
int n;
if (mr_mip->ERNUM) return 0;
mr_mip->depth++;
mr_mip->trace[mr_mip->depth]=14;
if (mr_mip->TRACER) mr_track();
mr_mip->infile=filep;
mr_mip->fin=TRUE;
n=cinstr(x,NULL);
mr_mip->fin=FALSE;
mr_mip->depth--;
return n;
}
//=============================
void power(flash x,int n,flash w)
{
copy(x,mr_mip->w8);
zero(w);
if (mr_mip->ERNUM || size(mr_mip->w8)==0) return;
convert(1,w);
if (n==0) return;
mr_mip->depth++;
mr_mip->trace[mr_mip->depth]=51;
if (mr_mip->TRACER) mr_track();
X©y dùng th viÖn c¸c hµm m· ho¸.
Khoa C«ng NghÖ Th«ng Tin
if (n<0)
{
n=(-n);
frecip(mr_mip->w8,mr_mip->w8);
}
if (n==1)
{
copy(mr_mip->w8,w);
mr_mip->depth--;
return;
}
forever
{
if (n%2!=0) fmul(w,mr_mip->w8,w);
n/=2;
if (mr_mip->ERNUM || n==0) break;
fmul(mr_mip->w8,mr_mip->w8,mr_mip->w8);
}
mr_mip->depth--;
}
//=============================
void mad(big x,big y,big z,big w,big q,big r)
{
if (mr_mip->ERNUM) return;
mr_mip->depth++;
mr_mip->trace[mr_mip->depth]=24;
if (mr_mip->TRACER) mr_track();
mr_mip->check=OFF;
if (w==r)
{
mr_berror(MR_ERR_BAD_PARAMETERS);
mr_mip->depth--;
return;
X©y dùng th viÖn c¸c hµm m· ho¸.
Khoa C«ng NghÖ Th«ng Tin
}
multiply(x,y,mr_mip->w0);
if (x!=z && y!=z)add(mr_mip->w0,z,mr_mip->w0);
divide(mr_mip->w0,w,q);
if (q!=r) copy(mr_mip->w0,r);
mr_mip->check=ON;
mr_mip->depth--;
}
//=============================
•Hµm Deciph.c
Hµm sö dông ®Ó thùc hiÖn c¸c thao t¸c gi¶i m· ho¸ víi
x©u kÝ tù ®· ®îc m· ho¸ b»ng hµm enciph.c ë trªn, b»ng
c¸ch ®a vµo mét x©u ký tù ®· m· ho¸ (b¶n m·) ë ®Çu ra
b¹n sÏ nhËn l¹i mét x©u ký tù ban ®Çu (b¶n râ gèc). Hµm
thùc hiÖn cã sö dông kho¸ bÝ mËt lÊy vµo tõ File
PRIVATE.KEY. Hai File PUBLIC.KEY vµ PRIVATE.KEY chóng
cïng ®îc sinh ra do ch¬ng tr×nh genkey, chóng cã quan
hÖ mËt thiÕt víi nhau vµ kh«ng thÓ t¸ch rêi, nÕu cã kho¸
c«ng khai mµ kh«ng cã kho¸ bÝ mËt th× còng kh«ng thÓ
gi¶i m· ®îc, cßn nÕu cã kho¸ bÝ mËt mµ kh«ng cã kho¸
c«ng khai th× còng ch¼ng Ých lîi g×.
//=============================
//Deciph.c
#include <stdio.h>
#include <miracl.h>
#include <stdlib.h>
#include <string.h>
#ifdef RSA
decr(p,1,alpha);
premult(alpha,2,alpha);
incr(alpha,1,alpha);
subdiv(alpha,3,alpha);
#else
incr(p,1,alpha);
subdiv(alpha,4,alpha);
#endif
decr(p,1,y);
powmod(alpha,n,y,alpha);
#ifdef RSA
decr(q,1,beta);
premult(beta,2,beta);
incr(beta,1,beta);
subdiv(beta,3,beta);
#else
incr(q,1,beta);
subdiv(beta,4,beta);
#endif
decr(q,1,y);
powmod(beta,n,y,beta);
copy(x,y);
divide(x,p,p);
divide(y,q,q);
powmod(x,alpha,p,x);
powmod(y,beta,q,y);
mad(x,q,q,ke,ke,t);
mad(t,b,b,ke,ke,t);
mad(y,p,p,ke,ke,x);
mad(x,a,a,ke,ke,x);
add(x,t,x);
X©y dùng th viÖn c¸c hµm m· ho¸.
Khoa C«ng NghÖ Th«ng Tin
divide(x,ke,ke);
if (size(x)<0) add(x,ke,x);
for (i=0;i<leng;i++)
{ /* decipher character by character */
ch=*(strinputde+i);
ch^=x[1]; /* XOR with last byte of x */
stroutputde[i]=ch;
#ifdef RSA
power(x,3,ke,x);
#else
mad(x,x,x,ke,ke,x);
#endif
}
return 0;
}
//=============================
void multiply(big x,big y,big z)
{ /* multiply two big numbers: z=x.y */
int i,xl,yl,j,ti;
mr_small carry,sz;
big w0;
#ifdef MR_NOASM
mr_large dble;
#endif
if (mr_mip->ERNUM) return;
if (y[0]==0 || x[0]==0)
{
zero(z);
return;
}
w0=mr_mip->w0; /* local pointer */
mr_mip->depth++;
X©y dùng th viÖn c¸c hµm m· ho¸.
Khoa C«ng NghÖ Th«ng Tin
mr_mip->trace[mr_mip->depth]=5;
if (mr_mip->TRACER) mr_track();
#ifdef MR_FLASH
if (mr_notint(x) || mr_notint(y))
{
mr_berror(MR_ERR_INT_OP);
mr_mip->depth--;
return;
}
#endif
sz=((x[0]&mr_mip->MSBIT)^(y[0]&mr_mip->MSBIT));
xl=(int)(x[0]&mr_mip->OBITS);
yl=(int)(y[0]&mr_mip->OBITS);
zero(w0);
if (mr_mip->check && xl+yl>mr_mip->nib)
{
mr_berror(MR_ERR_OVERFLOW);
mr_mip->depth--;
return;
}
//=============================
void mad(big x,big y,big z,big w,big q,big r)
{
if (mr_mip->ERNUM) return;
mr_mip->depth++;
mr_mip->trace[mr_mip->depth]=24;
if (mr_mip->TRACER) mr_track();
mr_mip->check=OFF;
if (w==r)
{
mr_berror(MR_ERR_BAD_PARAMETERS);
mr_mip->depth--;
X©y dùng th viÖn c¸c hµm m· ho¸.
Khoa C«ng NghÖ Th«ng Tin
return;
}
multiply(x,y,mr_mip->w0);
if (x!=z && y!=z)add(mr_mip->w0,z,mr_mip->w0);
divide(mr_mip->w0,w,q);
if (q!=r) copy(mr_mip->w0,r);
mr_mip->check=ON;
mr_mip->depth--;
}
//=============================
int cinstr(flash x,unsigned char *string)
{ /* input big number in base IOBASE */
mr_small newb,oldb,b,lx;
int ipt;
if (mr_mip->ERNUM) return 0;
mr_mip->depth++;
mr_mip->trace[mr_mip->depth]=78;
if (mr_mip->TRACER) mr_track();
newb=mr_mip->IOBASE;
oldb=mr_mip->apbase;
mr_setbase(newb); /* temporarily change base ... */
b=mr_mip->base;
mr_mip->check=OFF;
ipt=instr(mr_mip->w5,string); /* ... and get number
*/
mr_mip->check=ON;
lx=(mr_mip->w5[0]&mr_mip->OBITS);
#ifdef MR_FLASH
if ((int)(lx&mr_mip->MSK)>mr_mip->nib ||
(int)((lx>>mr_mip->BTS)&mr_mip->MSK)>mr_mip->nib)
#else
if ((int)lx>mr_mip->nib)
X©y dùng th viÖn c¸c hµm m· ho¸.
Khoa C«ng NghÖ Th«ng Tin
#endif
{ /* numerator or denominator too big */
mr_berror(MR_ERR_OVERFLOW);
mr_mip->depth--;
return 0;
}
mr_setbase(oldb); /* restore original base */
cbase(mr_mip->w5,b,x);
mr_mip->depth--;
return ipt;
}
//=============================
void incr(big x,int n,big z)
{ /* add int to big number: z=x+n */
if (mr_mip->ERNUM) return;
mr_mip->depth++;
mr_mip->trace[mr_mip->depth]=7;
if (mr_mip->TRACER) mr_track();
convert(n,mr_mip->w0);
select(x,PLUS,mr_mip->w0,z);
mr_mip->depth--;
}
//=============================
void decr(big x,int n,big z)
{ /* subtract int from big number: z=x-n */
if (mr_mip->ERNUM) return;
mr_mip->depth++;
mr_mip->trace[mr_mip->depth]=8;
if (mr_mip->TRACER) mr_track();
convert(n,mr_mip->w0);
select(x,MINUS,mr_mip->w0,z);
mr_mip->depth--;
}
X©y dùng th viÖn c¸c hµm m· ho¸.
Khoa C«ng NghÖ Th«ng Tin