能力值:
( LV12,RANK:779 )
2 楼
这是一个512 bit的素数, 16进制字符串表示: P .hex = D4B49D04A01EF209121C370DCF0D6292569EC65B8F147A8C62319B6B90DEA2D1CD45199B93582732BFEE27F40BF62D7EB2559BCD08041E301E0D14037A25D989 10进制打印是这个: P.dec = 11140292070079840223478293553825852579756307272457526758455407348073991859638132039548754407195116517701496420375917235366272153337274234749677181046479241
能力值:
( LV2,RANK:10 )
3 楼
定义p的值应该是多少。。。。。 我觉得你应该想把P当数组。然后想问数组的大小。要求是C++不是C,所以Big应该是你封装接受数的类,至少是 explicit Big::Big(const std::wstring & data) ; 这样一个模型 然后把数据往 vector<UCHAR>里面塞。
能力值:
( LV2,RANK:10 )
4 楼
我个人倾向于readyu的说法,因为p不是数组,是微软椭圆签字的公钥
能力值:
( LV2,RANK:10 )
5 楼
但是我认为p的十进制结尾不是1, 因该是7才对。
能力值:
( LV2,RANK:10 )
6 楼
已知osid为5080936, p为D4B49D04A01EF209121C370DCF0D6292569EC65B8F147A8C62319B6B90DEA2D1CD45199B93582732BFEE27F40BF62D7EB2559BCD08041E301E0D14037A25D989,a为1,b为0,gx为828A23E65A03F2CE12342DC2B3AA4089C1447DD5C4DC36C0470885A4662F10187037F72B2216C3F671B434267A329BD3363BB27055F0EBBA8A0ABEF451D3F6A3,gy为23B0823295C9CB669E1643B298624083F68C58F14FEEC55D0B247EF37B353A1066F502D7BC71050056C7D006156A26CC9222F5135FB8B255D7773AE0CDCA31E2,kx为25FEB90513F63C0833F1096369149E65C9359F4BCC8DE9A8F647030F96485BC71929594FF369DB967910B8F0A59BC7C30CF0D38311486293BA0B2952EE648E5F,ky为A186A2C2913E5584F05E97D3CD49E354E6C41BE329877D7FCC7B2BF877A0B00C9298901D305D7FF012FF7902B4202D4ED64D6A90C6AD05960253BAB8F69D68BF,q为41601E16BF4A1621,k为29AD943EA2EA15,却无法计算出正确的hash值5AA62EB和Sign值564E8259,能否帮忙看看下面的算法是否有问题? char szKey[30] = {0}; Miracl precision( 0x64, 0 ); miracl *mip = &precision; mip->IOBASE = 0x10; Big p( "D4B49D04A01EF209121C370DCF0D6292569EC65B8F147A8C62319B6B90DE" "A2D1CD45199B93582732BFEE27F40BF62D7EB2559BCD08041E301E0D14037A25D989" ); Big a( "1" ); Big b( "0" ); Big gx( "828A23E65A03F2CE12342DC2B3AA4089C1447DD5C4DC36C0470885A4662F" "10187037F72B2216C3F671B434267A329BD3363BB27055F0EBBA8A0ABEF451D3F6A3" ); Big gy( "23B0823295C9CB669E1643B298624083F68C58F14FEEC55D0B247EF37B35" "3A1066F502D7BC71050056C7D006156A26CC9222F5135FB8B255D7773AE0CDCA31E2" ); Big kx( "25FEB90513F63C0833F1096369149E65C9359F4BCC8DE9A8F647030F9648" "5BC71929594FF369DB967910B8F0A59BC7C30CF0D38311486293BA0B2952EE648E5F" ); Big ky( "A186A2C2913E5584F05E97D3CD49E354E6C41BE329877D7FCC7B2BF877A0" "B00C9298901D305D7FF012FF7902B4202D4ED64D6A90C6AD05960253BAB8F69D68BF" ); Big q( "41601E16BF4A1621" ); Big k( "29AD943EA2EA15" ); int i, j; Big sn, prefix, sign, hash, osid; if( bFirstRun ) srand( (unsigned int)time(NULL) ); // 只在第一次运行时初始化随机函数 prefix = rand() % 0x400; osid = "0500"; Big upperlimit = "4000000000000000"; if( bFirstRun ) irand( (unsigned)time(NULL) ); // 只在第一次运行时初始化随机函数 while( 1 ) { sha sh; unsigned char buf[128], s[11], m[131], sha_out[20]; unsigned long dw; ecurve( a, b, p, MR_PROJECTIVE ); ECn G( gx, gy ), K( kx, ky ), R; Big rx, ry; Big r = rand( q ); R = r*G; R.get( rx, ry ); m[0] = 0x79; to_binary( osid, 2, (char*)buf, TRUE ); m[1] = buf[1]; m[2] = buf[0]; to_binary( rx, 64, (char*)buf, FALSE ); for ( i=63,j=3; i>=0; i--,j++ ) m[j] = buf; to_binary( ry, 64, (char*)buf, FALSE ); for ( i=63,j=67; i>=0; i--,j++ ) m[j] = buf; shs_init( &sh ); for( i=0; i<131; i++ ) shs_process( &sh, m ); shs_hash( &sh, (char*)sha_out ); memcpy( &dw, sha_out, 4 ); dw = dw & 0x7FFFFFFF; hash = (long)dw; s[0] = 0x5D; to_binary( osid, 2, (char*)buf, TRUE ); s[1] = buf[1]; s[2] = buf[0]; s[3] = dw & 0xff; s[4] = dw>>8 & 0xff; s[5] = dw>>16 & 0xff; s[6] = dw>>24 & 0xff; to_binary( prefix, 2, (char*)buf, TRUE ); s[7] = buf[1]; s[8] = buf[0]; s[9] = 0x00; s[10] = 0x00; shs_init( &sh ); for( i=0; i<11; i++ ) shs_process( &sh, s ); shs_hash( &sh, (char*)sha_out ); memcpy( &dw, sha_out+4, 4 ); dw = dw>>2; Big hout = (long)dw; memcpy( &dw, sha_out, 4 ); hout = (hout<<32) + (long)dw; Big kh = k*hout*(q+1)/2; Big kr = ( pow( kh, 2 ) + r ) % q; Big sr = sqrt( kr, q ); // 求平方根,失败的几率很大 if( sr == 0 ) continue; // 如果sqrt运行失败 sign = ( sr - kh ) % q; while( sign < 0 ) sign += q; // sign不会是负数 if( sign < upperlimit ) break; // 如果sign在允许的范围内 } sn = prefix; sn = (sn<<62) + sign; sn = (sn<<31) + hash; sn = (sn<<11) + osid;
能力值:
( LV2,RANK:10 )
7 楼
很想知道楼主是否解决问题了?