Advertisement
Shokedbrain

signature

May 22nd, 2022
795
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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,NULL,
  36.             NULL,
  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_SIGNATURE,&hKey))
  50.     {
  51.         cout << "CryptGetUserKey successful. \n";
  52.     }
  53.     else
  54.         ErrorHandling();
  55.    
  56.     // Экспорт открытого ключа для использования проверяющей стороной
  57.  
  58.     BYTE*           pbBlob; // BLOB в котором мы будем хранить ключ
  59.     DWORD           dwBlobLen = 0; // длина BLOB
  60.    
  61.     // Вычисление объема памяти для экспорта ключа
  62.  
  63.     if (CryptExportKey(hKey,NULL,PUBLICKEYBLOB,0,NULL,
  64.         &dwBlobLen))
  65.     {
  66.         cout << "Computing size of blob succeed.\n";
  67.     }
  68.     else
  69.         ErrorHandling();
  70.  
  71.     // Непосредственный экспорт ключа
  72.     // Выделяем память под blob
  73.    
  74.     pbBlob = new BYTE[dwBlobLen];
  75.  
  76.     if (CryptExportKey(hKey,NULL,PUBLICKEYBLOB,0,pbBlob,&dwBlobLen))
  77.     {
  78.         cout << "Export key to BLOB succeed.\n";
  79.     }
  80.     else
  81.         ErrorHandling();
  82.  
  83.     // Вывод информации о BLOB
  84.    
  85.     cout << "BLOB has been created!\n"
  86.         << "BLOB Length: " << dwBlobLen << "\n";
  87.     cout << "Out BLOB\n";
  88.     for (int i = 0; i < static_cast<int>(dwBlobLen); i++)
  89.         cout << pbBlob[i];
  90.     cout << "\n";
  91.    
  92.     // Теперь мы имеем БЛОБ, который можно экспортировать файл для передачи проверяющей стороне
  93.  
  94.     // Уничтожаем информацию о ключе
  95.    
  96.     if (hKey)
  97.     {
  98.         cout << "Key has been deleted.\n";
  99.         CryptDestroyKey(hKey);
  100.     }
  101.    
  102.     // Вычисление хеш-значения подписываемых данных массива типа BYTE (PBYTE)
  103.  
  104.     // Создаём хеширующий объект
  105.    
  106.     if (CryptCreateHash(hProv,CALG_MD5,0,0,&hHash))
  107.     {
  108.         cout << "Hash object has been created\n";
  109.     }
  110.     else
  111.     {
  112.         ErrorHandling();
  113.     }
  114.  
  115.     // Вычисление хеша
  116.  
  117.     if (CryptHashData(hHash,pbBuffer,dwBufferLen,0))
  118.     {
  119.         cout << "The data has been hashed successful. \n";
  120.     }
  121.     else
  122.     {
  123.         ErrorHandling();
  124.     }
  125.    
  126.     // Вычисление размера памяти под подписываемый объект
  127.    
  128.     BYTE*           pbSign; // буфер подписи
  129.     DWORD           dwSignLen = 0; // длина буфера подписи
  130.  
  131.     if (CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, NULL, &dwSignLen))
  132.     {
  133.         cout << "Computing size of signature buffer succeed. \n";
  134.     }
  135.     else
  136.     {
  137.         ErrorHandling();
  138.     }
  139.  
  140.     pbSign =  new BYTE[dwSignLen];
  141.  
  142.     // Подпись объекта
  143.  
  144.     if (CryptSignHash(hHash, AT_SIGNATURE,NULL,0,pbSign,&dwSignLen))
  145.     {
  146.         cout << "Signature has been successful created.\n";
  147.     }
  148.     else
  149.     {
  150.         ErrorHandling();
  151.     }
  152.  
  153.     // Отображение информации о подписи в консоль
  154.  
  155.     for (int i = 0; i < static_cast<int>(dwSignLen); i++)
  156.         cout << pbSign[i];
  157.     cout << endl;
  158.    
  159.     if (hHash)
  160.     {
  161.         cout << "Free memory of Hash. \n";
  162.         CryptDestroyHash(hHash);
  163.     }
  164.    
  165.     // --- Проверяющая сторона ---
  166.     cout << "\t\tVerify signature\n";
  167.     HCRYPTKEY hPublicKey; // Публичный ключ
  168.  
  169.     // Импорт открытого ключа из BLOB
  170.     if (CryptImportKey(hProv,pbBlob,dwBlobLen,0,0,&hPublicKey))
  171.     {
  172.         cout << "The key has been imported successful. \n";
  173.     }
  174.     else
  175.     {
  176.         ErrorHandling();
  177.     }
  178.    
  179.     // Хешируем объект
  180.  
  181.     // Создаём хеширующий объект
  182.    
  183.     if (CryptCreateHash(hProv,CALG_MD5,0,0,&hHash))
  184.     {
  185.         cout << "Hash object has been created\n";
  186.     }
  187.     else
  188.     {
  189.         ErrorHandling();
  190.     }
  191.  
  192.     // Вычисление хеша
  193.  
  194.     if (CryptHashData(hHash,pbBuffer,dwBufferLen,0))
  195.     {
  196.         cout << "The data has been hashed successful. \n";
  197.     }
  198.     else
  199.     {
  200.         ErrorHandling();
  201.     }
  202.    
  203.     // Проверка цифровой подписи
  204.  
  205.     bool verification = CryptVerifySignature(hHash,pbSign,dwSignLen,hPublicKey,NULL,0);
  206.  
  207.     cout << endl;
  208.     cout << ((verification)? "Signature verified!" : "NOT verified!") << endl;
  209.     cout << endl;
  210.     if (hProv)
  211.     {
  212.         cout << "Free memory of CSP. \n";
  213.         CryptReleaseContext(hProv,0);
  214.     }
  215.     if (hPublicKey)
  216.     {
  217.         cout << "The Public key has been deleted.\n";
  218.         CryptDestroyKey(hPublicKey);
  219.     }
  220.     delete [] pbBlob;
  221.     delete [] pbSign;
  222.     system("PAUSE");
  223.     return 0;
  224. }
Advertisement
RAW Paste Data Copied
Advertisement