Advertisement
cd62131

rsa.cpp

Jan 27th, 2019
517
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <vector>
  4. #include <ctime>
  5. #include <cmath>
  6.  
  7. using namespace std;
  8.  
  9. #define PRIME_NUM_RANGE 10000
  10.  
  11. int gcd( int m, int n );
  12. int lcm( int m, int n );
  13. bool isPrimeNum( int num );
  14. void listPrimeNum( void );
  15. int extEuqlid( int a, int b );
  16.  
  17. vector<int> primeNumAry;
  18.  
  19. int main( void ) {
  20.  
  21.   srand( (unsigned int)time( NULL ) );
  22.  
  23.   listPrimeNum();
  24.   int pNum = primeNumAry.size();
  25.  
  26.   // 異なる素数 p, q の用意
  27.   int p, q;
  28.   do {
  29.     p = primeNumAry[ rand() % pNum ];
  30.     q = primeNumAry[ rand() % pNum ];
  31.   } while( p == q );
  32.  
  33.   // 公開鍵 n
  34.   int n = p * q;
  35.  
  36.   // 最小公倍数 m
  37.   int m = lcm( p - 1, q - 1 );
  38.  
  39.   // 公開鍵 e
  40.   int e = 2;
  41.   while( gcd( m, e ) != 1 ) e++;
  42.  
  43.   // 秘密鍵 d
  44.   int d = extEuqlid( e, m );
  45.  
  46.   cout << "p (Prime number): " << p << endl;
  47.   cout << "q (Prime number): " << q << endl;
  48.   cout << "n (Public key)  : " << n << endl;
  49.   cout << "m (LCM(p-1,q-1)): " << m << endl;
  50.   cout << "e (Public key)  : " << e << endl;
  51.   cout << "d (Secret key)  : " << d << endl;
  52.  
  53.   return 0;
  54. }
  55.  
  56. /* 最大公約数を求める関数 */
  57. int gcd( int m, int n ) {
  58.  
  59.   if( n == 0 ) {
  60.     return m;
  61.   } else {
  62.     return gcd( n, m % n );
  63.   }
  64. }
  65.  
  66. /* 最小公倍数を求める関数 */
  67. int lcm( int m, int n ) {
  68.  
  69.   return m * n /  gcd( m, n );
  70. }
  71.  
  72. /* 素数判定の関数 */
  73. bool isPrimeNum( int num ) {
  74.  
  75.   if( num <= 1 ) {
  76.     return false;
  77.   }
  78.  
  79.   int n = (int)sqrt( (double)num );
  80.  
  81.   for( int  i = 2; i <= n; i++ ){
  82.  
  83.     if( num % i == 0 ) {
  84.       return false;
  85.     }
  86.   }
  87.   return true;
  88. }
  89.  
  90. /* 素数をリストアップする関数 */
  91. void listPrimeNum( void ) {
  92.  
  93.   for( int i = 2; i <= PRIME_NUM_RANGE; i++ ) {
  94.     if( isPrimeNum( i ) ) {
  95.       primeNumAry.push_back( i );
  96.     }
  97.   }
  98. }
  99.  
  100. /* 拡張ユーグリッド互除法 */
  101. int extEuqlid( int a, int b ) {
  102.  
  103.   int x1 = 0, y1 = 1, r1 = b;
  104.   int x2 = 1, y2 = 0, r2 = a;
  105.  
  106.   int d;
  107.  
  108.   while( true ) {
  109.  
  110.     int q = r1 / r2;
  111.     int r = r1 % r2;
  112.     int x = x1 - x2 * q;
  113.     int y = y1 - y2 * q;
  114.  
  115.     if( r == 0 ) {
  116.       d = x2;
  117.       break;
  118.     }
  119.  
  120.     x1 = x2; y1 = y2; r1 = r2;
  121.     x2 =  x; y2 =  y; r2 =  r;
  122.   }
  123.  
  124.   while( d <= 0 ) d += b;
  125.  
  126.   return d;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement