Advertisement
melnikovmaxim

BORSCHT_lab7_asymmetric cipher

Dec 16th, 2019
339
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.73 KB | None | 0 0
  1. //link https://yadi.sk/d/qbiPvZ7pAGif5A
  2. //RSA шифр
  3. #include "stdafx.h"
  4. #include <NTL/ZZ.h>
  5. #include <fstream>
  6. #include <iostream>
  7. #include <math.h>
  8. #include <cstdlib>
  9. #include  <sstream>
  10. #include <string>
  11. NTL_CLIENT
  12.  
  13. #pragma comment( lib, "NTL.lib" )
  14. using namespace NTL;
  15. int y = 0;
  16. ZZ* arr;
  17. int x = 0;
  18. bool i = false;
  19. int symbcount(ZZ n){ //подсчет символов для задания массива
  20.     int x;
  21. int c;
  22. y = 0;
  23. x = -1;
  24. ifstream one("text.txt");
  25. if (one.is_open()){
  26.     while (!one.eof())
  27.     {
  28.         c = one.get();
  29.         if (c < 0)
  30.             c += 256;
  31.         if (c > n){
  32.             y++;
  33.         }
  34.         if (c / 10 > n){
  35.             y++;
  36.         }
  37.         x++;
  38.     }
  39.     one.close();
  40.     y += x;
  41. }
  42. else
  43. x = -2;
  44. return x;
  45. }
  46.  
  47. ZZ modinv(ZZ x, ZZ y){
  48.     ZZ b, c, i, j, x1, y1;
  49.     b = y;
  50.     c = x;
  51.     i = 0;
  52.     j = 1;
  53.  
  54.     while (c != 0){
  55.         x1 = b / c;
  56.         y1 = b%c;
  57.         b = c;
  58.         c = y1;
  59.         y1 = j;
  60.         j = i - j*x1;
  61.         i = y1;
  62.  
  63.     }
  64.     if (i < 0)
  65.         i += y;
  66.     return i;
  67. }
  68.  
  69. ZZ rec(ZZ ka){
  70.     ZZ k;
  71.     bool b;
  72.     b = false;
  73.  
  74.     for (k = ka - 1; k > 2; k--){
  75.         if (ka%k == 0)
  76.             b = true;
  77.     }
  78.  
  79.     if (b == true)
  80.         ka = rec(ka -= 1);
  81.  
  82.     return ka;
  83.  
  84. }
  85.  
  86. void TxtInArr(int** ascii, int a, ZZ n){
  87.     ifstream onet("text.txt");
  88.     int cc;
  89.     for (int k = 0; k < a; k++){
  90.         ascii[k] = new int[2];
  91.         cc = onet.get();
  92.        
  93.         if (cc < 0)
  94.             cc += 256;
  95.  
  96.         if (cc >= n){
  97.             if (cc / 10 < n){
  98.                 ascii[k][0] = cc / 10;
  99.                 ascii[k][1] = cc % 10;
  100.                 ascii[k][2] = -1;
  101.             }
  102.             else {
  103.                 ascii[k][0] = cc / 100;
  104.                 ascii[k][1] = (cc % 100) / 10;
  105.                 ascii[k][2] = (cc % 100) % 10;
  106.             }
  107.         }
  108.         else
  109.         {
  110.             ascii[k][0] = cc;
  111.             ascii[k][1] = -1;
  112.             ascii[k][2] = -1;
  113.         }
  114.  
  115.     }
  116.     onet.close();
  117. }
  118.  
  119. void enc(ZZ* zzbuff, int** ascii, int a, ZZ e, ZZ n){
  120.     int yz = -1;
  121.     ZZ f;
  122.     ofstream out2("Chipher_text.txt");
  123.     out2 << a;
  124.     out2 << " ";
  125.     for (int k = 0; k < a; k++){
  126.         yz++;
  127.         if (ascii[k][1] == -1){
  128.             f = ascii[k][0];
  129.             zzbuff[yz] = PowerMod(f, e, n);
  130.         }
  131.         else if (ascii[k][1] != -1 && ascii[k][2] == -1){
  132.  
  133.             f = ascii[k][0];
  134.             zzbuff[yz] = PowerMod(f, e, n);
  135.             yz++;
  136.             f = ascii[k][1];
  137.             zzbuff[yz] = PowerMod(f, e, n);
  138.  
  139.         }
  140.         else if (ascii[k][1] != -1 && ascii[k][2] != -1)
  141.         {
  142.  
  143.             f = ascii[k][0];
  144.             zzbuff[yz] = PowerMod(f, e, n);
  145.             yz++;
  146.             f = ascii[k][1];
  147.             zzbuff[yz] = PowerMod(f, e, n);
  148.             yz++;
  149.             f = ascii[k][2];
  150.             zzbuff[yz] = PowerMod(f, e, n);
  151.         }
  152.     }
  153.     out2 << yz+2;
  154.     out2 << " ";
  155.     out2 << (char)10;
  156.     for (int k = 0; k < yz+2; k++){
  157.         out2 << zzbuff[k];
  158.         out2 << " ";
  159.     }
  160.     out2.close();
  161. }
  162.  
  163. void dec(ZZ* zzbuff, int** ascii,ZZ* unshifr, int a, ZZ d,ZZ n){
  164.     int yz;
  165.     yz = -1;
  166.     ZZ f;
  167.     ofstream out2("DecNumSymb.txt");
  168.     for (int k = 0; k < a; k++){
  169.         yz++;
  170.         if (ascii[k][1] == -1){
  171.             f = zzbuff[yz];
  172.             if (f >= n){
  173.                 i = true;
  174.                 break;
  175.             }
  176.             unshifr[k] = PowerMod(f, d, n);
  177.            
  178.         }
  179.         else if (ascii[k][1] != -1 && ascii[k][2] == -1)
  180.         {
  181.             f = zzbuff[yz];
  182.             if (f >= n){
  183.                 i = true;
  184.                 break;
  185.             }
  186.             unshifr[k] = PowerMod(f, d, n);
  187.             yz++;
  188.             f = zzbuff[yz];
  189.             if (f >= n){
  190.                 i = true;
  191.                 break;
  192.             }
  193.             unshifr[k] = (unshifr[k] * 10) + PowerMod(f, d, n);
  194.            
  195.         }
  196.         else if (ascii[k][1]!=-1 && ascii[k][2]!=-1){
  197.             f = zzbuff[yz];
  198.             if (f >= n){
  199.                 i = true;
  200.                 break;
  201.             }
  202.             unshifr[k] = PowerMod(f, d, n);
  203.             yz++;
  204.             f = zzbuff[yz];
  205.             if (f >= n){
  206.                 i = true;
  207.                 break;
  208.             }
  209.             unshifr[k] = (unshifr[k] * 10) + PowerMod(f, d, n);
  210.             yz++;
  211.             f = zzbuff[yz];
  212.             if (f >= n){
  213.                 i = true;
  214.                 break;
  215.             }
  216.             unshifr[k] = (unshifr[k] * 10) + PowerMod(f, d, n);
  217.         }
  218.         out2 << unshifr[k];
  219.         out2 << " ";
  220.     }
  221.    
  222.     out2.close();
  223. }
  224.  
  225. void CharDecAT(int* num, int a){
  226.     ifstream in("DecNumSymb.txt");
  227.     FILE *out;
  228.     fopen_s(&out, "Deciphered_text.txt", "w");
  229.     for (int k = 0; k < a; k++){
  230.         if (!in.eof()){
  231.             in >> num[k];
  232.             fwrite(&num[k], sizeof(char), 1, out);
  233.         }
  234.     }
  235.     in.close();
  236.     fclose(out);
  237. }
  238.  
  239. ZZ gPrime(char c, ZZ x){
  240.     bool b;
  241.     ZZ p, k;
  242.         b = false;
  243.         cout << "Enter a prime number  " << c << " > 2  : ";
  244.         cin >> p;
  245.         if (p < 3)
  246.             b = true;
  247.         else if (p>2)
  248.         for (k = 2; k < p - 1; k++){
  249.             if (p%k == 0)
  250.                 b = true;
  251.         }
  252.         if (x == p)
  253.             b = true;
  254.         if (b == true)
  255.             p = gPrime(c,x);
  256.         return p;
  257. }
  258.  
  259. int ret1(){
  260.     int a;
  261.     int y;
  262.     ifstream in("Chipher_text.txt");
  263.     in >> a;
  264.     in >> x;
  265.     in.close();
  266.     return a;
  267. }
  268.  
  269.  
  270. void ret2(){
  271.     arr = new ZZ[x];
  272.     int kk;
  273.     ifstream in("Chipher_text.txt");
  274.     for (int k = 0; k < x+2; k++){
  275.         if (k<2)
  276.         in >> kk;
  277.         else
  278.         if (k>1)
  279.         in >> arr[k-2];
  280.     }
  281.     in.close();
  282. }
  283.  
  284. int main()
  285. {
  286.     while (1){
  287.         i = false;
  288.     ZZ p, q, e, d, n, m, one, k;
  289.     ZZ* zzbuff = new ZZ[];
  290.     ZZ* unshifr = new ZZ[];
  291.     int a, cc;
  292.     int* num = new int[];
  293.     int** ascii = new int*[];
  294.     bool b;
  295.     int l = 0;
  296.         cout << "Enter the '1' to ENCRYPT text or '2' to DECIPHER" << endl << "Enter here the number: ";
  297.         cin >> l;
  298.         if (l == 1){
  299.             a = symbcount(n);
  300.             if (a < 1){
  301.                 cout << endl << "Error opening file or it is empty" << endl;
  302.  
  303.             }
  304.             else{
  305.                 cout << endl << "Number of characters in the text: " << a << endl << endl;
  306.                 b = false;
  307.                 one = 1;
  308.                 k = 0;
  309.                 p = gPrime('p', k);
  310.                 q = gPrime('q', p);
  311.                 m = ((p - 1)*(q - 1));
  312.                 e = (rec(m - 1));
  313.                 n = p*q;
  314.                 cout << endl << "Public key (e,n): (" << e << "," << n << ")" << endl;
  315.                 d = modinv(e, m);
  316.                 cout << endl << "Private key (p,q,d): (" << p << "," << q << "," << d << ")" << endl;
  317.  
  318.  
  319.                 ascii = new int*[a];
  320.                
  321.                 TxtInArr(ascii, a, n);
  322.                 zzbuff = new ZZ[y];
  323.                
  324.                 enc(zzbuff, ascii, a, e, n);
  325.                 ofstream out("asciiArr.txt");
  326.                 for (int k = 0; k < a; k++){
  327.                     out << ascii[k][0];
  328.                     out << " ";
  329.                     out << ascii[k][1];
  330.                     out << " ";
  331.                     out << ascii[k][2];
  332.                     if (k!=a)
  333.                     out << " ";
  334.                 }
  335.                 out.close();
  336.                 cout << endl << endl << "Text successfully encrypted" << endl << endl;
  337.             }
  338.            
  339.         }
  340.         else if (l == 2){
  341.             cout << endl << "Enter private key: " << endl;
  342.             cout << "p: ";
  343.             cin >> p;
  344.             cout << endl << "q: ";
  345.             cin >> q;
  346.             cout << endl << "d: ";
  347.             cin >> d;
  348.             n = p*q;
  349.             a = ret1();
  350.             ret2();
  351.             int** ascii2 = new int*[a];
  352.  
  353.            
  354.             ifstream incpwin("asciiArr.txt");
  355.             if (!incpwin.is_open()){
  356.                 cout << endl << "Can not open 'asciiArr.txt'";
  357.             }
  358.             else{
  359.                 for (int k = 0; k < a; k++){
  360.                     ascii2[k] = new int[3];
  361.                     incpwin >> ascii2[k][0];
  362.                     incpwin >> ascii2[k][1];
  363.                     incpwin >> ascii2[k][2];
  364.                 }
  365.                 cout << endl << endl;
  366.                 incpwin.close();
  367.                 unshifr = new ZZ[a];
  368.                 num = new int[a];
  369.                 dec(arr, ascii2, unshifr, a, d, n);
  370.                 if (i == true)
  371.                     cout << "Invalid key" << endl << endl;
  372.                 else{
  373.                     CharDecAT(num, a);
  374.                     cout << endl << endl << "Text decrypted successfully" << endl << endl;
  375.                 }
  376.             }
  377.         }
  378.         }
  379.     cout << endl << endl;
  380. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement