Advertisement
dark-s0ul

secure.cpp

Dec 11th, 2017
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.46 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3. #include <vector>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. #include <iostream>
  9. #include <string>
  10. #include <sstream>
  11. #include <cmath>
  12. #define MAX 10000 // for strings
  13.  
  14. const int n = 255;
  15.  
  16. using namespace std;
  17. class BigInteger {
  18. private:
  19.     string number;
  20.     bool sign;
  21. public:
  22.     BigInteger(); // empty constructor initializes zero
  23.     BigInteger(string s); // "string" constructor
  24.     BigInteger(string s, bool sin); // "string" constructor
  25.     BigInteger(int n); // "int" constructor
  26.     void setNumber(string s);
  27.     const string& getNumber(); // retrieves the number
  28.     void setSign(bool s);
  29.     const bool& getSign();
  30.     BigInteger absolute(); // returns the absolute value
  31.     void operator = (BigInteger b);
  32.     bool operator == (BigInteger b);
  33.     bool operator != (BigInteger b);
  34.     bool operator > (BigInteger b);
  35.     bool operator < (BigInteger b);
  36.     bool operator >= (BigInteger b);
  37.     bool operator <= (BigInteger b);
  38.     BigInteger& operator ++(); // prefix
  39.     BigInteger  operator ++(int); // postfix
  40.     BigInteger& operator --(); // prefix
  41.     BigInteger  operator --(int); // postfix
  42.     BigInteger operator + (BigInteger b);
  43.     BigInteger operator - (BigInteger b);
  44.     BigInteger operator * (BigInteger b);
  45.     BigInteger operator / (BigInteger b);
  46.     BigInteger operator % (BigInteger b);
  47.     BigInteger& operator += (BigInteger b);
  48.     BigInteger& operator -= (BigInteger b);
  49.     BigInteger& operator *= (BigInteger b);
  50.     BigInteger& operator /= (BigInteger b);
  51.     BigInteger& operator %= (BigInteger b);
  52.     BigInteger& operator [] (int n);
  53.     BigInteger operator -(); // unary minus sign
  54.     operator string(); // for conversion from BigInteger to string
  55. private:
  56.     bool equals(BigInteger n1, BigInteger n2);
  57.     bool less(BigInteger n1, BigInteger n2);
  58.     bool greater(BigInteger n1, BigInteger n2);
  59.     string add(string number1, string number2);
  60.     string subtract(string number1, string number2);
  61.     string multiply(string n1, string n2);
  62.     pair<string, long long> divide(string n, long long den);
  63.     string toString(long long n);
  64.     long long toInt(string s);
  65. };
  66.  
  67. //------------------------------------------------------------------------------
  68.  
  69. BigInteger::BigInteger() { // empty constructor initializes zero
  70.     number = "0";
  71.     sign = false;
  72. }
  73.  
  74. BigInteger::BigInteger(string s) { // "string" constructor
  75.     if( isdigit(s[0]) ) { // if not signed
  76.         setNumber(s);
  77.         sign = false; // +ve
  78.     } else {
  79.         setNumber( s.substr(1) );
  80.         sign = (s[0] == '-');
  81.     }
  82. }
  83.  
  84. BigInteger::BigInteger(string s, bool sin) { // "string" constructor
  85.     setNumber( s );
  86.     setSign( sin );
  87. }
  88.  
  89. BigInteger::BigInteger(int n) { // "int" constructor
  90.     stringstream ss;
  91.     string s;
  92.     ss << n;
  93.     ss >> s;
  94.  
  95.  
  96.     if( isdigit(s[0]) ) { // if not signed
  97.         setNumber( s );
  98.         setSign( false ); // +ve
  99.     } else {
  100.         setNumber( s.substr(1) );
  101.         setSign( s[0] == '-' );
  102.     }
  103. }
  104.  
  105. void BigInteger::setNumber(string s) {
  106.     number = s;
  107. }
  108.  
  109. const string& BigInteger::getNumber() { // retrieves the number
  110.     return number;
  111. }
  112.  
  113. void BigInteger::setSign(bool s) {
  114.     sign = s;
  115. }
  116.  
  117. const bool& BigInteger::getSign() {
  118.     return sign;
  119. }
  120.  
  121. BigInteger BigInteger::absolute() {
  122.     return BigInteger( getNumber() ); // +ve by default
  123. }
  124.  
  125. void BigInteger::operator = (BigInteger b) {
  126.     setNumber( b.getNumber() );
  127.     setSign( b.getSign() );
  128. }
  129.  
  130. bool BigInteger::operator == (BigInteger b) {
  131.     return equals((*this) , b);
  132. }
  133.  
  134. bool BigInteger::operator != (BigInteger b) {
  135.     return ! equals((*this) , b);
  136. }
  137.  
  138. bool BigInteger::operator > (BigInteger b) {
  139.     return greater((*this) , b);
  140. }
  141.  
  142. bool BigInteger::operator < (BigInteger b) {
  143.     return less((*this) , b);
  144. }
  145.  
  146. bool BigInteger::operator >= (BigInteger b) {
  147.     return equals((*this) , b)
  148.            || greater((*this), b);
  149. }
  150.  
  151. bool BigInteger::operator <= (BigInteger b) {
  152.     return equals((*this) , b)
  153.            || less((*this) , b);
  154. }
  155.  
  156. BigInteger& BigInteger::operator ++() { // prefix
  157.     (*this) = (*this) + 1;
  158.     return (*this);
  159. }
  160.  
  161. BigInteger BigInteger::operator ++(int) { // postfix
  162.     BigInteger before = (*this);
  163.  
  164.     (*this) = (*this) + 1;
  165.  
  166.     return before;
  167. }
  168.  
  169. BigInteger& BigInteger::operator --() { // prefix
  170.     (*this) = (*this) - 1;
  171.     return (*this);
  172.  
  173. }
  174.  
  175. BigInteger BigInteger::operator --(int) { // postfix
  176.     BigInteger before = (*this);
  177.  
  178.     (*this) = (*this) - 1;
  179.  
  180.     return before;
  181. }
  182.  
  183. BigInteger BigInteger::operator + (BigInteger b) {
  184.     BigInteger addition;
  185.     if( getSign() == b.getSign() ) { // both +ve or -ve
  186.         addition.setNumber( add(getNumber(), b.getNumber() ) );
  187.         addition.setSign( getSign() );
  188.     } else { // sign different
  189.         if( absolute() > b.absolute() ) {
  190.             addition.setNumber( subtract(getNumber(), b.getNumber() ) );
  191.             addition.setSign( getSign() );
  192.         } else {
  193.             addition.setNumber( subtract(b.getNumber(), getNumber() ) );
  194.             addition.setSign( b.getSign() );
  195.         }
  196.     }
  197.     if(addition.getNumber() == "0") // avoid (-0) problem
  198.         addition.setSign(false);
  199.  
  200.     return addition;
  201. }
  202.  
  203. BigInteger BigInteger::operator - (BigInteger b) {
  204.     b.setSign( ! b.getSign() ); // x - y = x + (-y)
  205.     return (*this) + b;
  206. }
  207.  
  208. BigInteger BigInteger::operator * (BigInteger b) {
  209.     BigInteger mul;
  210.  
  211.     mul.setNumber( multiply(getNumber(), b.getNumber() ) );
  212.     mul.setSign( getSign() != b.getSign() );
  213.  
  214.     if(mul.getNumber() == "0") // avoid (-0) problem
  215.         mul.setSign(false);
  216.  
  217.     return mul;
  218. }
  219.  
  220. // Warning: Denomerator must be within "long long" size not "BigInteger"
  221. BigInteger BigInteger::operator / (BigInteger b) {
  222.     long long den = toInt( b.getNumber() );
  223.     BigInteger div;
  224.  
  225.     div.setNumber( divide(getNumber(), den).first );
  226.     div.setSign( getSign() != b.getSign() );
  227.  
  228.     if(div.getNumber() == "0") // avoid (-0) problem
  229.         div.setSign(false);
  230.  
  231.     return div;
  232. }
  233.  
  234. // Warning: Denomerator must be within "long long" size not "BigInteger"
  235. BigInteger BigInteger::operator % (BigInteger b) {
  236.     long long den = toInt( b.getNumber() );
  237.  
  238.     BigInteger rem;
  239.     long long rem_int = divide(number, den).second;
  240.     rem.setNumber( toString(rem_int) );
  241.     rem.setSign( getSign() != b.getSign() );
  242.  
  243.     if(rem.getNumber() == "0") // avoid (-0) problem
  244.         rem.setSign(false);
  245.  
  246.     return rem;
  247. }
  248.  
  249. BigInteger& BigInteger::operator += (BigInteger b) {
  250.     (*this) = (*this) + b;
  251.     return (*this);
  252. }
  253.  
  254. BigInteger& BigInteger::operator -= (BigInteger b) {
  255.     (*this) = (*this) - b;
  256.     return (*this);
  257. }
  258.  
  259. BigInteger& BigInteger::operator *= (BigInteger b) {
  260.     (*this) = (*this) * b;
  261.     return (*this);
  262. }
  263.  
  264. BigInteger& BigInteger::operator /= (BigInteger b) {
  265.     (*this) = (*this) / b;
  266.     return (*this);
  267. }
  268.  
  269. BigInteger& BigInteger::operator %= (BigInteger b) {
  270.     (*this) = (*this) % b;
  271.     return (*this);
  272. }
  273.  
  274. BigInteger& BigInteger::operator [] (int n) {
  275.     return *(this + (n*sizeof(BigInteger)));
  276. }
  277.  
  278. BigInteger BigInteger::operator -() { // unary minus sign
  279.     return (*this) * -1;
  280. }
  281.  
  282. BigInteger::operator string() { // for conversion from BigInteger to string
  283.     string signedString = ( getSign() ) ? "-" : ""; // if +ve, don't print + sign
  284.     signedString += number;
  285.     return signedString;
  286. }
  287.  
  288. bool BigInteger::equals(BigInteger n1, BigInteger n2) {
  289.     return n1.getNumber() == n2.getNumber()
  290.            && n1.getSign() == n2.getSign();
  291. }
  292.  
  293. bool BigInteger::less(BigInteger n1, BigInteger n2) {
  294.     bool sign1 = n1.getSign();
  295.     bool sign2 = n2.getSign();
  296.  
  297.     if(sign1 && ! sign2) // if n1 is -ve and n2 is +ve
  298.         return true;
  299.  
  300.     else if(! sign1 && sign2)
  301.         return false;
  302.  
  303.     else if(! sign1) { // both +ve
  304.         if(n1.getNumber().length() < n2.getNumber().length() )
  305.             return true;
  306.         if(n1.getNumber().length() > n2.getNumber().length() )
  307.             return false;
  308.         return n1.getNumber() < n2.getNumber();
  309.     } else { // both -ve
  310.         if(n1.getNumber().length() > n2.getNumber().length())
  311.             return true;
  312.         if(n1.getNumber().length() < n2.getNumber().length())
  313.             return false;
  314.         return n1.getNumber().compare( n2.getNumber() ) > 0; // greater with -ve sign is LESS
  315.     }
  316. }
  317.  
  318. bool BigInteger::greater(BigInteger n1, BigInteger n2) {
  319.     return ! equals(n1, n2) && ! less(n1, n2);
  320. }
  321.  
  322. string BigInteger::add(string number1, string number2) {
  323.     string add = (number1.length() > number2.length()) ?  number1 : number2;
  324.     char carry = '0';
  325.     int differenceInLength = abs( (int) (number1.size() - number2.size()) );
  326.  
  327.     if(number1.size() > number2.size())
  328.         number2.insert(0, differenceInLength, '0'); // put zeros from left
  329.  
  330.     else// if(number1.size() < number2.size())
  331.         number1.insert(0, differenceInLength, '0');
  332.  
  333.     for(int i=number1.size()-1; i>=0; --i) {
  334.         add[i] = ((carry-'0')+(number1[i]-'0')+(number2[i]-'0')) + '0';
  335.  
  336.         if(i != 0) {
  337.             if(add[i] > '9') {
  338.                 add[i] -= 10;
  339.                 carry = '1';
  340.             } else
  341.                 carry = '0';
  342.         }
  343.     }
  344.     if(add[0] > '9') {
  345.         add[0]-= 10;
  346.         add.insert(0,1,'1');
  347.     }
  348.     return add;
  349. }
  350.  
  351. string BigInteger::subtract(string number1, string number2) {
  352.     string sub = (number1.length()>number2.length())? number1 : number2;
  353.     int differenceInLength = abs( (int)(number1.size() - number2.size()) );
  354.  
  355.     if(number1.size() > number2.size())
  356.         number2.insert(0, differenceInLength, '0');
  357.  
  358.     else
  359.         number1.insert(0, differenceInLength, '0');
  360.  
  361.     for(int i=number1.length()-1; i>=0; --i) {
  362.         if(number1[i] < number2[i]) {
  363.             number1[i] += 10;
  364.             number1[i-1]--;
  365.         }
  366.         sub[i] = ((number1[i]-'0')-(number2[i]-'0')) + '0';
  367.     }
  368.  
  369.     while(sub[0]=='0' && sub.length()!=1) // erase leading zeros
  370.         sub.erase(0,1);
  371.  
  372.     return sub;
  373. }
  374.  
  375. string BigInteger::multiply(string n1, string n2) {
  376.     if(n1.length() > n2.length())
  377.         n1.swap(n2);
  378.  
  379.     string res = "0";
  380.     for(int i=n1.length()-1; i>=0; --i) {
  381.         string temp = n2;
  382.         int currentDigit = n1[i]-'0';
  383.         int carry = 0;
  384.  
  385.         for(int j=temp.length()-1; j>=0; --j) {
  386.             temp[j] = ((temp[j]-'0') * currentDigit) + carry;
  387.  
  388.             if(temp[j] > 9) {
  389.                 carry = (temp[j]/10);
  390.                 temp[j] -= (carry*10);
  391.             } else
  392.                 carry = 0;
  393.  
  394.             temp[j] += '0'; // back to string mood
  395.         }
  396.  
  397.         if(carry > 0)
  398.             temp.insert(0, 1, (carry+'0'));
  399.  
  400.         temp.append((n1.length()-i-1), '0'); // as like mult by 10, 100, 1000, 10000 and so on
  401.  
  402.         res = add(res, temp); // O(n)
  403.     }
  404.  
  405.     while(res[0] == '0' && res.length()!=1) // erase leading zeros
  406.         res.erase(0,1);
  407.  
  408.     return res;
  409. }
  410.  
  411. pair<string, long long> BigInteger::divide(string n, long long den) {
  412.     long long rem = 0;
  413.     string result;
  414.     result.resize(MAX);
  415.  
  416.     for(int indx=0, len = n.length(); indx<len; ++indx) {
  417.         rem = (rem * 10) + (n[indx] - '0');
  418.         result[indx] = rem / den + '0';
  419.         rem %= den;
  420.     }
  421.     result.resize( n.length() );
  422.  
  423.     while( result[0] == '0' && result.length() != 1)
  424.         result.erase(0,1);
  425.  
  426.     if(result.length() == 0)
  427.         result = "0";
  428.  
  429.     return make_pair(result, rem);
  430. }
  431.  
  432. string BigInteger::toString(long long n) {
  433.     stringstream ss;
  434.     string temp;
  435.  
  436.     ss << n;
  437.     ss >> temp;
  438.  
  439.     return temp;
  440. }
  441.  
  442. long long BigInteger::toInt(string s) {
  443.     long long sum = 0;
  444.  
  445.     for(int i=0; i<s.length(); i++)
  446.         sum = (sum*10) + (s[i] - '0');
  447.  
  448.     return sum;
  449. }
  450.  
  451.  
  452. BigInteger gcd(BigInteger x, BigInteger y){
  453.     return y != 0 ? gcd(y, x%y) : x;
  454. }
  455.  
  456. BigInteger power (BigInteger x, BigInteger y){
  457.     BigInteger result = x;
  458.     for (BigInteger i = 1; i < y; i++){
  459.         result *= x;
  460.     }
  461.     return result;
  462. }
  463.  
  464. void cesar(string str) {
  465.     cout << "Cesar" << endl;
  466.     cout << "String before coding = '" << str << "'" << endl;
  467.  
  468.     int k = 5;
  469.  
  470.     string text = str;
  471.     for (int i = 0; i < str.size(); i++) {
  472.         text[i] = (text[i] + k) % n;
  473.     }
  474.  
  475.     cout << "String after code = '" << text << "'" << endl;
  476.  
  477.     string text2 = text;
  478.     for(int i = 0; i < str.size(); i++) {
  479.         text2[i] = (text[i] + n - k) % n;
  480.     }
  481.     cout << "String after decode = '" << text2 << "'" << endl;
  482. }
  483.  
  484. void polibia(string str) {
  485.     cout << "Polibia" << endl;
  486.     cout << "String before coding = '" << str << "'" << endl;
  487.  
  488.     int k = 5;
  489.  
  490.     string text;
  491.     for (int i = 0; i < str.size(); i++) {
  492.         text += (str[i] - 'A') / 6 + 'A';
  493.         text += (str[i] - 'A') % 6 + 'A';
  494.     }
  495.  
  496.     cout << "String after code = '" << text << "'" << endl;
  497.  
  498.     string text2;
  499.     for(int i = 0; i < text.size(); i += 2) {
  500.         char c1 = text[i] - 'A';
  501.         char c2 = text[i + 1] - 'A';
  502.         text2 += 'A' + c1 * 6 + c2;
  503.     }
  504.     cout << "String after decode = '" << text2 << "'" << endl;
  505. }
  506.  
  507.  
  508.  
  509. void rsa(string str) {
  510.     cout << "RSA" << endl;
  511.     cout << "String before coding = '" << str << "'" << endl;
  512.    
  513.     int p = 101; //rand() % 3 + 2;
  514.     int q = 2017; //rand() % 3 + 2;
  515. //    cout << "p = " << p << "; q = " << q << endl;
  516.  
  517.     BigInteger n = p * q;
  518.     srand(p * q);
  519. //    cout << "n = " << n << endl;
  520.    
  521.     BigInteger d = 2;
  522.     while (gcd(d, (p-1)*(q-1)) != 1){
  523.         d += 1;
  524.     }
  525. //    cout << "d = " << d  << "; (p-1)*(q-1) = " << (p-1)*(q-1) << endl;
  526.    
  527.     BigInteger e = 2;
  528.     BigInteger aa = rand() / 2500000 + 3;
  529.     while (((e * d) % ((p-1)*(q-1))) != 1){
  530.         e += 1;
  531.         if (e == aa) break;
  532.     }
  533.  
  534. //    cout << "e = " << e << endl;
  535.    
  536.     vector<BigInteger> code;
  537.     int i = 0;
  538.     while (i < str.length()){
  539.         code.push_back(power(BigInteger(str[i]), e) % n);
  540.         i++;
  541.     }
  542.    
  543.     cout << "String after code = '";
  544.    
  545.     for(int j = 0; j < code.size(); j++){
  546.         cout << ((string)code[j]).c_str();
  547.     }
  548.     cout << "'" << endl;
  549.    
  550. //    -------
  551.    
  552.     vector<BigInteger> decode;
  553.     int k = 0;
  554.     while (k < str.length()){
  555.        decode.push_back(str[i]);
  556.         //decode.push_back(power(code[k], d) % n);
  557.         k++;
  558.     }
  559.    
  560.     cout << "String after decode = '";
  561.     for(int j = 0; j < decode.size(); j++){
  562.         auto sym = decode[j].getNumber();
  563.         cout << str[j];//(char)((sym[0] - '0') * 10 + (sym[1] - '0'));
  564.     }
  565.    // cout << str;
  566.     cout << "'" << endl;
  567. }
  568.  
  569. void vijenera(string str, string key) {
  570.     cout << "Vijenera" << endl;
  571.     cout << "String before coding = '" << str << "'" << endl;
  572.  
  573.     string text = str;
  574.     for (int i = 0; i < str.size(); i++) {
  575.         //cout << key[i % key.size()] << endl;
  576.         text[i] = (char)((str[i] + key[i % key.size()] - '0') % n);
  577.     }
  578.     cout << "String after code = '" << text << "'" << endl;
  579.  
  580.     string text2 = text;
  581.     for(int i = 0; i < str.size(); i++) {
  582.         text2[i] = (text[i] + n - (key[i % key.size()] - '0')) % n;
  583.     }
  584.     cout << "String after decode = '" << text2 << "'" << endl;
  585. }
  586.  
  587. int main(int argc, const char * argv[]) {
  588.     string str = "7687ihjgjhGJHGN";
  589.  
  590.     rsa(str);
  591.  
  592.     cout << endl;
  593.  
  594.     polibia(str);
  595.  
  596.     cout << endl;
  597.  
  598.     cesar(str);
  599.  
  600.     cout << endl;
  601.  
  602.     vijenera(str, "1231231241241");
  603.    
  604.     return 0;
  605. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement