Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma warning(disable : 4996)
- #include <stdio.h>
- #include <windows.h>
- #include <wincrypt.h>
- #include <iostream>
- #include <string>
- char SysMessage[512];
- HCRYPTPROV hProv = 0;
- HCRYPTKEY hKey = 0;
- BYTE *pCryptBuf = 0;
- char* GetSysMessage(DWORD errcode)
- {
- FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
- | FORMAT_MESSAGE_IGNORE_INSERTS, // don't use arguments
- NULL, // don't use format string
- errcode, // error code
- 0, // any language
- SysMessage, sizeof(SysMessage), // message buffer
- NULL); // no additional arguments
- return(SysMessage);
- }
- void ErrorExit(int err)
- {
- if (hKey)
- CryptDestroyKey(hKey);
- if (hProv)
- CryptReleaseContext(hProv, 0);
- if (pCryptBuf)
- free(pCryptBuf);
- system("pause");
- exit(err);
- }
- int main()
- {
- char *pSrcData;
- BOOL bRes;
- DWORD buflen;
- DWORD datalen;
- // Acquire a handle to CSP
- bRes = CryptAcquireContext(
- &hProv, // returned crypto-provider handle
- NULL, // use default key container.
- MS_DEF_PROV, // use default CSP.
- PROV_RSA_FULL, // MS RSA provider (always presents)
- 0); // no special action.
- if (!bRes)
- {
- printf("CryptAcquireContext failed: %s\n", GetSysMessage(GetLastError()));
- //ErrorExit(1);
- }
- // Create RC4 symmetrci key
- bRes = CryptGenKey(hProv, // CSP handle
- CALG_RC4, // RC4 algotrythm
- 0 | CRYPT_NO_SALT, // no "salt", no export, default length
- &hKey);
- if (!bRes)
- {
- printf("CryptGenKey failed: %s\n", GetSysMessage(GetLastError()));
- ErrorExit(1);
- }
- std::cout << "Please enter line to encrypt:\n";
- std::string message;
- std::getline(std::cin,message);
- // Determine buffer length
- pSrcData = (char *) (message.c_str());
- datalen = strlen(pSrcData);
- buflen = datalen;
- bRes = CryptEncrypt(hKey,
- 0, // no hash
- TRUE, // "final" flag
- 0, // reserved
- NULL, // calculate buffer size only
- &buflen, // return size for ciphered text
- 0);
- if (!bRes) {
- printf("CryptEncrypt (buffer size) failed: %s\n",
- GetSysMessage(GetLastError()));
- ErrorExit(1);
- }
- printf("text '%s' needs %d bytes for encryption buffer\n", pSrcData, buflen);
- // Encrypt
- pCryptBuf = (BYTE*)malloc(buflen);
- strncpy((char*)pCryptBuf, pSrcData, datalen);
- bRes = CryptEncrypt(hKey,
- 0, // no hash
- TRUE, // "final" flag
- 0, // reserved
- pCryptBuf, // buffer with data
- &datalen, // return size for ciphered text
- buflen);
- if (!bRes) {
- printf("CryptEncrypt (encryption) failed: %s\n",
- GetSysMessage(GetLastError()));
- ErrorExit(1);
- }
- printf("encrypted text is '%.*s' (%d bytes)\n",
- datalen, pCryptBuf, datalen);
- // Decrypt back
- datalen = buflen;
- bRes = CryptDecrypt(hKey,
- 0,
- TRUE,
- 0,
- pCryptBuf,
- &datalen);
- if (!bRes) {
- printf("CryptDecrypt failed: %s\n",
- GetSysMessage(GetLastError()));
- ErrorExit(1);
- }
- printf("decrypted text is '%.*s'\n", datalen, pCryptBuf);
- // Cleanup
- ErrorExit(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement