一个数字证书的程序为什么只能在我的机子上编译成功?

coder4 2004-12-16 10:09:58
下面这个程序在我的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 ;
}
...全文
143 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
NowCan 2004-12-18
  • 打赏
  • 举报
回复
缺少定义
ENCRYPT_ALGORITHM
ENCRYPT_BLOCK_SIZE
windxnet 2004-12-18
  • 打赏
  • 举报
回复
估计使用倒了一些动态链接库没有吧
NowCan 2004-12-18
  • 打赏
  • 举报
回复
我试试
lihongxing2002 2004-12-17
  • 打赏
  • 举报
回复
up

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧