一个自己写的使用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;
}
- 一个自己写的使用Cryptlib进行对称加/解密的程序,网上关于Cryptlib的资料不多,自己摸索中,一点小进步分享一下
- 自己的一点进步
- 自己用delphi7参考网上资料写的一个在线升级程序
- CryptLib
- 自己写的一个Android小程序
- 自己写的一个除法小程序
- java自己写的一个小程序
- 根据网上的资料自己写的一个对表格进行客户端排序的.NET用户控件
- 一个题目以及自己写的程序,求指导一下
- 自己写的小程序
- RPG/400 自己写的一个小实例分享!(1)
- RPG/400 自己写的一个小实例分享!(2)
- RPG/400 自己写的一个小实例分享!(3)
- 参考网上的一些struts2的action用法,自己写了一个Demo记录一下。
- 网上摸索,自己修改实现上传图片的功能
- DELPHI 自己写的经常用到的加解密函数
- 自己的一个小练习,记录一下
- 两个开发源码加密库openssl和cryptlib的比较
- man的用法 《转贴》
- 构建高性能ASP.NET站点之一 剖析页面的处理过程(前端)
- Android计算器(1)
- Java windows下的环境配置
- 安装 MSDN 2010
- 一个自己写的使用Cryptlib进行对称加/解密的程序,网上关于Cryptlib的资料不多,自己摸索中,一点小进步分享一下
- Java数据库连接字符串
- 线程类模型
- java数据类型转换
- Flex中创建RSS阅读器
- windows中遍历指定文件夹下的所有子文件夹
- [精]自动生成Makefile的详细过程
- LED照明灯具与传感器技术
- RIL 驱动开发一