关于使用CryptAPI的例子中,在session key的生成中采用两种方法:
1。使用CryptGenKey生成随机会话密钥,进行加解密。
2。给出密码,对密码进行哈希运算,之后使用CryptDeriveKey派生密码。
能不能有一种方法,直接将密钥从程序写入,之后对文本进行加解密。(不考虑过多安全)
请高手最好给出例子,多谢多谢
1。使用CryptGenKey生成随机会话密钥,进行加解密。
2。给出密码,对密码进行哈希运算,之后使用CryptDeriveKey派生密码。
能不能有一种方法,直接将密钥从程序写入,之后对文本进行加解密。(不考虑过多安全)
请高手最好给出例子,多谢多谢
解决方案 »
- 用CByteArray作为dll函数中的参数,但在析构这个参数时出错?
- 关于debub没问题而 release 就出错的问题
- 用DriverStudio在vc++6.0集成开发环境下出现的错误??
- 多线程程序一个线程push_back,另一线程用循环查找了符合条件的pos并vector.erase(pos)使程序崩溃,在循环中发现pos无效为什么?
- VC++2005问题:如何添加Active控件
- 请问如何用package & deployment wizard工具打包vc++开发的控件以及相关文件?在线等待,急!!!!
- 服务中操作注册表为何不起作用??急,在线等!!
- COM+组件服务管理器出现注册表方面的问题,请问如何解决,不胜感激。
- 如何查找系统函数定义描述
- MFC如何在线程中实时刷新界面
- VC快捷键大全,抛砖引玉,请跟贴补充,分数多多。
- COM构造函数可以传递参数进去吗?
我是说还要使用CryptAPI的相应函数进行加密。
例如我有一个密钥变量char* key={0a,a1....}
如何将他导入到CSP中,得到key的HCRYPTKEY hKey ,这样就能使用CryptEncrypt函数
进行加密了
Sessionkey 有它自己的格式,你自己读文件不知能否符合它的格式。用session密钥最好是用你自己的两个方法,或者是把session密钥export到文件里 ,然后在另一方import文件,用session来加密。
我的代码把sessionkey用公钥来加密然后输出到文件里
////////////////////////////////加密文件
BOOL crypto::Encrypt(CString strPathName)
{
//////////////////////////////读入要加密的文件
CFile file;
file.Open(strPathName,CFile::modeRead);
dwBufferLenEn = file.GetLength();
pbBufferEn=new BYTE[dwBufferLenEn];//先分配内存
file.Read (pbBufferEn,dwBufferLenEn);
AfxMessageBox((char*)pbBufferEn);
file.Close();
if(!CryptGenKey(hProv, CALG_RC4, CRYPT_EXPORTABLE, &hSessionKey))//随机产生一个会话密钥
{
//AfxMessageBox("CryptGenKeyError");
return 0;
}
if(!CryptEncrypt(hSessionKey,0,TRUE,0,pbBufferEn,&dwBufferLenEn,1000))//用会话密钥加密文件
{
AfxMessageBox("CryptEncryptError");
return 0;
}
///////////////////////////////////////生成加密的文件
CString strPath=strPathName;
strPathName+=".encrypt";
if(file.Open(strPathName,CFile::modeRead))
{
CString strTemp;
strTemp.Format("生成加密的文件",strPathName);
if(AfxMessageBox(strTemp,MB_YESNO)==IDNO) return 0;
file.Close();
}
file.Open(strPathName,CFile::modeCreate|CFile::modeWrite);
file.Write(pbBufferEn,dwBufferLenEn);
file.Close();
CString strTemp;
strTemp.Format("生成加密的文件成功",strPathName);
AfxMessageBox(strTemp);
//AfxMessageBox((char*)pbBuffer);
strPathName=strPath;
InitExport(strPathName);
}
void crypto::Decrypt(CString strPathName)
{
/////////////////////////////读入加密的文件
CFile file;
CString str;
str=strPathName;
strPathName+=".encrypt";
file.Open(strPathName,CFile::modeRead);
dwBufferLenDe = file.GetLength();
dwBufferLenDeout = file.GetLength();
pbBufferDe=new BYTE[dwBufferLenDe];//先分配内存
pbBufferDeout=new BYTE[dwBufferLenDeout];
file.Read (pbBufferDe,dwBufferLenDe);
//AfxMessageBox((char*)pbBufferDe);
file.Close();
////////////////////////////读入session的文件
strPathName=str;
strPathName+=".encrypt_session";
//AfxMessageBox(strPathName);
file.Open(strPathName,CFile::modeRead);
dwBufferLenSession = file.GetLength();
pbBufferSession=new BYTE[dwBufferLenSession];//先分配内存
file.Read (pbBufferSession,dwBufferLenSession);
//AfxMessageBox((char*)pbBufferSession);
file.Close();
///////////////////////////////////////输入Session
if(!CryptImportKey(
hProv,
pbBufferSession,
dwBufferLenSession,0,0,&hDecryptKey))
{
}
//////////////////////////////////////用session来解密
if(!CryptDecrypt(hDecryptKey, 0, TRUE, 0, (BYTE*)pbBufferDe,&dwBufferLenDe))
{
AfxMessageBox("解密不成功");
return;
}
pbBufferDeout=pbBufferDe;
dwBufferLenDeout=dwBufferLenDe;
//////////////////////////////////////把解密的文件保存起来
TCHAR szFilters[]=_T("ALL Files(*.*)|*.*|DOC Files(*.doc)|*.doc||");
CFileDialog fdlg(FALSE,NULL,NULL,OFN_FILEMUSTEXIST|OFN_OVERWRITEPROMPT,szFilters);
if(fdlg.DoModal()==IDOK){
De_strPathName=fdlg.GetPathName();
}
strPathName=De_strPathName;
if(file.Open(strPathName,CFile::modeRead))
{
CString strTemp;
strTemp.Format("生成解密的文件",strPathName);
if(AfxMessageBox(strTemp,MB_YESNO)==IDNO) return ;
file.Close();
}
file.Open(strPathName,CFile::modeCreate|CFile::modeWrite);
file.Write(pbBufferDeout,dwBufferLenDeout);
file.Close();
CString strTemp;
strTemp.Format("生成解密的文件成功",strPathName);
AfxMessageBox(strTemp);
}
多谢tob,可能是我说的不够清楚,我说的是已知3des的私钥,把它作为程序中的一个变量,例如char* key={0x1A,0x1B,0x21....},通过一种方法,把key导入到CSP中,得到key的HCRYPTKEY hKey ,下面的加密解密的工作我会做,但通过什么方法把key导入到CSP中,
还请指教??
如果是sessionkey的话,不能够导入到CSP中,CSP只有一对公私密钥,要用的话,把它先导出文件再读入。
如果是privatekey的话,就当它为exchangekey,解密的时候用它,就Ok了把sessionkey导入文件,我是经过的第三方公钥加密
BOOL crypto::Encrypt(CString strPathName)
{
//////////////////////////////读入要加密的文件
CFile file;
file.Open(strPathName,CFile::modeRead);
dwBufferLenEn = file.GetLength();
pbBufferEn=new BYTE[dwBufferLenEn];//先分配内存
file.Read (pbBufferEn,dwBufferLenEn);
AfxMessageBox((char*)pbBufferEn);
file.Close();
if(!CryptGenKey(hProv, CALG_RC4, CRYPT_EXPORTABLE, &hSessionKey))//随机产生一个会话密钥
{
//AfxMessageBox("CryptGenKeyError");
return 0;
}
if(!CryptEncrypt(hSessionKey,0,TRUE,0,pbBufferEn,&dwBufferLenEn,1000))//用会话密钥加密文件
{
AfxMessageBox("CryptEncryptError");
return 0;
}
///////////////////////////////////////生成加密的文件
CString strPath=strPathName;
strPathName+=".encrypt";
if(file.Open(strPathName,CFile::modeRead))
{
CString strTemp;
strTemp.Format("生成加密的文件",strPathName);
if(AfxMessageBox(strTemp,MB_YESNO)==IDNO) return 0;
file.Close();
}
file.Open(strPathName,CFile::modeCreate|CFile::modeWrite);
file.Write(pbBufferEn,dwBufferLenEn);
file.Close();
CString strTemp;
strTemp.Format("生成加密的文件成功",strPathName);
AfxMessageBox(strTemp);
//AfxMessageBox((char*)pbBuffer);
strPathName=strPath;
InitExport(strPathName);
}
////////////////////////////////////////////////输出加密的会话密钥
void crypto::InitExport(CString strPathName)
{
TCHAR szFilters[]=_T("ALL Files(*.*)|*.*|DOC Files(*.doc)|*.doc||");
CFileDialog fdlg(TRUE,NULL,NULL,OFN_FILEMUSTEXIST|OFN_OVERWRITEPROMPT,szFilters);
CString PathName;
if(fdlg.DoModal()==IDOK){
PathName=fdlg.GetPathName();
}
CFile file;
file.Open(PathName,CFile::modeRead);
//AfxMessageBox(PathName);
dwBufferLenEn = file.GetLength();
pbBufferEn=new BYTE[dwBufferLenEn];//先分配内存
file.Read(pbBufferEn,dwBufferLenEn);
AfxMessageBox((char*)pbBufferEn);
file.Close();
if(!CryptImportKey(
hProv,
pbBufferEn,
dwBufferLenEn,0,0,&hImportKey))
{
AfxMessageBox("ImportKey");
}////////////////////////////////////////////把加密的会话密钥写入文件里
//CFile file;
strPathName+=".encrypt_session";
if(file.Open(strPathName,CFile::modeRead))
{
CString strTemp;
strTemp.Format("生成session的文件",strPathName);
if(AfxMessageBox(strTemp,MB_YESNO)==IDNO) return ;
file.Close();
}
file.Open(strPathName,CFile::modeCreate|CFile::modeWrite);
file.Write(pbKeyBlob,dwBlobLen);
file.Close();
CString strTemp;
strTemp.Format("生成session的文件成功",strPathName);
AfxMessageBox(strTemp);
void crypto::Decrypt(CString strPathName)
{
/////////////////////////////读入加密的文件
CFile file;
CString str;
str=strPathName;
strPathName+=".encrypt";
file.Open(strPathName,CFile::modeRead);
dwBufferLenDe = file.GetLength();
dwBufferLenDeout = file.GetLength();
pbBufferDe=new BYTE[dwBufferLenDe];//先分配内存
pbBufferDeout=new BYTE[dwBufferLenDeout];
file.Read (pbBufferDe,dwBufferLenDe);
//AfxMessageBox((char*)pbBufferDe);
file.Close();
////////////////////////////读入session的文件
strPathName=str;
strPathName+=".encrypt_session";
//AfxMessageBox(strPathName);
file.Open(strPathName,CFile::modeRead);
dwBufferLenSession = file.GetLength();
pbBufferSession=new BYTE[dwBufferLenSession];//先分配内存
file.Read (pbBufferSession,dwBufferLenSession);
//AfxMessageBox((char*)pbBufferSession);
file.Close();
///////////////////////////////////////输入Session
if(!CryptImportKey(
hProv,
pbBufferSession,
dwBufferLenSession,0,0,&hDecryptKey))
{
}
//////////////////////////////////////用session来解密
if(!CryptDecrypt(hDecryptKey, 0, TRUE, 0, (BYTE*)pbBufferDe,&dwBufferLenDe))
{
AfxMessageBox("解密不成功");
return;
}
pbBufferDeout=pbBufferDe;
dwBufferLenDeout=dwBufferLenDe;
//////////////////////////////////////把解密的文件保存起来
TCHAR szFilters[]=_T("ALL Files(*.*)|*.*|DOC Files(*.doc)|*.doc||");
CFileDialog fdlg(FALSE,NULL,NULL,OFN_FILEMUSTEXIST|OFN_OVERWRITEPROMPT,szFilters);
if(fdlg.DoModal()==IDOK){
De_strPathName=fdlg.GetPathName();
}
strPathName=De_strPathName;
if(file.Open(strPathName,CFile::modeRead))
{
CString strTemp;
strTemp.Format("生成解密的文件",strPathName);
if(AfxMessageBox(strTemp,MB_YESNO)==IDNO) return ;
file.Close();
}
file.Open(strPathName,CFile::modeCreate|CFile::modeWrite);
file.Write(pbBufferDeout,dwBufferLenDeout);
file.Close();
CString strTemp;
strTemp.Format("生成解密的文件成功",strPathName);
AfxMessageBox(strTemp);
}
我们用这个密钥对数据加密后,通过internet传给第三方;第三方用这个密钥对数据解密;
因此不能用随机生成的密钥,那位高手还有什么方法么?