一个数字证书的程序为什么只能在我的机子上编译成功?
下面这个程序在我的2003 server 系统上编译成功并运行很正常,但是我发现自己的程序在别人机器上运行时显示Acess Violation,我的程序可是静态编译过的.然后发现,这段代码在别人机器上编译通过,但是运行显示Acess Violation类似信息,请问这是什么原因啊?
向各位大牛求救!!
bool CPublicClass::CAPIEncryptFile(PCHAR szSource, PCHAR szDestination, String szPassword)
{
//TODO: Add your source code here
FILE *hSource;
FILE *hDestination;
int eof;
HCRYPTPROV hProv ;
HCRYPTKEY hKey ;
HCRYPTKEY hXchgKey ;
HCRYPTHASH hHash ;
PBYTE pbKeyBlob ;
DWORD dwKeyBlobLen;
PBYTE pbBuffer ;
DWORD dwBlockLen;
DWORD dwBufferLen;
DWORD dwCount;
hSource = fopen(szSource,"rb");// 打开源文件.
hDestination = fopen(szDestination,"wb") ;//打开目标文件
if (hSource==NULL) {ShowMessage("open Source File error !"); return false ;}
if (hDestination==NULL){ ShowMessage("open Destination File error !"); return false ;}
// 连接缺省的CSP
if(!CryptAcquireContext(&hProv, NULL, NULL,PROV_RSA_FULL, 0))
{
ShowMessage("Error reading CSP name "+ GetLastError());
return false ;
}
if(szPassword =="")//口令为空,使用随机产生的会话密钥加密
{
// 产生随机会话密钥.
if(!CryptGenKey(hProv, ENCRYPT_ALGORITHM,CRYPT_EXPORTABLE, &hKey)){
ShowMessage("Error 产生随机会话密钥 during CryptGenKey "+ GetLastError());
return false ;
}
// 取得密钥交换对的公共密钥
if(!CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hXchgKey)){
ShowMessage("Error 取得密钥交换对的公共密钥 during CryptGetuserKey "+ GetLastError());
return false ;
}
// 计算隐码长度并分配缓冲区
if(!CryptExportKey(hKey, hXchgKey, SIMPLEBLOB, 0,NULL, &dwKeyBlobLen)){
ShowMessage("error 计算隐码长度并分配缓冲区 "+GetLastError());
return false ;
}
pbKeyBlob=(PBYTE )malloc(dwKeyBlobLen) ;
// 将会话密钥输出至隐码
if(!CryptExportKey(hKey, hXchgKey, SIMPLEBLOB,0, pbKeyBlob, &dwKeyBlobLen)){
ShowMessage("error 将会话密钥输出至隐码 "+GetLastError());
return false ;
}
// 释放密钥交换对的句柄
CryptDestroyKey(hXchgKey);
hXchgKey = 0;
// 将隐码长度写入目标文件
fwrite(&dwKeyBlobLen, sizeof(DWORD), 1, hDestination);
//DKBL=dwKeyBlobLen;
//将隐码长度写入目标文件
fwrite(pbKeyBlob, 1, dwKeyBlobLen, hDestination);
//PKB=pbKeyBlob;
}
else {//口令不为空, 使用从口令派生出的密钥加密文件
// 建立散列表
if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)){
ShowMessage("error 建立散列表"+GetLastError());
return false ;
}
//散列口令
if(!CryptHashData(hHash, szPassword.c_str() , szPassword.Length(), 0)) {
ShowMessage("error 散列口令 "+GetLastError());
return false ;
}
// 从散列表中派生密钥
if(!CryptDeriveKey(hProv, ENCRYPT_ALGORITHM, hHash, 0, &hKey)){
ShowMessage("error 从散列表中派生密钥 "+GetLastError());
return false ;
}
// 删除散列表
CryptDestroyHash(hHash);
hHash = 0;
}
//计算一次加密的数据字节数,必须为ENCRYPT_BLOCK_SIZE的整数倍
dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE;
//如果使用块编码,则需要额外空间
if( ENCRYPT_BLOCK_SIZE>1 )
{
dwBufferLen=dwBlockLen+ENCRYPT_BLOCK_SIZE;
}
else
{
dwBufferLen=dwBlockLen;
}
//分配缓冲区
pbBuffer=(PBYTE )malloc(dwBufferLen);
//加密源文件并写入目标文件
do {
// 从源文件中读出dwBlockLen个字节
dwCount = fread(pbBuffer, 1, dwBlockLen, hSource);
eof = feof(hSource);
//加密数据
CryptEncrypt(hKey, 0, eof, 0, pbBuffer,&dwCount, dwBufferLen);
// 将加密过的数据写入目标文件
fwrite(pbBuffer, 1, dwCount, hDestination);
} while(!feof(hSource));
//关闭文件、释放内存
fclose(hSource);
fclose(hDestination);
return true ;
}
//---------------------------------------------------------------------------
//文件解密
bool CPublicClass::CAPIDecryptFile(PCHAR szSource, PCHAR szDestination, String szPassword)
{
//TODO: Add your source code here
FILE *hSource ;
FILE *hDestination ;
int eof;
HCRYPTPROV hProv ;
HCRYPTKEY hKey ;
HCRYPTKEY hXchgKey ;
HCRYPTHASH hHash ;
PBYTE pbKeyBlob ;
DWORD dwKeyBlobLen;
PBYTE pbBuffer ;
DWORD dwBlockLen;
DWORD dwBufferLen;
DWORD dwCount;
//szPassword="mxh";
//hSource = fopen("b.dat","rb");// 打开源文件.
//hDestination = fopen("c.dat","wb") ;//打开目标文件
hSource = fopen(szSource,"rb");// 打开源文件.
hDestination = fopen(szDestination,"wb") ;//打开目标文件
if (hSource==NULL)
{
ShowMessage("open Source File error !");
return false ;
}
if (hDestination==NULL)
{
ShowMessage("open Destination File error !");
return false ;
}
if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0))
{
ShowMessage("Error reading CSP name "+ GetLastError());
return false ;
}
if(szPassword =="") {// 口令为空,使用存储在加密文件中的会话密钥解密
// 读隐码的长度并分配内存
fread(&dwKeyBlobLen, sizeof(DWORD), 1, hSource);
pbKeyBlob =(PBYTE)malloc(dwKeyBlobLen);
// 从源文件中读隐码.
fread(pbKeyBlob, 1, dwKeyBlobLen, hSource);
// 将隐码输入CSP
if(!CryptImportKey(hProv, pbKeyBlob,dwKeyBlobLen, 0, 0, &hKey))
{
ShowMessage("Error "+ GetLastError());
return false ;
}
}
else {// 口令不为空, 使用从口令派生出的密钥解密文件
if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) {
ShowMessage("Error "+ GetLastError());
return false ;
}
if(!CryptHashData(hHash, szPassword.c_str() , szPassword.Length() , 0)){
ShowMessage("Error "+ GetLastError());
return false ;
}
if(!CryptDeriveKey(hProv, ENCRYPT_ALGORITHM,hHash, 0, &hKey)) {
ShowMessage("Error "+ GetLastError());
return false ;
}
CryptDestroyHash(hHash);
hHash = 0;
}
dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE;
if(ENCRYPT_BLOCK_SIZE >1)
{
dwBufferLen =dwBlockLen+ENCRYPT_BLOCK_SIZE;
}
else
{
dwBufferLen = dwBlockLen;
}
pbBuffer =(PBYTE )malloc(dwBufferLen);
//解密源文件并写入目标文件
do {
dwCount = fread(pbBuffer, 1, dwBlockLen, hSource);
eof = feof(hSource);
// 解密数据
if(!CryptDecrypt(hKey, 0, eof, 0, pbBuffer, &dwCount)) {
ShowMessage("Error 解密数据 "+ GetLastError());
return false ;
}
// 将解密过的数据写入目标文件
fwrite(pbBuffer, 1, dwCount, hDestination);
} while(!feof(hSource));
//关闭文件、释放内存
fclose(hSource);
fclose(hDestination);
return true ;
}