rsa_san.cpp
上传用户:sjzccgj
上传日期:2014-10-18
资源大小:17k
文件大小:9k
源码类别:

CA认证

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. // This is a slow but easy RSA encryption class
  3. // By sanicle,2005.12 
  4. // 3mn@3mn.net
  5. #include "stdio.h"
  6. #include "rsa_san.h"
  7. class Prime_factory_san
  8. {
  9.   unsigned np;
  10.   unsigned *pl;
  11.   public:
  12.   Prime_factory_san();
  13.   ~Prime_factory_san();
  14.   vlong find_prime( vlong & start );
  15. };
  16. // prime factory implementation
  17. static int is_probable_prime_san( const vlong &p )
  18. {
  19.   // Test based on Fermats theorem a**(p-1) = 1 mod p for prime p
  20.   // For 1000 bit numbers this can take quite a while
  21.   const rep = 4;
  22.   const unsigned any[rep] = { 2,3,5,7 };
  23.   for ( unsigned i=0; i<rep; i+=1 )
  24.     if ( modexp( any[i], p-vlong(1), p ) != vlong(1) )
  25.       return 0;
  26.   return 1;
  27. }
  28. Prime_factory_san::Prime_factory_san()
  29. {
  30.   np = 0;
  31.   unsigned NP = 200;
  32.   pl = new unsigned[NP];
  33.   // Initialise pl
  34.   unsigned SS = 8*NP; // Rough estimate to fill pl
  35.   char * b = new char[SS+1]; // one extra to stop search
  36.   for (unsigned i=0;i<=SS;i+=1) b[i] = 1;
  37.   unsigned p = 2;
  38.   while (1)
  39.   {
  40.     // skip composites
  41.     while ( b[p] == 0 ) p += 1;
  42.     if ( p == SS ) break;
  43.     pl[np] = p;
  44.     np += 1;
  45.     if ( np == NP ) break;
  46.     // cross off multiples
  47.     unsigned c = p*2;
  48.     while ( c < SS )
  49.     {
  50.       b[c] = 0;
  51.       c += p;
  52.     }
  53.     p += 1;
  54.   }
  55.   delete [] b;
  56. }
  57. Prime_factory_san::~Prime_factory_san()
  58. {
  59.   delete [] pl;
  60. }
  61. vlong Prime_factory_san::find_prime( vlong & start )
  62. {
  63.   unsigned SS = 1000; // should be enough unless we are unlucky
  64.   char * b = new char[SS]; // bitset of candidate primes
  65.   unsigned tested = 0;
  66.   while (1)
  67.   {
  68.     unsigned i;
  69.     for (i=0;i<SS;i++)
  70.       b[i] = 1;
  71.     for (i=0;i<np;i++)
  72.     {
  73.       unsigned p = pl[i];
  74.       unsigned r = start % vlong(p); // not as fast as it should be - could do with special routine
  75.       if (r) r = p - r;
  76.       // cross off multiples of p
  77.       while ( r < SS )
  78.       {
  79.         b[r] = 0;
  80.         r += p;
  81.       }
  82.     }
  83.     // now test candidates
  84.     for (i=0;i<SS;i++)
  85.     {
  86.       if ( b[i] )
  87.       {
  88.         tested += 1;
  89.         if ( is_probable_prime_san(start) )
  90.           return start;
  91.       }
  92.       start += 1;
  93.     }
  94.   }
  95.   delete [] b;
  96. }
  97. RSA_san::RSA_san()
  98. {
  99. // init vars
  100. prime_table_use=0;
  101. prime_p_index=0;
  102. prime_q_index=1;
  103. char *tmp;
  104. tmp="1234567890qwertyuiopasdfghjklzxcvb";
  105. for(int i=0;i<36;i++)
  106. r1[i]=tmp[i];
  107. tmp="9876543210poiuytrewqlkjhgfdsamnbvc";
  108. for(i=0;i<36;i++)
  109. r2[i]=tmp[i];
  110. // find primes p q
  111. find_prime();
  112. // mul to get n
  113. n = p*q;
  114. // get a public key
  115. random_e();
  116. // calculate the private key
  117. calculate_d();
  118. }
  119. RSA_san::~RSA_san()
  120. {
  121. }
  122. static vlong from_str_san( const char * s )
  123. {
  124.   vlong x = 0;
  125.   while (*s)
  126.   {
  127.     x = x * vlong(256) + vlong((unsigned char)*s);
  128.     s += 1;
  129.   }
  130.   return x;
  131. }
  132. void RSA_san::find_prime()
  133. {
  134. // Choose primes
  135.     Prime_factory_san pf;
  136. if (prime_table_use==0)
  137. {
  138. p = pf.find_prime( from_str_san(r1) );
  139. q = pf.find_prime( from_str_san(r2) );
  140. }
  141. else
  142. {
  143. p = prime_table[prime_p_index];
  144. q = prime_table[prime_q_index];
  145. }
  146.     if ( p > q ) { vlong tmp = p; p = q; q = tmp; }
  147. }
  148. void RSA_san::random_e()
  149. {
  150. e = 50001; // must be odd since p-1 and q-1 are even
  151.     while ( gcd(p-vlong(1),e) != vlong(1) || gcd(q-vlong(1),e) != vlong(1) ) e += 2;
  152. }
  153. void RSA_san::calculate_d()
  154. {
  155. d = modinv(e,(p-vlong(1))*(q-vlong(1)));
  156. }
  157. vlong RSA_san::encrypt( const vlong& x )
  158. {
  159. return modexp(x,e,n);
  160. }
  161. vlong RSA_san::decrypt( const vlong& y )
  162. {
  163. return modexp(y,d,n);
  164. }
  165. int RSA_san::RSA_san_en(char * s,unsigned n)
  166. {
  167. vlong t = 0;
  168. result = 0;
  169. for(unsigned i=0;i<n;i++)
  170. {
  171. t = t * vlong(256) + vlong((unsigned char)*s);
  172. s += 1;
  173. }
  174. result=encrypt(t);
  175. return 1;
  176. }
  177. int RSA_san::RSA_san_en_byte(char b)
  178. {
  179.     result=0;
  180. result=encrypt(vlong((unsigned char)b));
  181. return 1;
  182. }
  183. int RSA_san::RSA_san_dn(char * s,unsigned n)
  184. {
  185. vlong t = 0;
  186. result = 0;
  187. for(unsigned i=0;i<n;i++)
  188. {
  189. t = t * vlong(256) + vlong((unsigned char)*s);
  190. s += 1;
  191. }
  192. result=decrypt(t);
  193. return 1;
  194. }
  195. int RSA_san::RSA_san_dn_hexstring(char * s)
  196. {
  197. unsigned i=0;
  198. vlong t = 0;
  199. result = 0;
  200. while(*s)
  201. {
  202. switch(*s)
  203. {
  204. case '0':i=0;break;
  205. case '1':i=1;break;
  206. case '2':i=2;break;
  207. case '3':i=3;break;
  208. case '4':i=4;break;
  209. case '5':i=5;break;
  210. case '6':i=6;break;
  211. case '7':i=7;break;
  212. case '8':i=8;break;
  213. case '9':i=9;break;
  214. case 'A':i=10;break;
  215. case 'B':i=11;break;
  216. case 'C':i=12;break;
  217. case 'D':i=13;break;
  218. case 'E':i=14;break;
  219. case 'F':i=15;break;
  220. }
  221. t = t * vlong(16) + vlong(i);
  222. s += 1;
  223. }
  224. result=decrypt(t);
  225. return 1;
  226. }
  227. int RSA_san::RSA_san_en_hexstring(char * s)
  228. {
  229. unsigned i=0;
  230. vlong t = 0;
  231. result = 0;
  232. while(*s)
  233. {
  234. switch(*s)
  235. {
  236. case '0':i=0;break;
  237. case '1':i=1;break;
  238. case '2':i=2;break;
  239. case '3':i=3;break;
  240. case '4':i=4;break;
  241. case '5':i=5;break;
  242. case '6':i=6;break;
  243. case '7':i=7;break;
  244. case '8':i=8;break;
  245. case '9':i=9;break;
  246. case 'A':i=10;break;
  247. case 'B':i=11;break;
  248. case 'C':i=12;break;
  249. case 'D':i=13;break;
  250. case 'E':i=14;break;
  251. case 'F':i=15;break;
  252. }
  253. t = t * vlong(16) + vlong(i);
  254. s += 1;
  255. }
  256. result=encrypt(t);
  257. return 1;
  258. }
  259. int RSA_san::set_e(char * r)
  260. {
  261. e = 0;
  262. while (*r)
  263. {
  264. e = e * vlong(256) + vlong((unsigned char)*r);
  265. r += 1;
  266. }
  267. if(e%vlong(2)==vlong(0))e-=1;
  268. while ( gcd(p-vlong(1),e) != vlong(1) || gcd(q-vlong(1),e) != vlong(1) ) e += 2;
  269. calculate_d();
  270. return 1;
  271. }
  272. int RSA_san::force_e(char * r,unsigned len)
  273. {
  274. e = 0;
  275. p=0;q=0;
  276. for(unsigned i=0;i<len;i++)
  277. {
  278. e = e * vlong(256) + vlong((unsigned char)*(r+i));
  279. }
  280. return 1;
  281. }
  282. int RSA_san::force_d(char * r,unsigned len)
  283. {
  284. d = 0;
  285. p=0;q=0;
  286. for(unsigned i=0;i<len;i++)
  287. {
  288. d = d * vlong(256) + vlong((unsigned char)*(r+i));
  289. }
  290. return 1;
  291. }
  292. int RSA_san::force_n(char * r,unsigned len)
  293. {
  294. n = 0;
  295. p=0;q=0;
  296. for(unsigned i=0;i<len;i++)
  297. {
  298. n = n * vlong(256) + vlong((unsigned char)*(r+i));
  299. }
  300. return 1;
  301. }
  302. int RSA_san::update_pq(char * ra,char * rb)
  303. {
  304. for(int i=0;i<35;i++)
  305. {
  306. if(ra[i])r1[i]=ra[i];else r1[i]='A';
  307. if(rb[i])r2[i]=rb[i];else r2[i]='B'; //should provent string interrupt like this~
  308. }
  309. find_prime();
  310. n = p*q;
  311. if(e%vlong(2)==vlong(0))e-=1;
  312. while ( gcd(p-vlong(1),e) != vlong(1) || gcd(q-vlong(1),e) != vlong(1) ) e += 2;
  313. calculate_d();
  314. return 1;
  315. }
  316. char* RSA_san::string2hexstring(char * s)//,unsigned len)
  317. {
  318. unsigned len=35; // only use this function like this in this situation:)
  319. char *ps;
  320. char *p;
  321. ps=new char[len*2+2];
  322. p=ps;
  323. for(unsigned i=0;i<len;i++)
  324. {
  325. p[0]='0';p[1]='0';
  326. sprintf(p,"%X",s[i]);
  327. if(p[1]=='')
  328. {
  329. p[1]=p[0];
  330. p[0]='0';
  331. }
  332. p+=2;
  333. }
  334. *p='';
  335. return ps;
  336. }
  337. char* RSA_san::hexstring2string(char * h)
  338. {
  339. // if hexstring has 0 byte in it ,...be careful about '' 
  340. unsigned i,id;
  341. char *ph;
  342. char *t;
  343. id=0;
  344. i=(unsigned)strlen(h);
  345. t=new char[i];
  346. if(i%2)
  347. {
  348. ph=new char[i+1];
  349. *ph='0';
  350. ph++;
  351. for(unsigned j=0;j<i;j++)ph[j]=h[j];
  352. ph[i]='';
  353. ph--;
  354. }
  355. else ph=h;
  356. while(*ph)
  357. {
  358. switch(*ph)
  359. {
  360. case '0':i=0;break;
  361. case '1':i=16;break;
  362. case '2':i=32;break;
  363. case '3':i=48;break;
  364. case '4':i=64;break;
  365. case '5':i=80;break;
  366. case '6':i=96;break;
  367. case '7':i=112;break;
  368. case '8':i=128;break;
  369. case '9':i=144;break;
  370. case 'A':i=160;break;
  371. case 'B':i=176;break;
  372. case 'C':i=192;break;
  373. case 'D':i=208;break;
  374. case 'E':i=224;break;
  375. case 'F':i=240;break;
  376. }
  377. switch(*(ph+1))
  378. {
  379. case '0':i+=0;break;
  380. case '1':i+=1;break;
  381. case '2':i+=2;break;
  382. case '3':i+=3;break;
  383. case '4':i+=4;break;
  384. case '5':i+=5;break;
  385. case '6':i+=6;break;
  386. case '7':i+=7;break;
  387. case '8':i+=8;break;
  388. case '9':i+=9;break;
  389. case 'A':i+=10;break;
  390. case 'B':i+=11;break;
  391. case 'C':i+=12;break;
  392. case 'D':i+=13;break;
  393. case 'E':i+=14;break;
  394. case 'F':i+=15;break;
  395. }
  396. t[id]=i;
  397. id++;
  398. ph+=2;
  399. }
  400. t[id]='';
  401. return t;
  402. }
  403. char* RSA_san::vlong2hexstring( const vlong& v )
  404. {
  405. unsigned z,t,j,l;
  406. char st[9];
  407. char *ps;
  408. j=0;
  409. z=v.get_z()-1;
  410. for(int i=z;i>=0;i--)
  411. {
  412. t=v.get(i);
  413. //t to hex and save in char s[]
  414. for(int m=0;m<8;m++)st[m]='';
  415. sprintf(st,"%X",t);
  416. l=(unsigned)strlen(st);
  417. if(l!=8)
  418. {
  419. for(int m=0;m<8;m++)st[m]='0';
  420. sprintf(st+8-l,"%X",t);
  421. }
  422. for(int k=0;k<8;k++)
  423. {
  424. if(st[k]=='')st[k]='0';
  425. s[j]=st[k];
  426. j++;
  427. }
  428. }
  429. s[j]='';
  430. ps=s;
  431. while(*ps=='0')ps++;
  432. if(*ps=='')ps--;
  433. return ps;
  434. }
  435. /*
  436. unsigned* RSA_san::vlong2ints( const vlong& v )
  437. {
  438. unsigned z,j;
  439. j=0;
  440. z=v.get_z()-1;
  441. for(int i=z;i>=0;i--,j++)
  442. {
  443. u[j]=v.get(i);
  444. }
  445. u[j]=0;
  446. return u;
  447. }
  448. */
  449. char* RSA_san::vlong2shortints( const vlong& v )
  450. {
  451. // use this function only when RSA result has no '' in it!
  452. unsigned z,j;
  453. char *pi;
  454. j=0;
  455. z=v.get_z()-1;
  456. for(int i=z;i>=0;i--,j++)
  457. {
  458. u[j]=v.get(i);
  459. }
  460. u[j]=0;
  461. pi=(char *)u;
  462. while(!*pi)pi++;
  463. return pi;
  464. }