Advertisement
Shokedbrain

crypto

Jun 3rd, 2021
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.88 KB | None | 0 0
  1. #include <Windows.h>
  2. #include <wincrypt.h>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7.  
  8. void ErrorHandling(){
  9.     DWORD dw = GetLastError();
  10.     cout << "Error: " << hex << dw << endl;
  11.     exit(1);
  12. }
  13.  
  14.  
  15. int main()
  16. {
  17.     // TODO
  18.     // реализация лабораторной работы 5
  19.     // провести оптимизацию кода
  20.     // добавить метод для освобождения из памяти объектов
  21.     // возможно, потребуется вынести их как глобальные переменные
  22.    
  23.     HCRYPTPROV      hProv;
  24.     HCRYPTHASH      hHash;
  25.     HCRYPTKEY       hKey;
  26.     string          hashData = "Example String";
  27.     PBYTE           pbBuffer = PBYTE(hashData.c_str()); // массив типа BYTE*, в котором зашифрована строка
  28.     DWORD           dwBufferLen = DWORD(strlen(reinterpret_cast<char*>(pbBuffer)) + 1); // длина массива
  29.  
  30.     // создание и проверка цифровой подписи
  31.     // Взаимодействие двух сторон: подписывающей и проверяющей ЦП
  32.  
  33.     // Дескриптор CSP
  34.  
  35.     if (CryptAcquireContext(&hProv, nullptr,
  36.             nullptr,
  37.             PROV_RSA_FULL,
  38.             0))
  39.     {
  40.         cout << "CryptAcquireContext Successful. \n";
  41.     }
  42.     else
  43.         ErrorHandling();
  44.    
  45.     // --- Подписывающая сторона ---
  46.     cout << "\t\tCreating signature\n";
  47.     // Получение открытого ключа
  48.  
  49.     if (CryptGetUserKey(hProv,AT_KEYEXCHANGE,&hKey))
  50.     {
  51.         cout << "CryptGetUserKey successful. \n";
  52.     }
  53.     else
  54.     {
  55.         if (GetLastError() == 0x8009000D) // nte_no_key == 0x8009000D
  56.         {
  57.             if (!CryptGenKey(hProv,AT_KEYEXCHANGE, CRYPT_EXPORTABLE, &hKey))
  58.             {
  59.                 ErrorHandling();
  60.             }
  61.         }
  62.     }
  63.    
  64.         // Экспорт открытого ключа для использования проверяющей стороной
  65.  
  66.         BYTE*           pbBlob; // BLOB в котором мы будем хранить ключ
  67.         DWORD           dwBlobLen = 0; // длина BLOB
  68.    
  69.         // Вычисление объема памяти для экспорта ключа
  70.  
  71.         if (CryptExportKey(hKey,NULL,PUBLICKEYBLOB,0,NULL,
  72.                            &dwBlobLen))
  73.         {
  74.             cout << "Computing size of blob succeed.\n";
  75.         }
  76.         else
  77.             ErrorHandling();
  78.  
  79.         // Непосредственный экспорт ключа
  80.         // Выделяем память под blob
  81.    
  82.         pbBlob = new BYTE[dwBlobLen];
  83.  
  84.         if (CryptExportKey(hKey,NULL,PUBLICKEYBLOB,0,pbBlob,&dwBlobLen))
  85.         {
  86.             cout << "Export key to BLOB succeed.\n";
  87.         }
  88.         else
  89.             ErrorHandling();
  90.  
  91.         // Вывод информации о BLOB
  92.    
  93.         cout << "BLOB has been created!\n"
  94.             << "BLOB Length: " << dwBlobLen << "\n";
  95.         cout << "Out BLOB\n";
  96.         for (int i = 0; i < static_cast<int>(dwBlobLen); i++)
  97.             cout << pbBlob[i];
  98.         cout << "\n";
  99.    
  100.         // Теперь мы имеем БЛОБ, который можно экспортировать файл для передачи проверяющей стороне
  101.  
  102.         // Уничтожаем информацию о ключе
  103.    
  104.         if (hKey)
  105.         {
  106.             cout << "Key has been deleted.\n";
  107.             CryptDestroyKey(hKey);
  108.         }
  109.    
  110.         // Вычисление хеш-значения подписываемых данных массива типа BYTE (PBYTE)
  111.  
  112.         // Создаём хеширующий объект
  113.    
  114.         if (CryptCreateHash(hProv,CALG_MD5,0,0,&hHash))
  115.         {
  116.             cout << "Hash object has been created\n";
  117.         }
  118.         else
  119.         {
  120.             ErrorHandling();
  121.         }
  122.  
  123.         // Вычисление хеша
  124.  
  125.         if (CryptHashData(hHash,pbBuffer,dwBufferLen,0))
  126.         {
  127.             cout << "The data has been hashed successful. \n";
  128.         }
  129.         else
  130.         {
  131.             ErrorHandling();
  132.         }
  133.    
  134.         // Вычисление размера памяти под подписываемый объект
  135.    
  136.         BYTE*           pbSign; // буфер подписи
  137.         DWORD           dwSignLen = 0; // длина буфера подписи
  138.  
  139.         if (CryptSignHash(hHash, AT_KEYEXCHANGE, NULL, 0, NULL, &dwSignLen))
  140.         {
  141.             cout << "Computing size of signature buffer succeed. \n";
  142.         }
  143.         else
  144.         {
  145.             ErrorHandling();
  146.         }
  147.  
  148.         pbSign =  new BYTE[dwSignLen];
  149.  
  150.         // Подпись объекта
  151.  
  152.         if (CryptSignHash(hHash, AT_KEYEXCHANGE, NULL,0,pbSign,&dwSignLen))
  153.         {
  154.             cout << "Signature has been successful created.\n";
  155.         }
  156.         else
  157.         {
  158.             ErrorHandling();
  159.         }
  160.  
  161.         // Отображение информации о подписи в консоль
  162.  
  163.         for (int i = 0; i < static_cast<int>(dwSignLen); i++)
  164.             cout << pbSign[i];
  165.         cout << endl;
  166.  
  167.         if (hHash)
  168.         {
  169.             cout << "Free memory of Hash. \n";
  170.             CryptDestroyHash(hHash);
  171.         }
  172.    
  173.         // --- Проверяющая сторона ---
  174.         cout << "\t\tVerify signature\n";
  175.         HCRYPTKEY hPublicKey; // Публичный ключ
  176.  
  177.         // Импорт открытого ключа из BLOB
  178.         if (CryptImportKey(hProv,pbBlob,dwBlobLen,0,0,&hPublicKey))
  179.         {
  180.             cout << "The key has been imported successful. \n";
  181.         }
  182.         else
  183.         {
  184.             ErrorHandling();
  185.         }
  186.    
  187.         // Хешируем объект
  188.  
  189.         // Создаём хеширующий объект
  190.    
  191.         if (CryptCreateHash(hProv,CALG_MD5,0,0,&hHash))
  192.         {
  193.             cout << "Hash object has been created\n";
  194.         }
  195.         else
  196.         {
  197.             ErrorHandling();
  198.         }
  199.  
  200.         // Вычисление хеша
  201.  
  202.         if (CryptHashData(hHash,pbBuffer,dwBufferLen,0))
  203.         {
  204.             cout << "The data has been hashed successful. \n";
  205.         }
  206.         else
  207.         {
  208.             ErrorHandling();
  209.         }
  210.    
  211.         // Проверка цифровой подписи
  212.  
  213.         bool verification = CryptVerifySignature(hHash,pbSign,dwSignLen,hPublicKey, nullptr,0);
  214.  
  215.         cout << endl;
  216.         cout << ((verification)? "Signature verified!" : "NOT verified!") << endl;
  217.         cout << endl;
  218.         if (hProv)
  219.         {
  220.             cout << "Free memory of CSP. \n";
  221.             CryptReleaseContext(hProv,0);
  222.         }
  223.         if (hPublicKey)
  224.         {
  225.             cout << "The Public key has been deleted.\n";
  226.             CryptDestroyKey(hPublicKey);
  227.         }
  228.         delete [] pbBlob;
  229.         delete [] pbSign;
  230.         system("PAUSE");
  231.         return 0;
  232.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement