亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3998 | 回復(fù): 5
打印 上一主題 下一主題

[SCO UNIX] RSA與大數(shù)運(yùn)算 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2003-06-23 17:29 |只看該作者 |倒序?yàn)g覽
  1. 基于以下原因,俺估計(jì)RSA算法會被越來越多的共享軟件采用:

  2. 1、原理簡潔易懂
  3. 2、加密強(qiáng)度高
  4. 3、專利限制已過期
  5. 4、看雪老大三番五次呼吁共享軟件采用成熟的非對稱加密技術(shù)

  6. 所以,大家應(yīng)該對RSA算法進(jìn)行深入了解。

  7. RSA依賴大數(shù)運(yùn)算,目前主流RSA算法都建立在512位到1024位的
  8. 大數(shù)運(yùn)算之上,所以我們在現(xiàn)階段首先需要掌握1024位的大數(shù)
  9. 運(yùn)算原理。

  10. 大多數(shù)的編譯器只能支持到64位的整數(shù)運(yùn)算,即我們在運(yùn)算中
  11. 所使用的整數(shù)必須小于等于64位,即:0xffffffffffffffff
  12. 也就是18446744073709551615,這遠(yuǎn)遠(yuǎn)達(dá)不到RSA的需要,于是
  13. 需要專門建立大數(shù)運(yùn)算庫來解決這一問題。

  14. 最簡單的辦法是將大數(shù)當(dāng)作字符串進(jìn)行處理,也就是將大數(shù)用
  15. 10進(jìn)制字符數(shù)組進(jìn)行表示,然后模擬人們手工進(jìn)行“豎式計(jì)算”
  16. 的過程編寫其加減乘除函數(shù)。但是這樣做效率很低,因?yàn)?024
  17. 位的大數(shù)其10進(jìn)制數(shù)字個數(shù)就有數(shù)百個,對于任何一種運(yùn)算,
  18. 都需要在兩個有數(shù)百個元素的數(shù)組空間上做多重循環(huán),還需要
  19. 許多額外的空間存放計(jì)算的進(jìn)位退位標(biāo)志及中間結(jié)果。當(dāng)然其
  20. 優(yōu)點(diǎn)是算法符合人們的日常習(xí)慣,易于理解。

  21. 另一種思路是將大數(shù)當(dāng)作一個二進(jìn)制流進(jìn)行處理,使用各種移
  22. 位和邏輯操作來進(jìn)行加減乘除運(yùn)算,但是這樣做代碼設(shè)計(jì)非常
  23. 復(fù)雜,可讀性很低,難以理解也難以調(diào)試。

  24. 于是俺琢磨了一種介于兩者之間的思路:

  25. 將大數(shù)看作一個n進(jìn)制數(shù)組,對于目前的32位系統(tǒng)而言n可以取
  26. 值為2的32次方,即0x10000000,假如將一個1024位的大數(shù)轉(zhuǎn)
  27. 化成0x10000000進(jìn)制,它就變成了32位,而每一位的取值范圍
  28. 就不是0-1或0-9,而是0-0xffffffff。我們正好可以用一個無
  29. 符號長整數(shù)來表示這一數(shù)值。所以1024位的大數(shù)就是一個有32
  30. 個元素的unsigned long數(shù)組。而且0x100000000進(jìn)制的數(shù)組排列
  31. 與2進(jìn)制流對于計(jì)算機(jī)來說,實(shí)際上是一回事,但是我們完全
  32. 可以針對unsigned long數(shù)組進(jìn)行“豎式計(jì)算”,而循環(huán)規(guī)模
  33. 被降低到了32次之內(nèi),并且算法很容易理解。

  34. 例如大數(shù)18446744073709551615,等于“ffffffff ffffffff”,
  35. 它就相當(dāng)于10進(jìn)制的“99”:有兩位,每位都是ffffffff。
  36. 而大數(shù)18446744073709551616,等于“00000001 00000000
  37. 00000000”,它就相當(dāng)于10進(jìn)制的“100”:有三位,第一位是
  38. 1,其它兩位是0。如果我們要計(jì)算18446744073709551616
  39. -18446744073709551615,就類似于100-99:

  40.   00000001 00000000 00000000
  41. -           ffffffff ffffffff
  42. -----------------------------
  43. =        0         0        1


  44. 所以,可以聲明大數(shù)類如下:
  45. /****************************************************************/
  46. //大數(shù)運(yùn)算庫頭文件:BigInt.h
  47. //作者:afanty@vip.sina.com
  48. //版本:1.0 (2003.4.26)
  49. //說明:適用于MFC
  50. /****************************************************************/

  51. #define BI_MAXLEN 40
  52. #define DEC 10
  53. #define HEX 16

  54. class CBigInt
  55. {
  56. public:
  57.    int m_nSign;    //記錄大數(shù)的符號,支持負(fù)值運(yùn)算
  58.    int m_nLength;  //記錄0x10000000進(jìn)制的位數(shù),0-40之間,相當(dāng)于2進(jìn)制的0-1280位
  59.    unsigned long m_ulvalue[BI_MAXLEN];   //記錄每一位的“數(shù)字”

  60.    CBigInt();
  61.    ~CBigInt();


  62. //將大數(shù)賦值為另一個大數(shù)   
  63.    CBigInt& Mov(CBigInt& A);

  64. //將大數(shù)賦值為編譯器能夠理解的任何整形常數(shù)或變量  
  65.    CBigInt& Mov(unsigned __int64 A);

  66. //比較兩個大數(shù)大小
  67.    int Cmp(CBigInt& A);

  68. //計(jì)算兩個大數(shù)的和
  69.    CBigInt Add(CBigInt& A);

  70. //重載函數(shù)以支持大數(shù)與普通整數(shù)相加
  71.    CBigInt Add(long A);

  72. //計(jì)算兩個大數(shù)的差
  73.    CBigInt Sub(CBigInt& A);

  74. //重載函數(shù)以支持大數(shù)與普通整數(shù)相減
  75.    CBigInt Sub(long A);

  76. //計(jì)算兩個大數(shù)的積
  77.    CBigInt Mul(CBigInt& A);

  78. //重載函數(shù)以支持大數(shù)與普通整數(shù)相乘
  79.    CBigInt Mul(long A);

  80. //計(jì)算兩個大數(shù)的商
  81.    CBigInt Div(CBigInt& A);

  82. //重載函數(shù)以支持大數(shù)與普通整數(shù)相除
  83.    CBigInt Div(long A);

  84. //計(jì)算兩個大數(shù)相除的余數(shù)
  85.    CBigInt Mod(CBigInt& A);

  86. //重載函數(shù)以支持大數(shù)與普通整數(shù)相除求模
  87.    long Mod(long A);

  88. //將輸入的10進(jìn)制或16進(jìn)制字符串轉(zhuǎn)換成大數(shù)
  89.    int InPutFromStr(CString& str, const unsigned int system);

  90. //將大數(shù)按10進(jìn)制或16進(jìn)制格式輸出到字符串
  91.    int OutPutToStr(CString& str, const unsigned int system);

  92. //歐幾里德算法求:Y=X.Euc(A),使?jié)M足:YX mod A = 1
  93.    CBigInt Euc(CBigInt& A);

  94. //蒙哥馬利算法求:Y=X.Mon(A,B),使?jié)M足:X^A mod B = Y
  95.    CBigInt Mon(CBigInt& A, CBigInt& B);
  96. };


  97. 注意以上函數(shù)的聲明格式,完全遵循普通整數(shù)運(yùn)算的習(xí)慣,例如大數(shù)
  98. Y=X+Z 相當(dāng)于 Y.Mov(X.(Add(Z)),這樣似乎沒有Mov(Y,Add(X,Z))
  99. 看起來舒服,但是一旦我們重載運(yùn)算符“=”為“Mov”,“+”為“Add”,
  100. 則Y.Mov(X.(Add(Z))的形式就等價于 Y=X+Z。

  101. 俺不知道其他編程語言里是否支持運(yùn)算浮重載,至少這樣定義函數(shù)格式
  102. 在C++里可以帶來很大的方便。


  103. 下面讓我們來實(shí)現(xiàn)大數(shù)類的主要成員函數(shù):
  104. /****************************************************************/
  105. //大數(shù)運(yùn)算庫源文件:BigInt.cpp
  106. //作者:afanty@vip.sina.com
  107. //版本:1.0 (2003.4.26)
  108. //說明:適用于MFC
  109. /****************************************************************/

  110. #include "stdafx.h"
  111. #include "BigInt.h"

  112. //初始化大數(shù)為0
  113. CBigInt::CBigInt()
  114. {
  115. m_nSign=1;
  116. m_nLength=1;
  117. for(int i=0;i<BI_MAXLEN;i++)m_ulvalue[i]=0;
  118. }

  119. //采用缺省的解構(gòu)函數(shù)
  120. CBigInt::~CBigInt()
  121. {
  122. }

  123. //大數(shù)比較,如果大數(shù)A位數(shù)比大數(shù)B多,當(dāng)然A>;B
  124. //如果位數(shù)相同,則從高位開始比較,直到分出大小
  125. int CBigInt::Cmp(CBigInt& A)
  126. {
  127. if(m_nLength>;A.m_nLength)return 1;
  128. if(m_nLength<A.m_nLength)return -1;
  129. for(int i=m_nLength-1;i>;=0;i--)
  130. {
  131. if(m_ulvalue[i]>;A.m_ulvalue[i])return 1;
  132. if(m_ulvalue[i]<A.m_ulvalue[i])return -1;
  133. }
  134. return 0;
  135. }

  136. //照搬參數(shù)的各屬性
  137. CBigInt& CBigInt::Mov(CBigInt& A)
  138. {
  139. m_nLength=A.m_nLength;
  140. for(int i=0;i<BI_MAXLEN;i++)m_ulvalue[i]=A.m_ulvalue[i];
  141. return *this;
  142. }

  143. //大數(shù)相加
  144. //調(diào)用形式:N.Add(A),返回值:N+A
  145. //若兩大數(shù)符號相同,其值相加,否則改變參數(shù)符號再調(diào)用大數(shù)相減函數(shù)
  146. /******************************************************************/
  147. 例如:
  148.      A  B  C
  149. +       D  E
  150. --------------
  151. = S  F  G  H

  152. 其中,若C+E<=0xffffffff,則H=C+E,carry(進(jìn)位標(biāo)志)=0
  153.      若C+E>;0xffffffff,則H=C+E-0x100000000,carry=1

  154.      若B+D+carry<=0xfffffff,則G=B+D,carry=0      
  155.      若B+D+carry>;0xfffffff,則G=B+D+carry-0x10000000,carry=1

  156.      若carry=0,則F=A,S=0
  157.      若carry=1,A<0xfffffff,則F=A+1,S=0
  158.      若carry=1,A=0xfffffff,則F=0,S=1
  159. /*****************************************************************/
  160. CBigInt CBigInt::Add(CBigInt& A)
  161. {
  162. CBigInt X;
  163. if(X.m_nSign==A.m_nSign)
  164. {
  165. X.Mov(*this);
  166. int carry=0;
  167.        unsigned __int64 sum=0;
  168.        if(X.m_nLength<A.m_nLength)X.m_nLength=A.m_nLength;
  169. for(int i=0;i<X.m_nLength;i++)
  170. {
  171. sum=A.m_ulvalue[i];
  172. sum=sum+X.m_ulvalue[i]+carry;
  173. X.m_ulvalue[i]=(unsigned long)sum;
  174. if(sum>;0xffffffff)carry=1;
  175. else carry=0;
  176. }
  177. if(X.m_nLength<BI_MAXLEN)
  178. {
  179. X.m_ulvalue[X.m_nLength]=carry;
  180.    X.m_nLength+=carry;
  181. }
  182. return X;
  183. }
  184. else{X.Mov(A);X.m_nSign=1-X.m_nSign;return Sub(X);}
  185. }

  186. //大數(shù)相減
  187. //調(diào)用形式:N.Sub(A),返回值:N-A
  188. //若兩大數(shù)符號相同,其值相減,否則改變參數(shù)符號再調(diào)用大數(shù)相加函數(shù)
  189. /******************************************************************/
  190. 例如:
  191.      A  B  C
  192. -       D  E
  193. --------------
  194. =    F  G  H

  195. 其中,若C>;=E,則H=C-E,carry(借位標(biāo)志)=0
  196.      若C<E,則H=C-E+0x100000000,carry=1

  197.      若B-carry>;=D,則G=B-carry-D,carry=0      
  198.      若B-carry<D,則G=B-carry-D+0x10000000,carry=1

  199.      若carry=0,則F=A
  200.      若carry=1,A>;1,則F=A-1
  201.      若carry=1,A=1,則F=0
  202. /*****************************************************************/
  203. CBigInt CBigInt::Sub(CBigInt& A)
  204. {
  205. CBigInt X;
  206. if(m_nSign==A.m_nSign)
  207. {
  208. X.Mov(*this);
  209. int cmp=X.Cmp(A);
  210. if(cmp==0){X.Mov(0);return X;}
  211. int len,carry=0;
  212. unsigned __int64 num;
  213. unsigned long *s,*d;
  214.        if(cmp>;0)
  215.                {
  216.                        s=X.m_ulvalue;
  217.                        d=A.m_ulvalue;
  218.                        len=X.m_nLength;
  219.                }
  220.        if(cmp<0)
  221.                {
  222.                        s=A.m_ulvalue;
  223.                        d=X.m_ulvalue;
  224.                        len=A.m_nLength;
  225.                        X.m_nSign=1-X.m_nSign;
  226.                }
  227.        for(int i=0;i<len;i++)
  228. {
  229. if((s[i]-carry)>;=d[i])
  230. {
  231. X.m_ulvalue[i]=s[i]-carry-d[i];
  232. carry=0;
  233. }
  234. else
  235. {
  236. num=0x100000000+s[i];
  237. X.m_ulvalue[i]=(unsigned long)(num-carry-d[i]);
  238. carry=1;
  239. }
  240. }
  241. while(X.m_ulvalue[len-1]==0)len--;
  242. X.m_nLength=len;
  243. return X;
  244. }
  245. else{X.Mov(A);X.m_nSign=1-X.m_nSign;return Add(X);}
  246. }

  247. //大數(shù)相乘
  248. //調(diào)用形式:N.Mul(A),返回值:N*A
  249. /******************************************************************/
  250. 例如:
  251.         A  B  C
  252. *          D  E
  253. ----------------
  254. =    S  F  G  H
  255. + T  I  J  K
  256. ----------------
  257. = U  V  L  M  N

  258. 其中,SFGH=ABC*E,TIJK=ABC*D

  259. 而對于:
  260.      A  B  C
  261. *          E
  262. -------------
  263. = S  F  G  H     

  264. 其中,若C*E<=0xffffffff,則H=C*E,carry(進(jìn)位標(biāo)志)=0
  265.      若C*E>;0xffffffff,則H=(C*E)&0xffffffff
  266.        carry=(C*E)/0xffffffff
  267.      若B*E+carry<=0xffffffff,則G=B*E+carry,carry=0
  268.      若B*E+carry>;0xffffffff,則G=(B*E+carry)&0xffffffff
  269.        carry=(B*E+carry)/0xffffffff
  270.      若A*E+carry<=0xffffffff,則F=A*E+carry,carry=0
  271.      若A*E+carry>;0xffffffff,則F=(A*E+carry)&0xffffffff
  272.        carry=(A*E+carry)/0xffffffff
  273.      S=carry
  274. /*****************************************************************/
  275. CBigInt CBigInt::Mul(CBigInt& A)
  276. {
  277. CBigInt X,Y;
  278. unsigned __int64 mul;
  279.        unsigned long carry;
  280.        for(int i=0;i<A.m_nLength;i++)
  281. {
  282. Y.m_nLength=m_nLength;
  283. carry=0;
  284. for(int j=0;j<m_nLength;j++)
  285. {
  286. mul=m_ulvalue[j];
  287. mul=mul*A.m_ulvalue[i]+carry;
  288. Y.m_ulvalue[j]=(unsigned long)mul;
  289. carry=(unsigned long)(mul>;>;32);
  290. }
  291. if(carry&&(Y.m_nLength<BI_MAXLEN))
  292.                {
  293.                        Y.m_nLength++;
  294.                        Y.m_ulvalue[Y.m_nLength-1]=carry;
  295.                }
  296. if(Y.m_nLength<BI_MAXLEN-i)
  297. {
  298. Y.m_nLength+=i;
  299.        for(int k=Y.m_nLength-1;k>;=i;k--)Y.m_ulvalue[k]=Y.m_ulvalue[k-i];
  300.        for(k=0;k<i;k++)Y.m_ulvalue[k]=0;
  301. }
  302. X.Mov(X.Add(Y));
  303. }
  304. if(m_nSign+A.m_nSign==1)X.m_nSign=0;
  305. else X.m_nSign=1;
  306. return X;
  307. }

  308. //大數(shù)相除
  309. //調(diào)用形式:N.Div(A),返回值:N/A
  310. //除法的關(guān)鍵在于“試商”,然后就變成了乘法和減法
  311. //這里將被除數(shù)與除數(shù)的試商轉(zhuǎn)化成了被除數(shù)最高位與除數(shù)最高位的試商
  312. CBigInt CBigInt::Div(CBigInt& A)
  313. {
  314. CBigInt X,Y,Z;
  315. int len;
  316. unsigned __int64 num,div;
  317. unsigned long carry=0;
  318. Y.Mov(*this);
  319. while(Y.Cmp(A)>;0)
  320. {      
  321. if(Y.m_ulvalue[Y.m_nLength-1]>;A.m_ulvalue[A.m_nLength-1])
  322. {
  323. len=Y.m_nLength-A.m_nLength;
  324. div=Y.m_ulvalue[Y.m_nLength-1]/(A.m_ulvalue[A.m_nLength-1]+1);
  325. }
  326. else if(Y.m_nLength>;A.m_nLength)
  327. {
  328. len=Y.m_nLength-A.m_nLength-1;
  329. num=Y.m_ulvalue[Y.m_nLength-1];
  330. num=(num<<32)+Y.m_ulvalue[Y.m_nLength-2];
  331. if(A.m_ulvalue[A.m_nLength-1]==0xffffffff)div=(num>;>;32);
  332. else div=num/(A.m_ulvalue[A.m_nLength-1]+1);
  333. }
  334. else
  335. {
  336.                        X.Mov(X.Add(1));
  337. break;
  338. }
  339.                Z.Mov(div);
  340. Z.m_nLength+=len;
  341. for(int i=Z.m_nLength-1;i>;=len;i--)Z.m_ulvalue[i]=Z.m_ulvalue[i-len];
  342. for(i=0;i<len;i++)Z.m_ulvalue[i]=0;
  343. X.Mov(X.Add(Z));
  344. Z.Mov(Z.Mul(A));
  345. Y.Mov(Y.Sub(Z));
  346. }
  347. if(Y.Cmp(A)==0)X.Mov(X.Add(1));
  348. if(m_nSign+A.m_nSign==1)X.m_nSign=0;
  349. else X.m_nSign=1;
  350. return X;
  351. }

  352. //大數(shù)求模
  353. //調(diào)用形式:N.Mod(A),返回值:N%A
  354. //求模與求商原理相同
  355. CBigInt CBigInt::Mod(CBigInt& A)
  356. {
  357. CBigInt X,Y;
  358. int len;
  359. unsigned __int64 num,div;
  360. unsigned long carry=0;
  361. X.Mov(*this);
  362. while(X.Cmp(A)>;0)
  363. {      
  364. if(X.m_ulvalue[X.m_nLength-1]>;A.m_ulvalue[A.m_nLength-1])
  365. {
  366. len=X.m_nLength-A.m_nLength;
  367. div=X.m_ulvalue[X.m_nLength-1]/(A.m_ulvalue[A.m_nLength-1]+1);
  368. }
  369. else if(X.m_nLength>;A.m_nLength)
  370. {
  371. len=X.m_nLength-A.m_nLength-1;
  372. num=X.m_ulvalue[X.m_nLength-1];
  373. num=(num<<32)+X.m_ulvalue[X.m_nLength-2];
  374. if(A.m_ulvalue[A.m_nLength-1]==0xffffffff)div=(num>;>;32);
  375. else div=num/(A.m_ulvalue[A.m_nLength-1]+1);
  376. }
  377. else
  378. {
  379. X.Mov(X.Sub(A));
  380. break;
  381. }
  382.                Y.Mov(div);
  383. Y.Mov(Y.Mul(A));
  384. Y.m_nLength+=len;
  385. for(int i=Y.m_nLength-1;i>;=len;i--)Y.m_ulvalue[i]=Y.m_ulvalue[i-len];
  386. for(i=0;i<len;i++)Y.m_ulvalue[i]=0;
  387. X.Mov(X.Sub(Y));
  388. }
  389. if(X.Cmp(A)==0)X.Mov(0);
  390. return X;
  391. }


  392. //暫時只給出了十進(jìn)制字符串的轉(zhuǎn)化
  393. int CBigInt::InPutFromStr(CString& str, const unsigned int system=DEC)
  394. {
  395.        int len=str.GetLength();
  396. Mov(0);
  397. for(int i=0;i<len;i++)
  398.        {
  399.              Mov(Mul(system));
  400. int k=str[i]-48;
  401. Mov(Add(k));
  402. }
  403. return 0;
  404. }

  405. //暫時只給出了十進(jìn)制字符串的轉(zhuǎn)化
  406. int CBigInt::OutPutToStr(CString& str, const unsigned int system=DEC)
  407. {
  408. str="";
  409. char ch;
  410. CBigInt X;
  411. X.Mov(*this);
  412. while(X.m_ulvalue[X.m_nLength-1]>;0)
  413. {
  414. ch=X.Mod(system)+48;
  415. str.Insert(0,ch);
  416.        X.Mov(X.Div(system));
  417. }
  418. return 0;
  419. }

  420. //歐幾里德算法求:Y=X.Euc(A),使?jié)M足:YX mod A=1
  421. //相當(dāng)于對不定方程ax-by=1求最小整數(shù)解
  422. //實(shí)際上就是初中學(xué)過的輾轉(zhuǎn)相除法
  423. /********************************************************************/
  424. 例如:11x-49y=1,求x

  425.            11 x  -  49 y  =   1      a)
  426. 49%11=5 ->;  11 x  -   5 y  =   1      b)
  427. 11%5 =1 ->;     x  -   5 y  =   1      c)

  428. 令y=1  代入c)式  得x=6
  429. 令x=6  代入b)式  得y=13
  430. 令y=13 代入a)式  得x=58  
  431. /********************************************************************/
  432. CBigInt CBigInt::Euc(CBigInt& A)
  433. {
  434. CBigInt X,Y;
  435. X.Mov(*this);
  436. Y.Mov(A);
  437. if((X.m_nLength==1)&&(X.m_ulvalue[0]==1))return X;
  438. if((Y.m_nLength==1)&&(Y.m_ulvalue[0]==1)){X.Mov(X.Sub(1));return X;}
  439. if(X.Cmp(Y)==1)X.Mov(X.Mod(Y));
  440. else Y.Mov(Y.Mod(X));
  441. X.Mov(X.Euc(Y));
  442.        Y.Mov(*this);
  443. if(Y.Cmp(A)==1)
  444. {
  445. X.Mov(X.Mul(Y));
  446. X.Mov(X.Sub(1));
  447. X.Mov(X.Div(A));
  448. }
  449. else
  450. {
  451. X.Mov(X.Mul(A));
  452. X.Mov(X.Add(1));
  453. X.Mov(X.Div(Y));
  454. }
  455. return X;
  456. }

  457. //蒙哥馬利算法求:Y=X.Mon(A,B),使?jié)M足:X^A mod B=Y
  458. //俺估計(jì)就是高中學(xué)過的反復(fù)平方法
  459. CBigInt CBigInt::Mon(CBigInt& A, CBigInt& B)
  460. {
  461. CBigInt X,Y,Z;
  462. X.Mov(1);
  463. Y.Mov(*this);
  464.        Z.Mov(A);
  465. while((Z.m_nLength!=1)||Z.m_ulvalue[0])
  466. {
  467. if(Z.m_ulvalue[0]&1)
  468. {
  469. Z.Mov(Z.Sub(1));
  470. X.Mov(X.Mul(Y));
  471. X.Mov(X.Mod(B));
  472. }
  473. else
  474. {
  475. Z.Mov(Z.Div(2));
  476. Y.Mov(Y.Mul(Y));
  477. Y.Mov(Y.Mod(B));
  478. }
  479. }
  480.        return X;
  481. }


  482. 最后需要說明的是因?yàn)樵赩C里面存在一個__int64類型可以
  483. 用來計(jì)算進(jìn)位與借位值,所以將大數(shù)當(dāng)作0x100000000進(jìn)制
  484. 進(jìn)行運(yùn)算是可能的,而在其他編譯系統(tǒng)中如果不存在64位
  485. 整形,則可以采用0x40000000進(jìn)制,由于在0x40000000
  486. 進(jìn)制中,對任何兩個“數(shù)字”進(jìn)行四則運(yùn)算,結(jié)果都在
  487. 0x3fffffff*03fffffff之間,小于0xffffffff,都可以用
  488. 一個32位無符號整數(shù)來表示。事實(shí)上《楚漢棋緣》采用的
  489. freelip大數(shù)庫正是運(yùn)用了0x40000000進(jìn)制來表示大數(shù)的,
  490. 所以其反匯編后大數(shù)的值在內(nèi)存中表現(xiàn)出來有些“奇怪”。
復(fù)制代碼

論壇徽章:
0
2 [報告]
發(fā)表于 2003-06-23 18:00 |只看該作者

RSA與大數(shù)運(yùn)算

gz

論壇徽章:
0
3 [報告]
發(fā)表于 2003-06-23 21:11 |只看該作者

RSA與大數(shù)運(yùn)算

一個字:牛!!

論壇徽章:
0
4 [報告]
發(fā)表于 2003-06-25 06:55 |只看該作者

RSA與大數(shù)運(yùn)算

不錯,很好

論壇徽章:
0
5 [報告]
發(fā)表于 2003-06-25 09:16 |只看該作者

RSA與大數(shù)運(yùn)算

文章很好。請介紹RSA算法在UNIX中的一些應(yīng)用好嗎?請教了!

論壇徽章:
0
6 [報告]
發(fā)表于 2012-08-26 08:39 |只看該作者
就是高中學(xué)過的反復(fù)平方法
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP