一个自己写的使用Cryptlib进行对称加/解密的程序,网上关于Cryptlib的资料不多,自己摸索中,一点小进步分享一下

来源:互联网 发布:撞库软件 编辑:程序博客网 时间:2024/06/08 05:51

程序中有一些代码来自开源,谢谢开源代码的贡献者,支持开源,共同努力学习进步。

 

#include <iostream>
#include "cryptlib.h"
#include <string>
#include <string.h>
#include "Base.h"
#pragma comment(lib,"cl32.lib")

using namespace std;

void createKeySet(){
 int status;
 CRYPT_CONTEXT cryptContext;
 CRYPT_KEYSET cryptKeyset;
 CRYPT_CERTIFICATE cryptCert;


 //创建密钥库
 status=cryptKeysetOpen(&cryptKeyset,CRYPT_UNUSED,CRYPT_KEYSET_FILE,"F://Keyset File.p15",CRYPT_KEYOPT_CREATE);
 cout<<"KEYSET OPEN"<<endl;

 //创建上下文
 status=cryptCreateContext(&cryptContext,CRYPT_UNUSED,CRYPT_ALGO_RSA);
 cout<<"CONTEXT create success"<<endl;

 //创建密钥标签
 status=cryptSetAttributeString(cryptContext,CRYPT_CTXINFO_LABEL,"mykey",5);
 cout<<"crypt label create success"<<endl;

 //创建密钥
 status=cryptGenerateKey(cryptContext);
 cout<<"generate key success"<<endl;

 //为密钥生成私钥
 status=cryptAddPrivateKey(cryptKeyset,cryptContext,"1234");
 cout<<"private key create success"<<endl;

 //创建证书
 status=cryptCreateCert(&cryptCert,CRYPT_UNUSED,CRYPT_CERTTYPE_CERTIFICATE);
 cout<<"certificate create success"<<endl;

 status=cryptSetAttribute(cryptCert,CRYPT_CERTINFO_XYZZY,1);
 status=cryptSetAttribute(cryptCert,CRYPT_CERTINFO_SUBJECTPUBLICKEYINFO,cryptContext);
 status=cryptSetAttributeString(cryptCert,CRYPT_CERTINFO_COMMONNAME,"mykey",5);
 status=cryptSignCert(cryptCert,cryptContext);
 status=cryptAddPublicKey(cryptKeyset,cryptCert);
 cout<<"public key create success"<<endl;

 status=cryptDestroyCert(cryptCert);
 status=cryptDestroyContext(cryptContext);
 status=cryptKeysetClose(cryptKeyset);
}

void getPBPVKey(){
 int status;

 CRYPT_CONTEXT cryptPBK, cryptPVK;
 CRYPT_KEYSET cryptKeyset;
 //CRYPT_CERTIFICATE cryptCert;
 status=cryptKeysetOpen(&cryptKeyset,CRYPT_UNUSED,CRYPT_KEYSET_FILE,"F://Keyset File.p15",CRYPT_KEYOPT_READONLY);
 //status=cryptCreateContext(&cryptPVK,CRYPT_UNUSED,CRYPT_ALGO_RSA);
 //status=cryptCreateContext(&cryptPBK,CRYPT_UNUSED,CRYPT_ALGO_RSA);
 cout<<"keyset open"<<endl;
 status=cryptGetPrivateKey(cryptKeyset,&cryptPVK,CRYPT_KEYID_NAME,"mykey","1234");
 cout<<"private key = "<<cryptPVK<<endl;
 status=cryptGetPublicKey(cryptKeyset,&cryptPBK,CRYPT_KEYID_NAME,"mykey");
 cout<<"public key = "<<cryptPBK<<endl;

 ////导出公钥
 //CRYPT_CONTEXT pubKeyContext=0, cryptContext;
 //void *encryptedKey;
 //int encryptedKeyLength;
 //int encryptedKeyMaxLength;
 ///* Generate a key */
 //status=cryptCreateContext( &cryptContext, CRYPT_UNUSED, CRYPT_ALGO_3DES );
 //status=cryptGenerateKey( cryptContext );
 ////最大长度
 //status=cryptExportKey( NULL, 0, &encryptedKeyMaxLength, cryptPVK, cryptContext );
 ///* Allocate memory for the encrypted key */
 //encryptedKey = malloc( encryptedKeyMaxLength );
 ///* Export the key using a public-key encrypted blob */
 //status=cryptExportKey( encryptedKey, encryptedKeyMaxLength, &encryptedKeyLength, cryptPVK, cryptContext );
 //cout<<(char*)encryptedKey<<endl;

 //销毁Context
 status=cryptDestroyContext(cryptPBK);
 status=cryptDestroyContext(cryptPVK);
 status=cryptKeysetClose(cryptKeyset);

 

}
string conventionalEncryption(string plaintext, string password,string iv
 //, char *salt
 ){
  CRYPT_CONTEXT cryptContext;
  Base base;
  int length=0;
  int status;
  int keysize;
  int ivSize=iv.size();

  /* Encrypt data */
  status=cryptCreateContext(&cryptContext,CRYPT_UNUSED,CRYPT_ALGO_3DES);

  //salt
  //status=cryptSetAttributeString( cryptContext, CRYPT_CTXINFO_KEYING_SALT, salt, strlen(salt) );

  //password
  status=cryptSetAttributeString(cryptContext,CRYPT_CTXINFO_KEY,password.c_str(), password.size());
  status=cryptSetAttributeString(cryptContext,CRYPT_CTXINFO_IV,iv.c_str(),ivSize);
  status=cryptGetAttribute(cryptContext,CRYPT_CTXINFO_KEYSIZE,&keysize);

  if (plaintext.size() % keysize != 0){
   length=plaintext.size() + keysize - plaintext.size()% keysize;
  }
  else{
   length=plaintext.size();
  }

  BYTE *envData=new BYTE[length];

  //用结束符将要加密的数据对齐成密钥长的整数倍
  for(int i=plaintext.size();i<length;++i){
   envData[i]='/0';
  }

  for (unsigned int i = 0; i<plaintext.size(); i++)
  {
   envData[i] = plaintext[i];
  }

  status=cryptEncrypt(cryptContext, envData, length);
  string base64code=base.base64_encode(envData,length);
  delete [] envData;
  return base64code;
}

void conventionalDecryption(string password, string iv,BYTE *envData, int length
 //, char *salt,
 ){

  CRYPT_CONTEXT cryptContext;
  int status;
  int ivSize=iv.size();

  /* Decrypt data */
  status=cryptCreateContext(&cryptContext,CRYPT_UNUSED,CRYPT_ALGO_3DES);

  //salt
  //status=cryptSetAttributeString( cryptContext, CRYPT_CTXINFO_KEYING_SALT, salt, strlen(salt) );

  //password
  status=cryptSetAttributeString(cryptContext,CRYPT_CTXINFO_KEY,password.c_str(), password.size());
  status=cryptSetAttributeString(cryptContext,CRYPT_CTXINFO_IV,iv.c_str(),ivSize);

  status=cryptDecrypt(cryptContext, envData, length);
  cryptDestroyContext(cryptContext);
}

int main(){
 Base base;
 string res;
 int len;
 BYTE *plain;
 cryptInit();
 //createKeySet();
 getPBPVKey();
  
 string cipher=conventionalEncryption("明天 晴天   CryptLIB","abcdhgfhabcdhgfh","12345678");
 string basede=base.base64_decode(cipher);
 cout<<basede<<endl;

 len=basede.size();
 cout<<len<<endl;
 plain=new BYTE[len+1];
 for(int i=0;i<len;++i){
  plain[i]=basede[i];
 }
 plain[len]='/0';

 conventionalDecryption("abcdhgfhabcdhgfh","12345678",plain,len);
 cout<<(char*)plain<<endl;

 for(BYTE* po=plain;*po!='/0';++po){
  res.push_back(*po);
 }
 cout<<res<<endl;

 cryptEnd();
 cout<<"ok"<<endl;
 delete [] plain;
 return 0;

}

原创粉丝点击