RSA验证:
char *pData = "123456";
static unsigned char ptext_ex[218] = {0};
static unsigned char ctext_ex[218] = {0};
int plen = 0;
int clen = 0;
EVP_MD_CTX ctxl;
EVP_MD_CTX_init(&ctxl);//初始化
EVP_SignInit(&ctxl,EVP_sha1());//将需要使用的摘要算法存入ctxl中
EVP_SignUpdate(&ctxl,(unsigned char *)pData,strlen(pData));//存入证书的编码值
EVP_DigestFinal(&ctxl,ptext_ex,(unsigned int*)&plen);//求取编码的长度为m_len摘要值存入m中
BIO *key = NULL;
RSA *r = NULL;
key = BIO_new(BIO_s_file());
BIO_read_filename(key, "d:\\privateKey.txt");
r = PEM_read_bio_RSAPrivateKey(key, NULL, NULL, NULL);
BIO_free_all(key);
RSA_sign(EVP_sha1()->type,(unsigned char*)ptext_ex,plen,ctext_ex,(unsigned int*)&clen,r);
int iLen = 0;
char p[130] = {0};
std::string str = base64Encode(ctext_ex, clen);
Base64Decode((unsigned char*)p, &iLen,(unsigned char*)str.c_str(), str.length());
BIO *keyp = NULL;
RSA *rp = NULL;
keyp = BIO_new(BIO_s_file());
BIO_read_filename(keyp, "d:\\rsa_public_key.pem");
rp = PEM_read_bio_RSA_PUBKEY(keyp, NULL, NULL, NULL);
BIO_free_all(keyp);
int rc = RSA_verify(EVP_sha1()->type,(unsigned char*)ptext_ex,plen,ctext_ex, clen,rp);
RSA解密:
key = BIO_new(BIO_s_file());
BIO_read_filename(key, pKeyPath);
r = PEM_read_bio_RSA_PUBKEY(key, NULL, NULL, NULL);
BIO_free_all(key);
while (iLen < iSrclen)
{
memset(cTmp, 0, sizeof(cTmp));
memset(out, 0, sizeof(out));
memcpy(cTmp, pIn, 128);
pIn += 128;
iLen += 128;
iTmpLen = RSA_public_decrypt(128, (CT_UCHAR*)cTmp, (CT_UCHAR*)out, r, RSA_PKCS1_PADDING);
iOutLen += iTmpLen;
strncpy(pOut, out, iDstlen);
pOut += iTmpLen;
}
DES解密:
int docontinue = 1;
char *pData = baseInfo; /* 明文 */
int data_len = iBaseLen;
int data_rest;
unsigned char ch;
unsigned char *src = NULL; /* 补齐后的明文 */
unsigned char *dst = NULL; /* 解密后的明文 */
int len;
unsigned char tmp[8];
unsigned char in[8];
unsigned char out[512] = {0};
char *k = appKey; /* 原始密钥 */
DES_cblock ivec;
int key_len;
#define LEN_OF_KEY 24
unsigned char key[LEN_OF_KEY]; /* 补齐后的密钥 */
unsigned char block_key[9];
DES_key_schedule ks,ks2,ks3;
/* 构造补齐后的密钥 */
key_len = strlen(k);
memcpy(key, k, key_len);
memcpy(ivec,"dbe79c9c",9);
memset(key + key_len, 0x00, LEN_OF_KEY - key_len);
/* 分析补齐明文所需空间及补齐填充数据 */
data_rest = data_len % 8;
len = data_len + (8 - data_rest);
ch = 8 - data_rest;
src = (unsigned char *)malloc(len);
dst = (unsigned char *)malloc(len);
if (NULL == src || NULL == dst)
{
docontinue = 0;
}
if (docontinue)
{
int count;
int i;
/* 构造补齐后的加密内容 */
memset(src, 0, len);
memcpy(src, pData, data_len);
memset(src + data_len, ch, 8 - data_rest);
/* 密钥置换 */
memset(block_key, 0, sizeof(block_key));
memcpy(block_key, key + 0, 8);
DES_set_key_unchecked((const_DES_cblock*)block_key, &ks);
memcpy(block_key, key + 8, 8);
DES_set_key_unchecked((const_DES_cblock*)block_key, &ks2);
memcpy(block_key, key + 16, 8);
DES_set_key_unchecked((const_DES_cblock*)block_key, &ks3);
/* 循环加密/解密,每8字节一次 */
count = len / 8;
for (i = 0; i < count; i++)
{
memset(tmp, 0, 8);
memset(in, 0, 8);
memset(out, 0, 8);
memcpy(tmp, src + 8 * i, 8);
/* 解密 */
// DES_ecb3_encrypt((const_DES_cblock*)tmp, (DES_cblock*)out, &ks, &ks2, &ks3, DES_DECRYPT);
DES_ede3_cbc_encrypt((unsigned char*)baseInfo, out,240,&ks, &ks2, &ks3,(DES_cblock*)key, DES_DECRYPT);
/* 将解密的内容拷贝到解密后的明文 */
memcpy(dst + 8 * i, out, 8);
}
}
sprintf(dstOut, "%s", dst);