Marcio Campos
2008-05-22 13:57:13 UTC
I wrongly posted this question in another group.
I have a simple C# program to encrypt and decrypt a small file using a
smartcard. I can encrypt the file but when I try to decrypit, the
CryptDecrypt call returns with error code 80090005. The troubled part of the
program is below
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();
}
I have a simple C# program to encrypt and decrypt a small file using a
smartcard. I can encrypt the file but when I try to decrypit, the
CryptDecrypt call returns with error code 80090005. The troubled part of the
program is below
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();
}