Discussion:
CryptDecript error
(too old to reply)
Marcio Campos
2008-05-22 13:41:01 UTC
Permalink
I have a simple program in C# that encypt aand decrypt a small file that uses
CryptAPI. After I encrypt a plain file I just after that I decrypt the
cypherblock. The call to cryptdecrypt returns with error 80090005. Can
anybody help me ?

The part of the program that is in trouble is :

private void btnGerarChaveTDES_Click(object sender, EventArgs e)

{

IntPtr hProv = new IntPtr();

string pszContainer = null;

string pszProvider = "SafeSign Standard Cryptographic Service
Provider";

uint dwProvType = 1; // "1 - PROV_RSA_FULL";

uint dwFlags = 32; // "8 - CRYPT_NEWKEYSET";



int erro = 0;



CryptAcquireContext(ref hProv, pszContainer, pszProvider,
dwProvType, dwFlags);



erro = Marshal.GetLastWin32Error();



// Gera a chave TDES

// =============================================================

//IntPtr pnKey = new IntPtr();

IntPtr pnKey = new IntPtr();

uint Aldid = ((3 << 13) | (3 << 9) | (3));

uint dwFlags2 = 1; //1 - CRYPT EXPORTABLE



CryptGenKey(hProv, Aldid, dwFlags2, ref pnKey);



erro = Marshal.GetLastWin32Error();







// Importa a chava para o cartão

// =============================================================

IntPtr hExpKey = new IntPtr();

IntPtr nPubKey = new IntPtr();

uint dwFlags3 = 0;



CryptImportKey(hProv, pbData, pbData.Length, nPubKey, dwFlags3,
ref hExpKey);



erro = Marshal.GetLastWin32Error();





// Exporta a chave

// =============================================================

Int32 dwBlobType = 1; //"1 - SIMPLEBLOB";

Int32 dwFlags4 = 0;

Byte[] pbData2 = null;

Int32 pdwDataLen = 0;



CryptExportKey(pnKey, hExpKey, dwBlobType, dwFlags4, null, ref
pdwDataLen);



erro = Marshal.GetLastWin32Error();



pbData2 = new byte[pdwDataLen];



CryptExportKey(pnKey, hExpKey, dwBlobType, dwFlags4, pbData2,
ref pdwDataLen);



erro = Marshal.GetLastWin32Error();



GravarArquivo(pbData2, "c:\\BlobTDes.blb");





// Ler arquivo texto e encriptar

// =============================================================

IntPtr hHash = new IntPtr(0);

int Final = 1; // ultimo bloco ou não

uint dwFlags5 = 0;





//byte[] bufferArquivo = new byte[11027 + 130];

byte[] bufferArquivo = new byte[128];

byte[] arquivo = LerArquivo("c:\\texto.txt");

int arquivoLen = arquivo.Length;



arquivo.CopyTo(bufferArquivo, 0);



int dwBufLen = bufferArquivo.Length;





CryptEncrypt(pnKey, hHash, Final, dwFlags5, bufferArquivo, ref
arquivoLen, dwBufLen);



erro = Marshal.GetLastWin32Error();



//byte[] aux = new byte[arquivoLen];

//for (int i = 0; i < aux.Length; i++)

// aux[i] = bufferArquivo[i];



////GravarArquivo(bufferArquivo, "c:\\texto_cripto.txt");

//GravarArquivo(aux, "c:\\texto_cripto.txt");





//// Zera o vetor de incializaçao

//// =============================================================

//uint dwParam = 1; // 1 - KP_IV

//byte[] pbData3 = new byte[8];

//uint dwFlags6 = 0;



//for (int i = 0; i < 8; i++)

// pbData3[i] = 0;



//bool bln1 = CryptSetKeyParam(pnKey, dwParam, pbData3, dwFlags6);



//erro = Marshal.GetLastWin32Error();



bool bln2 = CryptDecrypt(pnKey, hHash, Final, dwFlags5, ref
bufferArquivo, ref arquivoLen);



erro = Marshal.GetLastWin32Error();





}
d***@gmail.com
2008-06-16 10:38:53 UTC
Permalink
Why are you posting in this forum of java?
Post by Marcio Campos
I have a simple program in C# that encypt aand decrypt a small file that uses
CryptAPI. After I encrypt a plain file I just after that I decrypt the
cypherblock. The call to cryptdecrypt returns with error 80090005. Can
anybody help me ?
private void btnGerarChaveTDES_Click(object sender, EventArgs e)
{
IntPtr hProv = new IntPtr();
string pszContainer = null;
string pszProvider = "SafeSign Standard Cryptographic Service
Provider";
uint dwProvType = 1; // "1 - PROV_RSA_FULL";
uint dwFlags = 32; // "8 - CRYPT_NEWKEYSET";
int erro = 0;
CryptAcquireContext(ref hProv, pszContainer, pszProvider,
dwProvType, dwFlags);
erro = Marshal.GetLastWin32Error();
// Gera a chave TDES
//
=============================================================
//IntPtr pnKey = new IntPtr();
IntPtr pnKey = new IntPtr();
uint Aldid = ((3 << 13) | (3 << 9) | (3));
uint dwFlags2 = 1; //1 - CRYPT EXPORTABLE
CryptGenKey(hProv, Aldid, dwFlags2, ref pnKey);
erro = Marshal.GetLastWin32Error();
// Importa a chava para o cartão
//
=============================================================
IntPtr hExpKey = new IntPtr();
IntPtr nPubKey = new IntPtr();
uint dwFlags3 = 0;
CryptImportKey(hProv, pbData, pbData.Length, nPubKey, dwFlags3,
ref hExpKey);
erro = Marshal.GetLastWin32Error();
// Exporta a chave
//
=============================================================
Int32 dwBlobType = 1; //"1 - SIMPLEBLOB";
Int32 dwFlags4 = 0;
Byte[] pbData2 = null;
Int32 pdwDataLen = 0;
CryptExportKey(pnKey, hExpKey, dwBlobType, dwFlags4, null, ref
pdwDataLen);
erro = Marshal.GetLastWin32Error();
pbData2 = new byte[pdwDataLen];
CryptExportKey(pnKey, hExpKey, dwBlobType, dwFlags4, pbData2,
ref pdwDataLen);
erro = Marshal.GetLastWin32Error();
GravarArquivo(pbData2, "c:\\BlobTDes.blb");
// Ler arquivo texto e encriptar
//
=============================================================
IntPtr hHash = new IntPtr(0);
int Final = 1; // ultimo bloco ou não
uint dwFlags5 = 0;
//byte[] bufferArquivo = new byte[11027 + 130];
byte[] bufferArquivo = new byte[128];
byte[] arquivo = LerArquivo("c:\\texto.txt");
int arquivoLen = arquivo.Length;
arquivo.CopyTo(bufferArquivo, 0);
int dwBufLen = bufferArquivo.Length;
CryptEncrypt(pnKey, hHash, Final, dwFlags5, bufferArquivo, ref
arquivoLen, dwBufLen);
erro = Marshal.GetLastWin32Error();
//byte[] aux = new byte[arquivoLen];
//for (int i = 0; i < aux.Length; i++)
// aux[i] = bufferArquivo[i];
////GravarArquivo(bufferArquivo, "c:\\texto_cripto.txt");
//GravarArquivo(aux, "c:\\texto_cripto.txt");
//// Zera o vetor de incializaçao
////
=============================================================
//uint dwParam = 1; // 1 - KP_IV
//byte[] pbData3 = new byte[8];
//uint dwFlags6 = 0;
//for (int i = 0; i < 8; i++)
// pbData3[i] = 0;
//bool bln1 = CryptSetKeyParam(pnKey, dwParam, pbData3, dwFlags6);
//erro = Marshal.GetLastWin32Error();
bool bln2 = CryptDecrypt(pnKey, hHash, Final, dwFlags5, ref
bufferArquivo, ref arquivoLen);
erro = Marshal.GetLastWin32Error();
}
Loading...