|
Crypt and Encrypt Data
- cryptandencryptdata.c
//ver- und wieder entschlüsseln eines Strings mit einem Passwort
#include <windows.h>
#include <stdio.h>
#include <wincrypt.h>
// lc cryptencryptdata.c advapi32.lib
//----------------------------------------------------------------------------
void CryptandEncryptData(BYTE Buf[100],char *Password)
{
HCRYPTPROV hProv;
HCRYPTHASH hPwdHash;
HCRYPTKEY hKey;
DWORD DataLen;
DWORD i;
DataLen = lstrlen(Buf)+1;
printf("vorher:\t\t%s\n",Buf);
if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0))
{
printf("error: %d\n",GetLastError());
exit(1);
}
if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hPwdHash))
{
printf("error: %d\n",GetLastError());
CryptReleaseContext(hProv, 0);
exit(1);
}
if(!CryptHashData(hPwdHash, Password, lstrlen(Password)+1, 0))
{
printf("error: %d\n",GetLastError());
CryptDestroyHash(hPwdHash);
CryptReleaseContext(hProv, 0);
exit(1);
}
if(!CryptDeriveKey(hProv, CALG_RC4, hPwdHash, CRYPT_CREATE_SALT, &hKey))
{
printf("error: %d\n",GetLastError());
CryptDestroyHash(hPwdHash);
CryptReleaseContext(hProv, 0);
exit(1);
}
printf("CryptDeriveKey:\t");
for(i=0; i<DataLen; i++) printf("%02x ", Buf[i]);
printf("\n");
CryptEncrypt(hKey, 0, TRUE, 0, Buf, &DataLen, 100);
printf("Crypt:\t");
for(i=0; i<DataLen; i++) printf("0x%02x, ",Buf[i]);
printf("\n");
CryptDecrypt(hKey, 0, TRUE, 0, Buf, &DataLen);
printf("Decrypt:\t");
for(i=0; i<DataLen; i++) printf("%02x ",Buf[i]);
printf("\n");
printf("nachher:\t%s\n", Buf);
CryptDestroyKey(hKey);
CryptDestroyHash(hPwdHash);
CryptReleaseContext(hProv, 0);
}
//--------------------------------------------------------------------------
int main (int argc, char **argv)
{
/* Sind die erforderlichen Kommandozeilenargumente vorhanden? */
if (argc != 3) {
fprintf( stderr, "usage: %s stringtoCrypt password\n",argv[0]);
exit(1);
}
//printf("%s\t%s\n", argv[1],argv[2]);
CryptandEncryptData(argv[1],argv[2]);
return 0;
}
|
|