Advertisement
Guest User

Untitled

a guest
Dec 10th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.25 KB | None | 0 0
  1. #include <iostream>
  2. #include <Windows.h>
  3. #include <bitset>
  4. #include <iomanip>
  5. #include <iterator>
  6. #include <fstream>
  7. #include <algorithm>
  8. #include <direct.h>
  9. #include <vector>
  10. #include <ctime>
  11.  
  12. using namespace std;
  13.  
  14.  
  15. uint32_t S[] = { 0xc, 0x5, 0x6, 0xb, 0x9, 0x0, 0xa, 0xd, 0x3, 0xe, 0xf, 0x8, 0x4, 0x7, 0x1, 0x2 };
  16. #define n 4
  17. const int n_bit = 4;
  18. #define pw (pow(2, 2 * n))
  19. #define coFu (pow(2, pow(2,2 * n)))
  20. #define per (pow(2, n))
  21. const int bit_si = 256;  //pow(2, 2*n)  //pow(2, 2*n)  2^16 = 65536  2^8 = 256   2^4 = 16   2^3 = 9    2^2 = 4
  22. const int n2bit = 8; //2*n
  23. const int perr = pow(2, n);
  24. string CIPHER = "Modified_Present";
  25.  
  26. vector<bitset<n2bit>> Nf;
  27. bitset<bit_si>(Fs);
  28. bitset<bit_si>(FsTrue);
  29. bitset<bit_si>(Hs);
  30. vector<bitset<n2bit>> SY;
  31. vector<bitset<2 * n2bit>> trueFunctions;
  32. vector<bitset<2 * n2bit>> reduceTrueFunctions;
  33.  
  34. //uint32_t x = 0x93AB;
  35. uint32_t x = 0x1234;
  36.  
  37.  
  38. ////////////////////Шифрование///////////////////////////////////////////////
  39.  
  40. uint32_t permutation(uint32_t x) {
  41.    
  42.     uint32_t temp = 0;
  43.     size_t size = sizeof(x) * 4;
  44.     vector <bool> t(size);
  45.     vector <bool> tp(size);
  46.     for (int i = 0; i < size; i++) {
  47.         t[i] = ((x >> (size - i - 1)) & 1);
  48.     }
  49.     tp[0] = t[0];
  50.     tp[1] = t[4];
  51.     tp[2] = t[7];
  52.     tp[3] = t[12];
  53.     tp[4] = t[1];
  54.     tp[5] = t[11];
  55.     tp[6] = t[5];
  56.     tp[7] = t[13];
  57.     tp[8] = t[2];
  58.     tp[9] = t[8];
  59.     tp[10] = t[10];
  60.     tp[11] = t[6];
  61.     tp[12] = t[3];
  62.     tp[13] = t[15];
  63.     tp[14] = t[14];
  64.     tp[15] = t[9];
  65.  
  66.     for (int i = 0; i < size; ++i) {
  67.         temp = (temp << 1) | tp[i];
  68.     }
  69.     return temp;
  70. }
  71. uint32_t Encode(uint32_t x) {
  72.     uint32_t temp = 0;
  73.     uint32_t tmp = 0;
  74.     size_t size = sizeof(x) * 4;
  75.     for (int i = 4; i <= size; i += 4) {
  76.         tmp = S[((x >> (size - i)) & 0xf)];
  77.         temp = (temp << 4) | tmp;
  78.     }
  79.     temp = permutation(temp);
  80.     return temp;
  81. }
  82. uint32_t sigma = Encode(Encode(x));
  83. //////////////////////////////////////////////////////////////////////////
  84.  
  85.  
  86.  
  87. //////////////////Построение имплицент для подстановки////////////
  88. bool isNf(bitset<n2bit> i) {
  89.     int length = Nf.size();
  90.     for (int y = 0; y < length; y++) {
  91.         if (Nf[y] == i) {
  92.             return true;
  93.         }
  94.     }
  95.     return false;
  96. }
  97. bool isSY(bitset<n2bit> i) {
  98.     int length = SY.size();
  99.     for (int y = 0; y < length; y++) {
  100.         if (SY[y] == i) {
  101.             return true;
  102.         }
  103.     }
  104.     return false;
  105. }
  106.  
  107. void createFs() {
  108.     for (size_t i = 0; i < pw; i++) {
  109.         if (bitset<n_bit>(i) == bitset<n_bit>(S[(i >> n)])) {
  110.             Fs = Fs << 1;
  111.             Fs |= 1;
  112.  
  113.         }
  114.         else {
  115.             Fs = Fs << 1;
  116.         }
  117.     }
  118.     FsTrue = Fs;
  119.  
  120. }
  121.  
  122. void createNf_WN() {
  123.     cout << "Creating Nf_WN..." << endl;
  124.     for (size_t i = 0; i < Nf.size(); i++) {
  125.         for (size_t j = i; j < Nf.size(); j++) {
  126.             if (isNf(bitset<n2bit>(Nf[i])& bitset<n2bit>(Nf[j])) == false) {
  127.                 Nf.push_back(bitset<n2bit>(Nf[i]) & bitset<n2bit>(Nf[j]));
  128.             }
  129.  
  130.         }
  131.         //cout << Nf.size() << " " << i  << endl;
  132.     }
  133. }
  134. void createNf_WP() {
  135.     cout << "Creating Nf_WP..." << endl;
  136.     for (size_t i = 0; i < Nf.size(); i++) {
  137.         for (size_t j = i; j < Nf.size(); j++) {
  138.             if (isNf(bitset<n2bit>(Nf[i]) | bitset<n2bit>(Nf[j])) == false) {
  139.                 Nf.push_back(bitset<n2bit>(Nf[i]) | bitset<n2bit>(Nf[j]));
  140.             }
  141.  
  142.         }
  143.         //cout << Nf.size() << " " << i <<  endl;
  144.  
  145.     }
  146. }
  147. void createNf() {
  148.     cout << "Creating Nf..." << endl;
  149.     for (size_t i = 0; i < pw; i++) {
  150.         if (bitset<n_bit>(i) == bitset<n_bit>(S[(i >> n)])) {
  151.             Nf.push_back(i);
  152.         }
  153.     }
  154. }
  155.  
  156. bool checkWP() {
  157.     cout << "Check WP..." << endl;
  158.     int length = Nf.size();
  159.     uint64_t mask = pw - 1;
  160.     for (size_t i = 0; i < length; i++) {
  161.         for (size_t j = i; j < length; j++) {
  162.             if (isNf((Nf[i] | Nf[j])) == false) {
  163.                 return false;
  164.             }
  165.         }
  166.     }
  167.     return true;
  168. }
  169. bool checkWN() {
  170.     cout << "Check WN..." << endl;
  171.     int length = Nf.size();
  172.     uint64_t mask = pw - 1;
  173.     for (size_t i = 0; i < length; i++) {
  174.         for (size_t j = i; j < length; j++) {
  175.             if (isNf((Nf[i] & Nf[j])) == false) {
  176.                 return false;
  177.             }
  178.         }
  179.     }
  180.     return true;
  181. }
  182.  
  183.  
  184. /////////////////////////////////Prints////////////////////////////////////////
  185.  
  186. void printNf(string s) {
  187.     string txt = ".txt";
  188.     string ppNf = "Nf";
  189.     string temp = ppNf + s + txt;
  190.     ofstream pNf(temp);
  191.     pNf << "Function weight: " << Nf.size() << endl;
  192.     for (size_t i = 0; i < Nf.size(); i++) {
  193.         pNf << bitset<n2bit>(Nf[i]) << endl;
  194.     }
  195.     pNf.close();
  196. }
  197. void printSY(string s) {
  198.     string txt = ".txt";
  199.     string ppNf = "Nf";
  200.     string temp = ppNf + s + txt;
  201.     ofstream pNf(temp);
  202.     pNf << "Function weight: " << SY.size() << endl;
  203.     for (size_t i = 0; i < SY.size(); i++) {
  204.         pNf << bitset<n2bit>(SY[i]) << endl;
  205.     }
  206.     pNf.close();
  207. }
  208.  
  209. void printTrueFunctions(string s) {
  210.     string txt = ".txt";
  211.     string ppNf = "True functions of ";
  212.     string temp = ppNf + s + txt;
  213.     ofstream pNf(temp);
  214.     pNf << "Function weight: " << trueFunctions.size() << endl;
  215.     for (size_t i = 0; i < trueFunctions.size(); i++) {
  216.         pNf << bitset<2 * n2bit>(trueFunctions[i]) << endl;
  217.     }
  218.     pNf.close();
  219. }
  220.  
  221. void printReduceTrueFunctions(string s) {
  222.     string txt = ".txt";
  223.     string ppNf = "Reduce true functions of ";
  224.     string temp = ppNf + s + txt;
  225.     ofstream pNf(temp);
  226.     pNf << "Function weight: " << reduceTrueFunctions.size() << endl;
  227.     for (size_t i = 0; i < reduceTrueFunctions.size(); i++) {
  228.         pNf << bitset<2 * n2bit>(reduceTrueFunctions[i]) << endl;
  229.     }
  230.     pNf.close();
  231. }
  232. /////////////////////////////////////////////////////////////////
  233.  
  234.  
  235.  
  236.  
  237. ///////////////Решение задачи 1: Построение системы уравнений в функциональнов виде и перебор////////////////////
  238. bitset<n2bit> getBitset(size_t y, int index) {
  239.     bitset<n2bit> temp;
  240.     int counts = 0;
  241.     bool flag = true;
  242.     for (int i = 0; i < n2bit; ++i) {
  243.         if (flag == true) {
  244.             temp[n2bit - i - 1] = ((x >> (perr - ((i%4) + index) - 1)) & 1);
  245.         }
  246.         else{
  247.             temp[n2bit - i - 1] = ((y >> (perr - ((i%4) + index) - 1)) & 1);
  248.         }
  249.         counts++;
  250.         //cout << counts << " " << flag << endl;
  251.         if (counts == n) {
  252.             if (flag == true) {
  253.                 flag = false;
  254.             }
  255.             else {
  256.                 flag = true;
  257.             }
  258.            
  259.             counts = 0;
  260.         }
  261.     }
  262.     /*for (int i = 0; i < n2bit; i++) {
  263.         cout << temp[i];
  264.     }*/
  265.     //cout << "temp " << index << ": " << bitset<n2bit>(temp) << endl;
  266.     return temp;
  267. }
  268.  
  269.  
  270. void checkCollision() {
  271.     size_t size = pow(2, sizeof(x) * 4);
  272.     size_t size_of_x = sizeof(x) * 4;
  273.     for (size_t y = 0; y < size; ++y) {
  274.         int count_of_true = 0;
  275.         for (int index = 0; index < size_of_x; index+= 4) {
  276.             if (isSY(getBitset(y, index)) == false) {
  277.                 break;
  278.             }
  279.             else {
  280.                 count_of_true++;
  281.             }
  282.         }
  283.         if (count_of_true == 4) {
  284.             trueFunctions.push_back(y);
  285.             /*cout << "x: = " << bitset<16>(x) << endl;
  286.             cout << "y: = " << bitset<16>(y) << endl;
  287.             system("pause");*/
  288.         }      
  289.     }
  290.  
  291.     cout << "Количество подходящих вариантов: " << trueFunctions.size() << endl;
  292. }
  293.  
  294.  
  295. uint32_t getUintFromBitset(bitset<2 * n2bit> tp) {
  296.     uint32_t temp = 0;
  297.     for (int i = 0; i < 2 * n2bit; i++) {
  298.         temp = (((temp << 1) | tp[2 * n2bit - i - 1]) & 0xffff);
  299.     }
  300.     return temp;
  301. }
  302.  
  303. void thin_out_of_the_true_functions() {
  304.     size_t size_of_true_Functions = trueFunctions.size();
  305.     uint32_t temp = 0;
  306.     for (int i = 0; i < size_of_true_Functions; ++i) {
  307.         temp = getUintFromBitset(trueFunctions.at(i));
  308.         if (sigma == Encode(permutation(temp))) {
  309.             reduceTrueFunctions.push_back(trueFunctions.at(i));
  310.         }
  311.     }
  312. }
  313.  
  314.  
  315.  
  316. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  317.  
  318. ///////////////////////Составляем систему//////////////////////////////////
  319. bitset<n> get_fore_bits_from_x(uint32_t vec, int index) {
  320.     size_t size = sizeof(vec) * 4;
  321.     return ((vec >> (size - index - 4)) & 0xf);
  322. }
  323.  
  324.  
  325. void createSystem() {
  326.     bitset<n2bit> temp =0;
  327.     bitset<4> tmp = 0;
  328.     size_t Nf_vec_size = Nf.size();
  329.     for (size_t i = 0; i < Nf_vec_size; ++i) { 
  330.         temp = Nf.at(i);
  331.         for (int j = 0; j < n; j++) {
  332.             tmp[n - j - 1] = temp[n2bit - j - 1];
  333.         }
  334.         for (int index = 0; index < (2 * n2bit); index += 4) {
  335.             if (tmp == get_fore_bits_from_x(x, index)) {
  336.                 SY.push_back(Nf.at(i));
  337.             }
  338.         }
  339.     }
  340. }
  341.  
  342.  
  343.  
  344.  
  345. ///////////////////////////////////////////////////////////////////////
  346.  
  347.  
  348.  
  349. //////////////////////////////////////////////////////////////////////
  350.  
  351. int main() {
  352.     srand(time(NULL));
  353.     setlocale(LC_ALL, "Russian");
  354.    
  355.     /*uint32_t y = 0x93AB;
  356.     cout << "y: = " << get_fore_bits_from_x(y, 12) << endl;
  357.    
  358.     cout << "x: = " << bitset<16>(x) << endl;
  359.     cout << "y: = " << bitset<16>(y) << endl;*/
  360.    
  361.    
  362.  
  363.    
  364.     createFs();
  365.     createNf();
  366.     printNf(" Fs of " + CIPHER);
  367.  
  368.     int choise = 0;
  369.     cout << "Выберите: \n\t1. WP \n\t2. WN" << endl;
  370.     cin >> choise;
  371.  
  372.     switch (choise)
  373.     {
  374.     case 1:
  375.         createNf_WP();
  376.         printNf(" Hs_WP of " + CIPHER);
  377.         createSystem();
  378.         printSY(" System");
  379.         checkCollision();
  380.         printTrueFunctions("WP");
  381.         thin_out_of_the_true_functions();
  382.         printReduceTrueFunctions("WP");
  383.         break;
  384.     case 2:
  385.         createNf_WN();
  386.         printNf(" Hs_WN of " + CIPHER);
  387.         createSystem();
  388.         printSY(" System");
  389.         checkCollision();
  390.         printTrueFunctions("WN");
  391.         thin_out_of_the_true_functions();
  392.         printReduceTrueFunctions("WN");
  393.         break;
  394.     default:
  395.         break;
  396.     }
  397.     cout << bitset<2 * n2bit>(sigma) << endl;
  398.        
  399.     Nf.clear();
  400.     trueFunctions.clear();
  401.    
  402.     return 0;
  403. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement