Advertisement
mrAnderson33

Шифрование симметричным ключом c++(CryptoAPI)

Jun 14th, 2018
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.18 KB | None | 0 0
  1. #pragma warning(disable : 4996)
  2.  
  3. #include <stdio.h>
  4. #include <windows.h>
  5. #include <wincrypt.h>
  6. #include <iostream>
  7. #include <string>
  8.  
  9. char        SysMessage[512];
  10. HCRYPTPROV  hProv = 0;
  11. HCRYPTKEY   hKey = 0;
  12. BYTE        *pCryptBuf = 0;
  13.  
  14. char* GetSysMessage(DWORD errcode)
  15. {
  16.     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
  17.         | FORMAT_MESSAGE_IGNORE_INSERTS,    // don't use arguments    
  18.         NULL,                               // don't use format string
  19.         errcode,                            // error code
  20.         0,                                  // any language
  21.         SysMessage, sizeof(SysMessage),     // message buffer
  22.         NULL);                              // no additional arguments
  23.     return(SysMessage);
  24. }
  25.  
  26. void ErrorExit(int err)
  27. {
  28.     if (hKey)
  29.         CryptDestroyKey(hKey);
  30.     if (hProv)
  31.         CryptReleaseContext(hProv, 0);
  32.     if (pCryptBuf)
  33.         free(pCryptBuf);
  34.  
  35.     system("pause");
  36.  
  37.     exit(err);
  38. }
  39.  
  40. int main()
  41. {
  42.     char        *pSrcData;
  43.     BOOL        bRes;
  44.     DWORD       buflen;
  45.     DWORD       datalen;
  46.  
  47.     // Acquire a handle to CSP
  48.     bRes = CryptAcquireContext(
  49.         &hProv,            // returned crypto-provider handle
  50.         NULL,              // use default key container.
  51.         MS_DEF_PROV,       // use default CSP.
  52.         PROV_RSA_FULL,     // MS RSA provider (always presents)
  53.         0);               // no special action.
  54.     if (!bRes)
  55.     {
  56.         printf("CryptAcquireContext failed: %s\n", GetSysMessage(GetLastError()));
  57.         //ErrorExit(1);
  58.     }
  59.  
  60.     //  Create RC4 symmetrci key
  61.     bRes = CryptGenKey(hProv,              // CSP handle
  62.         CALG_RC4,           // RC4 algotrythm
  63.         0 | CRYPT_NO_SALT,  // no "salt", no export, default length
  64.         &hKey);
  65.     if (!bRes)
  66.     {
  67.         printf("CryptGenKey failed: %s\n", GetSysMessage(GetLastError()));
  68.         ErrorExit(1);
  69.     }
  70.  
  71.     std::cout << "Please enter line to encrypt:\n";
  72.  
  73.     std::string message;
  74.     std::getline(std::cin,message);
  75.  
  76.     // Determine buffer length
  77.     pSrcData = (char *) (message.c_str());
  78.     datalen = strlen(pSrcData);
  79.     buflen = datalen;
  80.     bRes = CryptEncrypt(hKey,
  81.         0,          // no hash
  82.         TRUE,       // "final" flag
  83.         0,          // reserved
  84.         NULL,       // calculate buffer size only
  85.         &buflen,    // return size for ciphered text
  86.         0);
  87.     if (!bRes) {
  88.         printf("CryptEncrypt (buffer size) failed: %s\n",
  89.             GetSysMessage(GetLastError()));
  90.         ErrorExit(1);
  91.     }
  92.  
  93.     printf("text '%s' needs %d bytes for encryption buffer\n", pSrcData, buflen);
  94.  
  95.     // Encrypt
  96.     pCryptBuf = (BYTE*)malloc(buflen);
  97.     strncpy((char*)pCryptBuf, pSrcData, datalen);
  98.     bRes = CryptEncrypt(hKey,
  99.         0,          // no hash
  100.         TRUE,       // "final" flag
  101.         0,          // reserved
  102.         pCryptBuf,  // buffer with data
  103.         &datalen,   // return size for ciphered text
  104.         buflen);
  105.     if (!bRes) {
  106.         printf("CryptEncrypt (encryption) failed: %s\n",
  107.             GetSysMessage(GetLastError()));
  108.         ErrorExit(1);
  109.     }
  110.  
  111.     printf("encrypted text is '%.*s' (%d bytes)\n",
  112.         datalen, pCryptBuf, datalen);
  113.  
  114.     // Decrypt back
  115.     datalen = buflen;
  116.     bRes = CryptDecrypt(hKey,
  117.         0,
  118.         TRUE,
  119.         0,
  120.         pCryptBuf,
  121.         &datalen);
  122.     if (!bRes) {
  123.         printf("CryptDecrypt failed: %s\n",
  124.             GetSysMessage(GetLastError()));
  125.         ErrorExit(1);
  126.     }
  127.  
  128.     printf("decrypted text is '%.*s'\n", datalen, pCryptBuf);
  129.  
  130.  
  131.     // Cleanup
  132.     ErrorExit(0);
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement