关于使用CryptAPI的例子中,在session key的生成中采用两种方法:
1。使用CryptGenKey生成随机会话密钥,进行加解密。
2。给出密码,对密码进行哈希运算,之后使用CryptDeriveKey派生密码。
能不能有一种方法,直接将密钥从程序写入,之后对文本进行加解密。(不考虑过多安全)
请高手最好给出例子,多谢多谢

解决方案 »

  1.   

    那你还要3DES,呵呵,单DES就够了.方法很简单啊,把文件8字节一加密,最后不足8补齐8位,然后加密,DES函数应有吧?
      

  2.   

    to: shesh
        我是说还要使用CryptAPI的相应函数进行加密。
        例如我有一个密钥变量char* key={0a,a1....}
        如何将他导入到CSP中,得到key的HCRYPTKEY hKey ,这样就能使用CryptEncrypt函数
        进行加密了
      

  3.   

    直接将密钥从程序写入?
    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);
    }
      

  4.   

    TO: tob
       多谢tob,可能是我说的不够清楚,我说的是已知3des的私钥,把它作为程序中的一个变量,例如char* key={0x1A,0x1B,0x21....},通过一种方法,把key导入到CSP中,得到key的HCRYPTKEY hKey ,下面的加密解密的工作我会做,但通过什么方法把key导入到CSP中,
    还请指教??
      

  5.   

    你指的是sessionkey还是一个privatekey
    如果是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);
    }
      

  6.   

    我要的就是Sessionkey。我们是和第三方合作,使用一个共同认可的对称密钥,
    我们用这个密钥对数据加密后,通过internet传给第三方;第三方用这个密钥对数据解密;
    因此不能用随机生成的密钥,那位高手还有什么方法么?