Advertisement
Guest User

Untitled

a guest
Mar 28th, 2011
359
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.13 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #include <gmp.h>
  6.  
  7. mpz_t p, q;
  8. mpz_t n, eiler;
  9. mpz_t e, d;
  10. mpz_t k;
  11.  
  12. /*mpz_class power(mpz_class t, mpz_class k)
  13. {
  14. // возведение t в степень k
  15.   mpz_class res = 1;
  16.   while (k != 0) {
  17.         if (k & 1) res *= t;
  18.         t *= t;
  19.         k >>= 1;
  20.   }
  21.   return res;
  22. }*/
  23.  
  24. void generateKeys(mpz_t np, mpz_t nq, mpz_t ne, mpz_t k)
  25. {
  26.     mpz_t temp1, temp2, one;
  27.     mpz_set(p, np);
  28.     mpz_set(q, nq);
  29.  
  30.     mpz_init(temp1);
  31.     mpz_init(temp2);
  32.     mpz_init(one);
  33.  
  34.     mpz_set_ui(one, 1);
  35.     mpz_sub(temp1, p, one);
  36.     mpz_sub(temp2, q, one);
  37.  
  38.     mpz_mul(n, p, q);
  39.     mpz_mul(eiler, temp1, temp2);
  40.  
  41.     mpz_set(e, ne);
  42.  
  43.     mpz_mul(temp1, k, eiler);
  44.     mpz_add(temp1, one, temp1);
  45.     mpz_cdiv_q(d, temp1, e);
  46.  
  47.     mpz_clear(temp1);
  48.     mpz_clear(temp2);
  49.     mpz_clear(one);
  50. }
  51.  
  52. void Pa(mpz_t result, int m)
  53. {
  54.     //gmp_printf("enc: %d %d %d %d\n", m, e, power(m, e), n);
  55.     mpz_t temp;
  56.     mpz_init_set_si(temp, m);
  57.     mpz_powm (result, temp, e, n);
  58.     mpz_clear(temp);
  59.     //return power(m, e) % n;
  60. }
  61.  
  62. void Sa(mpz_t result, mpz_t c)
  63. {
  64.     //gmp_printf("dec: %d %d %d %d\n", c, d, power(c, d), n);
  65.     //return power(c, d) % n;
  66.     mpz_powm (result, c, d, n);
  67. }
  68.  
  69. int main(int argc, char *argv[])
  70. {
  71.     if(argc<6)
  72.     {
  73.         gmp_printf("Usage: rsa_console p q e k \"text\"\n");
  74.     }
  75.     else
  76.     {
  77.         mpz_t result;
  78.         mpz_init(p);
  79.         mpz_init(q);
  80.         mpz_init(n);
  81.         mpz_init(eiler);
  82.         mpz_init(e);
  83.         mpz_init(d);
  84.         mpz_init(k);
  85.         mpz_init(result);
  86.         mpz_set_str(p, argv[1], 10);
  87.         mpz_set_str(q, argv[2], 10);
  88.         mpz_set_str(e, argv[3], 10);
  89.         mpz_set_str(k, argv[4], 10);
  90.  
  91.         gmp_printf("\np=%s, q=%s, e=%s, k=%s", argv[1], argv[2], argv[3], argv[4]);
  92.         gmp_printf("\np=%d, q=%d, e=%d, k=%d\n\n", p, q, e, k);
  93.  
  94.         gmp_printf("Generating keys...\n\n");
  95.  
  96.         generateKeys(p, q, e, k);
  97.  
  98.         gmp_printf("n=%d, d=%d, e=%d\n\n", n, d, e);
  99.  
  100.         gmp_printf("Public Key: (%d, %d)\n", e, n);
  101.         gmp_printf("Private Key: (%d, %d)\n", d, n);
  102.  
  103.         Pa(result, 111111);
  104.         gmp_printf("%d\n", result);
  105.         Sa(result, result);
  106.         gmp_printf("%d\n", result);
  107.  
  108.         char * text = new char[strlen(argv[5])];
  109.         mpz_t * encoded = new mpz_t[strlen(argv[5])];
  110.         char * decoded = new char[strlen(argv[5])];
  111.  
  112.         strcpy(text, argv[5]);
  113.  
  114.         gmp_printf("Original text:\n");
  115.         gmp_printf("%s\n\n", text);
  116.  
  117.         gmp_printf("Encoded text:\n");
  118.  
  119.         for(int i=0;i<strlen(text);i++)
  120.         {
  121.             Pa(result, text[i]);
  122.             mpz_set(encoded[i], result);
  123.         }
  124.  
  125.         gmp_printf("\n\n");
  126.  
  127.         for(int i=0;i<strlen(text);i++)
  128.         {
  129.             Sa(result, encoded[i]);
  130.             decoded[i] = mpz_get_ui(result);
  131.         }
  132.  
  133.         gmp_printf("Decoded text:\n");
  134.         gmp_printf("%s\n", decoded);
  135.  
  136.         delete[] text;
  137.         delete[] encoded;
  138.         delete[] decoded;
  139.         mpz_clear(p);
  140.         mpz_clear(q);
  141.         mpz_clear(n);
  142.         mpz_clear(eiler);
  143.         mpz_clear(e);
  144.         mpz_clear(d);
  145.         mpz_clear(k);
  146.         mpz_clear(result);
  147.     }
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement