C++与java、php通用解密,openssl

来源:互联网 发布:蛋疼 知乎 编辑:程序博客网 时间:2024/06/05 04:08

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 24unsigned 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);


0 0
原创粉丝点击