调试发现变量地址和值都突然自己改变,然后出现访问地址冲突提示 求教大神 谢谢谢谢
#if 1
#include
#include
#include
#define MAXSIZE 0x10000 //0x10000进制
#define BI_MAXLEN 35
#define prime_length 16
#define DEC 10
#define HEX 16
typedef struct
{
//unsigned long num[BI_MAXLEN];
//大数在0x10000进制下的长度(65536进制) 两数最大乘积不超过0xFFFFFFFF
unsigned m_nLength;
//用数组记录大数在0x10000进制下每一位的值
unsigned long m_ulValue[BI_MAXLEN];
}CBigInt;
CBigInt P,Q,N,FIN,E,D;
CBigInt *pP,*pQ,*pN,*pFIN,*pE,*pD;
char *primeNumber[20]={
"13B9F7DAF88000A274A20C4BFC58D25D63E039D29C166E60B0D8397A8D900669",
"61900DF4A1E38E8161E836C806A0930F0F4CFE618084D7BAAFCAE53C934C0231",
"8A004B1467B5DF282D0343411DD58246166881C4C1405142C747809EE68131B",
"3CF740C2DEA0C9F2D61CD2E096D46AD23D02F542F2463380A2A940F4451F244B",
"141A519F1B8C3E1029BCE00CDF8FB48E7A34A9D8F3ECCF6305808FEE72561C8F",
"5820369A2DD49A68F9EC5654DACBA4E0441EFEBF0780A240DEE1D93467ED1195",
"5783EC0B316D9EA46F0A0B4C23E40B679B0A9DA3AB30340B000D20CD46417F3",
"80D4960EF4086215B843E451EE4DCB0FD3525B14A80C62C8EE0885C0DA81983",
"4F1DF413C41170CA75B4D576736B11323304FEC43BB80C1F70DE77A288D012FD",
"5E3177D0295CD45CEE4E12A09E8821302A26A5E6369804C8F9D80F348C782491",
"5B8BFFE824CEB04079D06B045F8972E0E48C06008EC8570AD7F25FEC47FB01F5",
"44EC0155E4E47A28E13AC22257DA832DD199C21AE57A1FC7499AAF7FD67801AF",
"17AC6E05D7F7BEA8AD90BAA399C3A09964209758FA607E034A965410BADC1465",
"3A4C78855A16005FB7B83890522EFE57D93D562ACCF6B69658914C100BC0014B",
"20C7A1CC82B2153765E29DF5D4112594F51411601ACF5730BF7467EAFAA81DD9",
"1D4DD3FA885442C15E90C948B2A740046C6CF42CF61622E87E500B048F7E0727",
"1ADB2B45FB02C2609ED571B053D456DC458F05204AA758AA7EBC38E011801055",
"6E9EC09E421C316205CA33D840CE54705EACEF80B33D990F2AFC7038DC600425",
"209351A0DEC00A40837B5F709CC88090FDDAB0D457F6A6FCB64052C289C80F0B",
"1331E47E243E1A411009238C2AFEBD71FAF2496336C1B80D718BDD6AD800907"
};
//StrToHex(const VMCHAR * pszStr, VMUINT32 u4Len) //将字符串转化为16进制
const static int PrimeTable[550]=
{ 3, 5, 7, 11, 13, 17, 19, 23, 29, 31,
37, 41, 43, 47, 53, 59, 61, 67, 71, 73,
79, 83, 89, 97, 101, 103, 107, 109, 113, 127,
131, 137, 139, 149, 151, 157, 163, 167, 173, 179,
181, 191, 193, 197, 199, 211, 223, 227, 229, 233,
239, 241, 251, 257, 263, 269, 271, 277, 281, 283,
293, 307, 311, 313, 317, 331, 337, 347, 349, 353,
359, 367, 373, 379, 383, 389, 397, 401, 409, 419,
421, 431, 433, 439, 443, 449, 457, 461, 463, 467,
479, 487, 491, 499, 503, 509, 521, 523, 541, 547,
557, 563, 569, 571, 577, 587, 593, 599, 601, 607,
613, 617, 619, 631, 641, 643, 647, 653, 659, 661,
673, 677, 683, 691, 701, 709, 719, 727, 733, 739,
743, 751, 757, 761, 769, 773, 787, 797, 809, 811,
821, 823, 827, 829, 839, 853, 857, 859, 863, 877,
881, 883, 887, 907, 911, 919, 929, 937, 941, 947,
953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019,
1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087,
1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153,
1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229,
1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297,
1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381,
1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453,
1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523,
1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597,
1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663,
1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741,
1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823,
1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901,
1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993,
1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063,
2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131,
2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221,
2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293,
2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371,
2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437,
2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539,
2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621,
2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689,
2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749,
2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833,
2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909,
2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001,
3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083,
3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187,
3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259,
3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343,
3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433,
3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517,
3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581,
3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659,
3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733,
3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823,
3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911,
3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001
};
//用来构造大数的对象并初始化为0
CBigInt* init(CBigInt *x )
{
int length;
for(length=0;length x->m_ulValue[length]=0;
x->m_nLength = 1;
return x;
}
/****************************************************************************************
大数比较
返回值:若NA返回1
****************************************************************************************/
int smt_Cmp(CBigInt *x,CBigInt *y)
{
int i;
if(x->m_nLength > y->m_nLength)return 1;
if(x->m_nLength < y->m_nLength)return -1;
for(i=x->m_nLength-1;i >= 0;i--)
{
if(x->m_ulValue[i] > y->m_ulValue[i])return 1;
if(x->m_ulValue[i] < y->m_ulValue[i])return -1;
}
return 0;
}
/****************************************************************************************
大数赋值
返回值:无,N被赋值为A
****************************************************************************************/
void smt_whole_Mov(CBigInt *x,CBigInt *y)
{
int i;
x->m_nLength = y->m_nLength;
for(i=0;i < BI_MAXLEN;i++)
x->m_ulValue[i] = y->m_ulValue[i];
}
void smt_part_Mov(CBigInt *x,unsigned long A)
{
int i;
if(A>0xffff)
{
x->m_nLength=2;
x->m_ulValue[1]=(unsigned long)(A>>16);
x->m_ulValue[0]=(unsigned long)A;
}
else
{
x->m_nLength = 1;
x->m_ulValue[0] = (unsigned long)A;
}
for( i= x->m_nLength;i x->m_ulValue[i] = 0;
}
/****************************************************************************************
大数相加
返回值:N+A
****************************************************************************************/
CBigInt* smt_whole_Add(CBigInt *x,CBigInt *y)
{
unsigned i;
CBigInt S;
CBigInt *pS = &S;
unsigned carry=0;
unsigned long sum=0;
pS=init(pS);
//X.Mov(*this);
smt_whole_Mov(pS,x);
if(S.m_nLength < y->m_nLength)
S.m_nLength = y->m_nLength;
for(i=0;i<S.m_nLength;i++)
{
sum=y->m_ulValue[i];
sum=sum+S.m_ulValue[i]+carry;
S.m_ulValue[i]=(unsigned long)sum;
carry=(unsigned)(sum>>16);
}
S.m_ulValue[S.m_nLength]=carry;
S.m_nLength+=carry;
return pS;
}
CBigInt* smt_part_Add(CBigInt *x,unsigned long A)
{
int i;
CBigInt S;
unsigned long sum;
CBigInt *pS = &S;
pS = init(pS);
//X.Mov(*this);
smt_whole_Mov(pS,x);
sum=S.m_ulValue[0];
sum+=A;
S.m_ulValue[0]=(unsigned long)sum;
if(sum>0xffff)
{
unsigned i=1;
while(S.m_ulValue[i]==0xffff)
{
S.m_ulValue[i]=0;
i++;
}
S.m_ulValue[i]++;
if(x->m_nLength==i)
x->m_nLength++;
}
return pS;
}
/****************************************************************************************
大数相减
返回值:N-A
****************************************************************************************/
CBigInt* smt_whole_Sub(CBigInt *x,CBigInt *y)
{
CBigInt S;
unsigned carry=0;
unsigned long num;
unsigned i;
CBigInt *pS = &S;
pS = init(pS);
//X.Mov(*this);
smt_whole_Mov(pS,x);
if(smt_Cmp(pS,y)<=0)
{
smt_part_Mov(pS,0);
return pS;
}
for(i=0;i < x->m_nLength;i++)
{
if((x->m_ulValue[i]>y->m_ulValue[i])||((x->m_ulValue[i]==y->m_ulValue[i])&&(carry==0)))
{
S.m_ulValue[i]=x->m_ulValue[i]-carry- y->m_ulValue[i];
carry=0;
}
else
{
num=0x10000+x->m_ulValue[i];
S.m_ulValue[i]=(unsigned long)(num-carry-y->m_ulValue[i]);
carry=1;
}
}
while(S.m_ulValue[S.m_nLength-1]==0)
S.m_nLength--;
return pS;
}
CBigInt* smt_part_Sub(CBigInt *x,unsigned long A)
{
CBigInt S;
int i=1;
unsigned long num;
CBigInt *pS = &S;
pS = init(pS);
//X.Mov(*this);
smt_whole_Mov(pS,x);
if(S.m_ulValue[0]>=A)
{
S.m_ulValue[0] -= A;
return pS;
}
if(S.m_nLength==1)
{
smt_part_Mov(pS,0);
return pS;
}
num=0x10000+S.m_ulValue[0];
S.m_ulValue[0]=(unsigned long)(num-A);
while(S.m_ulValue[i]==0)
{
S.m_ulValue[i]=0xffff;
i++;
}
S.m_ulValue[i]--;
if(S.m_ulValue[i]==0)
S.m_nLength--;
return pS;
}
/****************************************************************************************
大数相乘
返回值:N*A
****************************************************************************************/
CBigInt* smt_part_Mul(CBigInt x,unsigned long A);
CBigInt smt_whole_Mul(CBigInt *x,CBigInt *y)
{
CBigInt S;
unsigned long sum,mul=0,carry=0;
unsigned i,j;
CBigInt *pS = &S;
pS = init(pS); //改到这里
if(y->m_nLength==1)
return smt_part_Mul(x,y->m_ulValue[0]);
S.m_nLength=x->m_nLength+y->m_nLength-1;
for(i=0;i<S.m_nLength;i++)
{
sum=carry;
carry=0;
for(j=0;j<y->m_nLength;j++)
{
if(((i-j)>=0)&&((i-j)<x->m_nLength))
{
mul=x->m_ulValue[i-j];
mul*=y->m_ulValue[j];
carry+=mul>>16;
mul=mul&0xffff;
sum+=mul;
}
}
carry+=sum>>16;
S.m_ulValue[i]=(unsigned long)sum;
}
if(carry)
{
S.m_nLength++;
S.m_ulValue[S.m_nLength-1]=(unsigned long)carry;
}
return pS;
}
CBigInt* smt_part_Mul(CBigInt *x,unsigned long A)
{
CBigInt S;
unsigned i;
unsigned long mul;
unsigned long carry=0;
CBigInt *pS = &S;
pS=init(pS);
//X.Mov(*this);
smt_whole_Mov(pS,x);
for(i=0;i<x->m_nLength;i++)
{
mul=x->m_ulValue[i];
mul=mul*A+carry;
S.m_ulValue[i]=(unsigned long)mul;
carry=(unsigned long)(mul>>16);
}
if(carry)
{
S.m_nLength++;
S.m_ulValue[S.m_nLength-1]=carry;
}
return pS;
}
/****************************************************************************************
大数相除
返回值:N/A
****************************************************************************************/
CBigInt* smt_part_Div(CBigInt x,unsigned long A);
CBigInt smt_whole_Div(CBigInt *x,CBigInt *y)
{
CBigInt I,J,S; //I=Y,J=Z
unsigned i,len;
unsigned long num,div;
CBigInt *pS = &S;
CBigInt *pI = &I;
CBigInt *pJ = &J;
pS = init(pS);
pI = init(pI);
pJ = init(pJ);
if(y->m_nLength==1)
return smt_part_Div(x,y->m_ulValue[0]);
//Y.Mov(*this);
smt_whole_Mov(pI,x);
while(smt_Cmp(pI,y)>=0)
{
div=I.m_ulValue[I.m_nLength-1];
num=y->m_ulValue[y->m_nLength-1];
len=I.m_nLength-y->m_nLength;
if((div==num)&&(len==0))
{
//X.Mov(X.Add(1));
smt_whole_Mov(pS,smt_part_Add(pS,1));
break;
}
if((div<=num)&&len)
{
len--;
div=(div<<16)+I.m_ulValue[I.m_nLength-2];
}
div=div/(num+1);
//Z.Mov(div);
smt_part_Mov(pJ,div);
if(len)
{
J.m_nLength+=len;
for(i=J.m_nLength-1;i>=len;i--)
J.m_ulValue[i]=J.m_ulValue[i-len];
for(i=0;i<len;i++)
J.m_ulValue[i]=0;
}
//X.Mov(X.Add(Z));
smt_whole_Mov(pS,smt_whole_Add(pS,pJ));
//Y.Mov(Y.Sub(A.Mul(Z)));
smt_whole_Mov(pI,smt_whole_Sub(pI,smt_whole_Mul(y,pJ)));
}
return pS;
}
CBigInt* smt_part_Div(CBigInt *x,unsigned long A)
{
int i;
CBigInt S;
unsigned long div,mul;
unsigned long carry=0;
CBigInt *pS = &S;
pS = init(pS);
//X.Mov(*this);
smt_whole_Mov(pS,x);
if(S.m_nLength==1)
{
S.m_ulValue[0]=S.m_ulValue[0]/A;
return pS;
}
for(i=S.m_nLength-1;i>=0;i--)
{
div=carry;
div=(div<<16)+S.m_ulValue[i];
S.m_ulValue[i]=(unsigned long)(div/A);
mul=(div/A)*A;
carry=(unsigned long)(div-mul);
}
if(S.m_ulValue[S.m_nLength-1]==0)
S.m_nLength--;
return pS;
}
/****************************************************************************************
大数求模
返回值:N%A
****************************************************************************************/
CBigInt* smt_whole_Mod(CBigInt *x,CBigInt *y)
{
CBigInt S,Z;
unsigned long div,num;
unsigned long carry=0;
unsigned i,len;
//X.Mov(*this);
CBigInt *pS = &S;
CBigInt *pZ = &Z;
pS = init(pS);
pZ = init(pZ);
smt_whole_Mov(pS,x);
while(smt_Cmp(pS,y)>=0)
{
div=S.m_ulValue[S.m_nLength-1];
num=y->m_ulValue[y->m_nLength-1];
len=S.m_nLength-y->m_nLength;
if((div==num)&&(len==0))
{
//X.Mov(X.Sub(A));
smt_whole_Mov(pS,smt_whole_Sub(pS,y));
break;
}
if((div<=num)&&len)
{
len--;
div=(div<<16)+S.m_ulValue[S.m_nLength-1];
}
div=div/(num+1);
//Y.Mov(div);
//Y.Mov(A.Mul(Y));
smt_part_Mov(pZ,div);
smt_whole_Mov(pZ,smt_whole_Mul(y,pZ));
if(len)
{
Z.m_nLength+=len;
for(i=Z.m_nLength-1;i>=len;i--)
Z.m_ulValue[i]=Z.m_ulValue[i-len];
for(i=0;i<len;i++)
Z.m_ulValue[i]=0;
}
// X.Mov(X.Sub(Y));
smt_whole_Mov(pS,smt_whole_Sub(pS,pZ));
}
return pS;
}
unsigned long smt_part_Mod(CBigInt *x,unsigned long A)
{
int i;
unsigned long div;
unsigned long carry=0;
if(x->m_nLength==1)
return(x->m_ulValue[0]%A);
for(i=x->m_nLength-1;i>=0;i--)
{
div=x->m_ulValue[i];
div+=carry*0x10000;
carry=(unsigned long)(div%A);
}
return carry;
}
#if 0
/****************************************************************************************
从字符串按10进制或16进制格式输入到大数
调用格式:N.Get(str,sys)
返回值:N被赋值为相应大数
sys暂时只能为10或16
****************************************************************************************/
void smt_Get(CBigInt *pn,char *str, unsigned int system)
{
int i;
int len,k;
len=strlen(str);
//Mov(0);
smt_part_Mov(pn,0);
for(i=0;i {
//Mov(Mul(system));
smt_whole_Mov(pn,smt_part_Mul(pn,system));
if((str[i]>='0')&&(str[i]<='9'))
k=str[i]-48;
else if((str[i]>='A')&&(str[i]<='F'))
k=str[i]-55;
else if((str[i]>='a')&&(str[i]<='f'))
k=str[i]-87;
else
k=0;
//Mov(Add(k));
smt_whole_Mov(pn,smt_part_Add(pn,k));
}
}
/****************************************************************************************
将大数按10进制或16进制格式输出为字符串
调用格式:N.Put(str,sys)
返回值:无,参数str被赋值为N的sys进制字符串
sys暂时只能为10或16
****************************************************************************************/
void smt_Put(CBigInt *pn,char *str, unsigned int system)
{
int i;
int a;
char ch;
CBigInt X;
CBigInt *px = &X;
X.m_nLength = 1;
for(i=0;i<BI_MAXLEN;i++)
X.m_ulValue[i]=0;
// char t[20]="0123456789ABCDEF";
if(((*pn).m_nLength==1)&&((*pn).m_ulValue[0]==0))
{
str="0";
return;
}
str="";
//X.Mov(*this);
smt_whole_Mov(px,pn);
while(X.m_ulValue[X.m_nLength-1]>0)
{
//a=X.Mod(system);
a=smt_part_Mod(px,system);
// ch=t[a];
// str.Insert(0,ch); //寰呰浆鎹?
// X.Mov(X.Div(system));
smt_whole_Mov(px,smt_part_Div(px,system));
}
}
#endif
/****************************************************************************************
求不定方程ax-by=1的最小整数解
调用方式:N.Euc(A)
返回值:X,满足:NX mod A=1
****************************************************************************************/
CBigInt* smt_Euc(CBigInt *pn,CBigInt *pa)
{
int i;
CBigInt M,E,X,Y,I,J;
int x,y;
CBigInt *pm = &M;
CBigInt *pe = &E;
CBigInt *px = &X;
CBigInt *py = &Y;
CBigInt *pi = &I;
CBigInt *pj = &J;
X.m_nLength = 1;
for(i=0;i<BI_MAXLEN;i++)
X.m_ulValue[i]=0;
Y.m_nLength = 1;
for(i=0;i<BI_MAXLEN;i++)
Y.m_ulValue[i]=0;
M.m_nLength = 1;
for(i=0;i<BI_MAXLEN;i++)
M.m_ulValue[i]=0;
E.m_nLength = 1;
for(i=0;i<BI_MAXLEN;i++)
E.m_ulValue[i]=0;
I.m_nLength = 1;
for(i=0;i<BI_MAXLEN;i++)
I.m_ulValue[i]=0;
J.m_nLength = 1;
for(i=0;i<BI_MAXLEN;i++)
J.m_ulValue[i]=0;
//M.Mov(A);
//E.Mov(*this);
//X.Mov(0);
//Y.Mov(1);
smt_whole_Mov(pm,pa);
smt_whole_Mov(pe,pn);
smt_part_Mov(px,0);
smt_part_Mov(py,1);
x=y=1;
while((E.m_nLength!=1)||(E.m_ulValue[0]!=0))
{
//I.Mov(M.Div(E));
//J.Mov(M.Mod(E));
//M.Mov(E);
//E.Mov(J);
//J.Mov(Y);
//Y.Mov(Y.Mul(I));
smt_whole_Mov(pi,smt_whole_Div(pm,pe));
smt_whole_Mov(pj,smt_whole_Mod(pm,pe));
smt_whole_Mov(pm,pe);
smt_whole_Mov(pe,pj);
smt_whole_Mov(pj,py);
smt_whole_Mov(py,smt_whole_Mul(py,pi));
if(x==y)
{
if(smt_Cmp(px,py)>=0)
//Y.Mov(X.Sub(Y));
smt_whole_Mov(py,smt_whole_Sub(px,py));
else
{
//Y.Mov(Y.Sub(X));
smt_whole_Mov(py,smt_whole_Sub(py,px));
y=0;
}
}
else
{
//Y.Mov(X.Add(Y));
smt_whole_Mov(py,smt_whole_Add(px,py));
x=1-x;
y=1-y;
}
//X.Mov(J);
smt_whole_Mov(px,pj);
}
if(x==0)
//X.Mov(A.Sub(X));
smt_whole_Mov(px,smt_whole_Sub(pa,px));
return px;
}
/****************************************************************************************
求乘方的模
调用方式:N.RsaTrans(A,B)
返回值:X=N^A MOD B
****************************************************************************************/
CBigInt* smt_RsaTrans(CBigInt *x,CBigInt *pa, CBigInt *pb)
{
CBigInt S,Y;
int i,j,k;
unsigned n;
unsigned long num;
CBigInt *pS = &S;
CBigInt *pY = &Y;
pS = init(pS);
pY = init(pY);
k=pa->m_nLength*16-16;
num=pa->m_ulValue[pa->m_nLength-1];
while(num)
{
num=num>>1;
k++;
}
//X.Mov(*this);
smt_whole_Mov(pS,x);
for(i=k-2;i>=0;i--)
{
//Y.Mov(X.Mul(X.m_ulValue[X.m_nLength-1]));
//Y.Mov(Y.Mod(B));
smt_whole_Mov(pY,smt_part_Mul(pS,S.m_ulValue[S.m_nLength-1]));
smt_whole_Mov(pY,smt_whole_Mod(pY,pb));
for(n=1;n<S.m_nLength;n++)
{
for(j=Y.m_nLength;j>0;j--)
Y.m_ulValue[j]=Y.m_ulValue[j-1];
Y.m_ulValue[0]=0;
Y.m_nLength++;
//Y.Mov(Y.Add(X.Mul(X.m_ulValue[X.m_nLength-n-1])));
//Y.Mov(Y.Mod(B));
smt_whole_Mov(pY,smt_whole_Add(pY,smt_part_Mul(pS,S.m_ulValue[S.m_nLength-n-1])));
smt_whole_Mov(pY,smt_whole_Mod(pY,pb));
}
//X.Mov(Y);
smt_whole_Mov(pS,pY);
//if((A.m_ulValue[i>>5]>>(i&31))&1)
if((pa->m_ulValue[i>>4]>>(i&7))&1) //?????
{
//Y.Mov(Mul(X.m_ulValue[X.m_nLength-1]));
//Y.Mov(Y.Mod(B));
smt_whole_Mov(pY,smt_part_Mul(x,S.m_ulValue[S.m_nLength-1]));
smt_whole_Mov(pY,smt_whole_Mod(pY,pb));
for(n=1;n<S.m_nLength;n++)
{
for(j=Y.m_nLength;j>0;j--)
Y.m_ulValue[j]=Y.m_ulValue[j-1];
Y.m_ulValue[0]=0;
Y.m_nLength++;
//Y.Mov(Y.Add(Mul(X.m_ulValue[X.m_nLength-n-1])));
//Y.Mov(Y.Mod(B));
smt_whole_Mov(pY,smt_whole_Add(pY,smt_part_Mul(x,S.m_ulValue[S.m_nLength-n-1])));
smt_whole_Mov(pY,smt_whole_Mod(pY,pb));
}
//X.Mov(Y);
smt_whole_Mov(pS,pY);
}
}
return pS;
}
/****************************************************************************************
拉宾米勒算法测试素数
调用方式:N.Rab()
返回值:若N为素数,返回1,否则返回0
****************************************************************************************/
int smt_Rab(CBigInt *pn)
{
unsigned i,j,pass;
CBigInt S,A,I,K;
CBigInt *ps = &S;
CBigInt *pa = &A;
CBigInt *pi = &I;
CBigInt *pk = &K;
S.m_nLength = 1;
for(i=0;i<BI_MAXLEN;i++)
S.m_ulValue[i]=0;
A.m_nLength = 1;
for(i=0;i<BI_MAXLEN;i++)
A.m_ulValue[i]=0;
I.m_nLength = 1;
for(i=0;i<BI_MAXLEN;i++)
I.m_ulValue[i]=0;
K.m_nLength = 1;
for(i=0;i<BI_MAXLEN;i++)
K.m_ulValue[i]=0;
for(i=0;i<550;i++)
{
//if(Mod(PrimeTable[i])==0)
if(smt_part_Mod(pn,PrimeTable[i])==0)
return 0;
}
//K.Mov(*this);
smt_whole_Mov(pk,pn);
K.m_ulValue[0]--;
for(i=0;i<5;i++)
{
pass=0;
//A.Mov(rand()*rand());
//S.Mov(K);
smt_part_Mov(pa,rand());
smt_whole_Mov(ps,pk);
while((S.m_ulValue[0]&1)==0)
{
for(j=0;j<S.m_nLength;j++)
{
S.m_ulValue[j]=S.m_ulValue[j]>>1;
if(S.m_ulValue[j+1]&1)
S.m_ulValue[j]=S.m_ulValue[j]|0x8000;
}
if(S.m_ulValue[S.m_nLength-1]==0)
S.m_nLength--;
//I.Mov(A.RsaTrans(S,*this));
smt_whole_Mov(pi,smt_RsaTrans(pa,ps,pn));
//if(I.Cmp(K)==0)
if(smt_Cmp(pi,pk)==0)
{
pass=1;
break;
}
}
if((I.m_nLength==1)&&(I.m_ulValue[0]==1))
pass=1;
if(pass==0)
return 0;
}
return 1;
}
/****************************************************************************************
产生随机素数
调用方法:N.GetPrime(bits)
返回值:N被赋值为一个bits位(0x100000000进制长度)的素数
****************************************************************************************/
CBigInt* smt_GetPrime()
{
int i;
unsigned c;
CBigInt X,S,A,I,K,M;
CBigInt *pX,*pS,*pA,*pI,*pK,*pM;
pX=&X;pS=&S;pA=&A;pI=&I;pK=&K;pM=&M;
pX = init(pX);
pS = init(pS);
pA = init(pA);
pI = init(pI);
pK = init(pK);
pM = init(pM);
pX->m_nLength=prime_length;
//c=23351;//(unsigned)time(NULL);
begin:
//srand(c);
for(i=0;i< X.m_nLength;i++)
X.m_ulValue[i]=abs(rand()%15536)+10000; //生成随机数
X.m_ulValue[0]=X.m_ulValue[0]|1; //按位或 将最后一位置为1,变为奇数
#if 1
for(i=X.m_nLength-1;i>0;i--)
{
X.m_ulValue[i]=X.m_ulValue[i]<<1;
if(X.m_ulValue[i-1]&0x8000)
X.m_ulValue[i]++;
}
X.m_ulValue[0]=X.m_ulValue[0]<<1;
X.m_ulValue[0]++;
for(i=0;i<550;i++)
{
//if(Mod(PrimeTable[i])==0)
if(smt_part_Mod(pX,PrimeTable[i])==0)
goto begin;
}
//K.Mov(*this);
smt_whole_Mov(pK,pX);
K.m_ulValue[0]--;
for(i=0;i<5;i++)
{
//A.Mov(rand()*rand());
//S.Mov(K.Div(2));
//I.Mov(A.RsaTrans(S,*this));
smt_part_Mov(pA,rand());
pM = smt_part_Div(pK,2);
//smt_whole_Mov(pS,smt_part_Div(pK,2));
//smt_whole_Mov(pS,pM);
smt_whole_Mov(pI,smt_RsaTrans(pA,pM,pK));
if(((I.m_nLength!=1)||(I.m_ulValue[0]!=1))&&(smt_Cmp(pI,pK)!=0))
goto begin;
}
#endif
return pX;
//smt_ON_log("PRIMER: %s\r\n",X.m_ulValue);
}
void main()
{
srand((unsigned)time(NULL));
smt_GetPrime();
#if 0
int j;
unsigned int m;
int a[10]={0};
m = (unsigned int)(Gserson_X+Gserson_Z);
//srand(m);
//srand((unsigned)time(NULL));
for(j=0;j<10;j++)
{
a[j]=rand();
}
smt_ON_log("a0: %d\r\n",a[0]);
smt_ON_log("a1: %d\r\n",a[1]);
smt_ON_log("a2: %d\r\n",a[2]);
smt_ON_log("a3: %d\r\n",a[3]);
smt_ON_log("a4: %d\r\n",a[4]);
smt_ON_log("a5: %d\r\n",a[5]);
smt_ON_log("a6: %d\r\n",a[6]);
smt_ON_log("a7: %d\r\n",a[7]);
smt_ON_log("a8: %d\r\n",a[8]);
smt_ON_log("a9: %d\r\n",a[9]);
#endif
}
#endif