请高手帮忙把VC中调用微软CSP加密服务模块的程序翻译成Delphi的,万分感谢!!!
cryptography.cpp如下:
#include "StdAfx.h"
CCryptography::CCryptography(LPTSTR pProviderName,DWORD dwProviderType,ALG_ID uiAlgId,ALG_ID hashAlg)
{
if(strcmp(pProviderName,"NEU ECC Cryptography Provider V1.0") ==0)
{
pProviderName = "Microsoft Base Cryptographic Provider v1.0";
dwProviderType = 1;
}
m_pProviderName = pProviderName;
m_dwProviderType = dwProviderType;
m_uiAlgId = uiAlgId;
m_uiHashAlgId = hashAlg;
}CCryptography::~CCryptography(void)
{
}//EncryptFile
bool CCryptography::EncryptFile(char * pSourceFile,char * pDestFile,char * pPassword)
{
FILE * pSource = NULL;
FILE * pDest = NULL;
INT eof = 0;
HCRYPTPROV hProv = 0;
HCRYPTKEY hKey = 0;
HCRYPTKEY hXchgKey = 0;
PBYTE pbKeyBlob = NULL;
HCRYPTHASH hHash   = 0;
DWORD  dwKeyBlobLen;
PBYTE pbBuffer = NULL;
DWORD dwBufferLen;
DWORD dwCount;

//打开源文件和目标文件
if(!(pSource = fopen(pSourceFile,"rb")))
{
ShowErrorMsg(GetLastError());
return false;
}
if(!(pDest = fopen(pDestFile,"wb")))
{
ShowErrorMsg(GetLastError());
if(pSource) fclose(pSource);
return false;
}
//获取默认密码服务提供商
if(!CryptAcquireContext(&hProv,NULL,Microsoft Base Cryptographic Provider v1.0,1,0))//密钥容器不存在
{
if(GetLastError() == NTE_BAD_KEYSET)
{
if(!CryptAcquireContext(&hProv,NULL,m_pProviderName,m_dwProviderType,CRYPT_NEWKEYSET))//创建密钥容器不成功
{
ShowErrorMsg(GetLastError());
ReleaseVariant(pSource,pDest ,pbKeyBlob,pbBuffer,hProv,hKey,hXchgKey,hHash);
return false;
}
}
else
{
ShowErrorMsg(GetLastError());
ReleaseVariant(pSource,pDest ,pbKeyBlob,pbBuffer,hProv,hKey,hXchgKey,hHash);
return false;
}
}
if(pPassword == NULL)//不使用用户密码
{
//创建会话密钥,获取公钥句柄,加密密钥为隐码
if(!CryptGenKey(hProv,m_uiAlgId,CRYPT_EXPORTABLE,&hKey))
{
ShowErrorMsg(GetLastError());
ReleaseVariant(pSource,pDest ,pbKeyBlob,pbBuffer,hProv,hKey,hXchgKey,hHash);
return false;
}
if(!CryptGetUserKey(hProv,AT_KEYEXCHANGE,&hXchgKey))
{
if(GetLastError() == NTE_NO_KEY)//没有交换秘要则创建
{
if(!CryptGenKey(hProv,AT_KEYEXCHANGE,0,&hXchgKey))
{
ShowErrorMsg(GetLastError());
ReleaseVariant(pSource,pDest ,pbKeyBlob,pbBuffer,hProv,hKey,hXchgKey,hHash);
return false;
}
}
else
{

ShowErrorMsg(GetLastError());
ReleaseVariant(pSource,pDest ,pbKeyBlob,pbBuffer,hProv,hKey,hXchgKey,hHash);
return false;
}
}
//判断隐码大小并分配内存
if(!CryptExportKey(hKey,hXchgKey,SIMPLEBLOB,0,NULL,&dwKeyBlobLen))
{

ShowErrorMsg(GetLastError());
ReleaseVariant(pSource,pDest ,pbKeyBlob,pbBuffer,hProv,hKey,hXchgKey,hHash);
return false;
}
if(!(pbKeyBlob = (unsigned char*)malloc(dwKeyBlobLen)))
{
ShowErrorMsg(GetLastError());
ReleaseVariant(pSource,pDest ,pbKeyBlob,pbBuffer,hProv,hKey,hXchgKey,hHash);
return false;
}
//输出会话密钥到隐码并释放公钥句柄
if(!CryptExportKey(hKey,hXchgKey,SIMPLEBLOB,0,pbKeyBlob,&dwKeyBlobLen))
{
ShowErrorMsg(GetLastError());
ReleaseVariant(pSource,pDest ,pbKeyBlob,pbBuffer,hProv,hKey,hXchgKey,hHash);
return false;
}
CryptDestroyKey(hXchgKey);
hXchgKey = 0;
//向目标文件传递隐码
fwrite(&dwKeyBlobLen,sizeof(DWORD),1,pDest);
fwrite(pbKeyBlob,1,dwKeyBlobLen,pDest); }else //使用用户密码
{
//创建一个Hash对象
if(!CryptCreateHash(hProv, m_uiHashAlgId, 0, 0, &hHash))
{
ShowErrorMsg(GetLastError());
ReleaseVariant(pSource,pDest ,pbKeyBlob,pbBuffer,hProv,hKey,hXchgKey,hHash);
return false;
}
// 用输入的密码产生一个散列
if(!CryptHashData(hHash, (BYTE *)pPassword, strlen(pPassword), 0))
{
ShowErrorMsg(GetLastError());
ReleaseVariant(pSource,pDest ,pbKeyBlob,pbBuffer,hProv,hKey,hXchgKey,hHash);
return false;
}
// 通过散列生成会话密钥(session key) if(!CryptDeriveKey(hProv, m_uiAlgId,  hHash,  CRYPT_CREATE_SALT,  &hKey))
{
ShowErrorMsg(GetLastError());
ReleaseVariant(pSource,pDest ,pbKeyBlob,pbBuffer,hProv,hKey,hXchgKey,hHash);
return false;
}
}
//采用流密码加密:块长为1,并分配内存
dwBufferLen = 1;
pbBuffer = (unsigned char*) malloc(dwBufferLen);
//加密源文件并写向目标文件
do{
dwCount = fread(pbBuffer,1,1,pSource);
eof = feof(pSource);
if(!CryptEncrypt(hKey,0,eof,0,pbBuffer,&dwCount,dwBufferLen))
{
ShowErrorMsg(GetLastError());
ReleaseVariant(pSource,pDest ,pbKeyBlob,pbBuffer,hProv,hKey,hXchgKey,hHash);
return false;
}
fwrite(pbBuffer,1,dwCount,pDest);
}while(!feof(pSource));
ReleaseVariant(pSource,pDest ,pbKeyBlob,pbBuffer,hProv,hKey,hXchgKey,hHash);
return true;
}void CCryptography::ShowErrorMsg(DWORD dwErrorCode)
{
CString errMsg; LPVOID lpMsgBuf;
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, dwErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );
errMsg.Append((LPCTSTR)lpMsgBuf);
errMsg.Format(errMsg+"(0X%X)",GetLastError());
AfxMessageBox(errMsg);}
void CCryptography::ReleaseVariant(FILE *pSource,FILE *pDest ,
   PBYTE pbKeyBlob,PBYTE pbBuffer,HCRYPTPROV hProv,
   HCRYPTKEY hKey ,HCRYPTKEY hXchgKey,HCRYPTHASH hHash)
{
if(pSource) fclose(pSource);
if(pDest) fclose(pDest);
if(pbKeyBlob) free(pbKeyBlob);
if(pbBuffer) free(pbBuffer);
if(hHash) CryptDestroyHash(hHash); 
if(hKey) CryptDestroyKey(hKey);
if(hXchgKey) CryptDestroyKey(hXchgKey);
if(hProv) CryptReleaseContext(hProv,0);
}