利用OpenSSL 实现明文加解密
来源:互联网 发布:淘宝微店官网 编辑:程序博客网 时间:2024/05/22 06:44
RSA
1.密钥生成
void generateKey() { /* 生成公钥 */ RSA* rsa = RSA_generate_key(1024, RSA_F4, NULL, NULL); BIO *bp = BIO_new(BIO_s_file()); BIO_write_filename(bp, "public.pem"); PEM_write_bio_RSAPublicKey(bp, rsa); BIO_free_all(bp); /* 生成私钥 */ bp = BIO_new_file("private.pem", "w+"); PEM_write_bio_RSAPrivateKey(bp, rsa, NULL, NULL, 4, NULL, NULL); BIO_free_all(bp); RSA_free(rsa);}
2.公钥加密
string bio_read_publicKey(string data) { OpenSSL_add_all_algorithms(); BIO* bp = BIO_new(BIO_s_file()); BIO_read_filename(bp, "public.pem"); RSA* rsaK = PEM_read_bio_RSAPublicKey(bp, NULL, NULL, NULL); if (NULL == rsaK) { perror("read key file fail!"); } else { printf("read success!"); int nLen = RSA_size(rsaK); printf("len:%d\n", nLen); } int nLen = RSA_size(rsaK); char *pEncode = new char[nLen + 1]; int ret = RSA_public_encrypt(data.length(), (const unsigned char*)data.c_str(), (unsigned char *)pEncode, rsaK, RSA_PKCS1_PADDING); std::string strRet; if (ret >= 0) { strRet = std::string(pEncode, ret); } delete[] pEncode; CRYPTO_cleanup_all_ex_data(); BIO_free_all(bp); RSA_free(rsaK); return strRet;}
3.私钥解密
string bio_read_privateKey(string data) { OpenSSL_add_all_algorithms(); BIO* bp = BIO_new(BIO_s_file()); BIO_read_filename(bp, "private.pem"); RSA* rsaK = PEM_read_bio_RSAPrivateKey(bp, NULL, NULL, NULL); if (NULL == rsaK) { perror("read key file fail!"); } else { printf("read success!\n"); } int nLen = RSA_size(rsaK); char *pEncode = new char[nLen + 1]; int ret = RSA_private_decrypt(data.length(), (const unsigned char*)data.c_str(), (unsigned char *)pEncode, rsaK, RSA_PKCS1_PADDING); string strRet; if (ret >= 0) { strRet = string(pEncode, ret); } delete[] pEncode; CRYPTO_cleanup_all_ex_data(); BIO_free_all(bp); RSA_free(rsaK); return strRet;}
4.密文转为十进制实现
int len = strlen((const char*)pEncode);BIGNUM *a = BN_new();BN_bin2bn((const unsigned char *)pEncode, len, a);b = BN_bn2dec((const BIGNUM *)a);这里的b就是十进制字符串
#5.完整代码
#include "stdafx.h"#include <stdio.h> #include <stdlib.h> #include <windows.h>#include <openssl/rsa.h> #include<openssl/pem.h> #include<openssl/err.h> #include <openssl/bio.h> #include <fstream> #include <iostream> #include <string> using namespace std;#pragma comment(lib, "libeay32.lib") #pragma comment(lib, "ssleay32.lib") char *b;void generateKey() { /* 生成公钥 */ RSA* rsa = RSA_generate_key(1024, RSA_F4, NULL, NULL); BIO *bp = BIO_new(BIO_s_file()); BIO_write_filename(bp, "public.pem"); PEM_write_bio_RSAPublicKey(bp, rsa); BIO_free_all(bp); /* 生成私钥 */ bp = BIO_new_file("private.pem", "w+"); PEM_write_bio_RSAPrivateKey(bp, rsa, NULL, NULL, 4, NULL, NULL); BIO_free_all(bp); RSA_free(rsa);}string bio_read_privateKey(string data) { OpenSSL_add_all_algorithms(); BIO* bp = BIO_new(BIO_s_file()); BIO_read_filename(bp, "prikey.pem"); RSA* rsaK = PEM_read_bio_RSAPrivateKey(bp, NULL, NULL, NULL); if (NULL == rsaK) { perror("read key file fail!"); } else { printf("read success!\n"); } int nLen = RSA_size(rsaK); char *pEncode = new char[nLen + 1]; int ret = RSA_private_decrypt(data.length(), (const unsigned char*)data.c_str(), (unsigned char *)pEncode, rsaK, RSA_PKCS1_PADDING); string strRet; if (ret >= 0) { strRet = string(pEncode, ret); } delete[] pEncode; CRYPTO_cleanup_all_ex_data(); BIO_free_all(bp); RSA_free(rsaK); return strRet;}string bio_read_publicKey(string data) { OpenSSL_add_all_algorithms(); BIO* bp = BIO_new(BIO_s_file()); BIO_read_filename(bp, "pubkey.pem"); RSA* rsaK = PEM_read_bio_RSAPublicKey(bp, NULL, NULL, NULL); if (NULL == rsaK) { perror("read key file fail!"); } else { printf("read success!"); int nLen = RSA_size(rsaK); printf("len:%d\n", nLen); } int nLen = RSA_size(rsaK); char *pEncode = new char[nLen + 1]; int ret = RSA_public_encrypt(data.length(), (const unsigned char*)data.c_str(), (unsigned char *)pEncode, rsaK, RSA_PKCS1_PADDING); std::string strRet; if (ret >= 0) { strRet = std::string(pEncode, ret); } int len = strlen((const char*)pEncode); BIGNUM *a = BN_new(); BN_bin2bn((const unsigned char *)pEncode, len, a); b = BN_bn2dec((const BIGNUM *)a); delete[] pEncode; CRYPTO_cleanup_all_ex_data(); BIO_free_all(bp); RSA_free(rsaK); return strRet;}int main() {// generateKey(); char *str = "我爱密码"; printf("原文:%s\n", str); string m = bio_read_publicKey(str); printf("密文:\n------------%s--------------\n\n", m.c_str()); printf("十进制:\n-----------%s------------\n\n", b); unsigned char *p =(unsigned char *) m.c_str(); int j = 0; while (*(p+j) != NULL) { printf("%x", *(p + j)); j++; } cout << endl; string miwen = m; string c = bio_read_privateKey(miwen); printf("解密后:\n------------%s--------------\n\n", c.c_str()); system("pause"); return 0;}
AES
#include "stdafx.h"#include <stdio.h>#include <string.h>#include <stdlib.h>#include <openssl/aes.h>#include <iostream>#define AES_BITS 128#define MSG_LEN 100000#pragma comment(lib, "libeay32.lib")#pragma comment(lib, "ssleay32.lib") #pragma comment(lib, "ws2_32.lib")#define IP "127.0.0.1"#define PORT 8888using namespace std;int main(int argc, char *argv[]){ int len; char key[AES_BLOCK_SIZE]; memcpy(key, "123412341234123", 16); cout << key[0]; system("pause"); unsigned char iv[AES_BLOCK_SIZE]; FILE *fp,*fp1; fp = fopen("1.txt", "rb"); fp1 = fopen("2.txt","ab"); fseek(fp, 0L, SEEK_END); len = ftell(fp); fseek(fp, 0L, SEEK_SET); char sourceStringTemp[MSG_LEN]; char dstStringTemp[MSG_LEN]; memset((char*)sourceStringTemp, 0, MSG_LEN); memset((char*)dstStringTemp, 0, MSG_LEN); fread(sourceStringTemp, 1, len, fp); int i; AES_KEY aes; if (AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0) { return 0; } AES_cbc_encrypt((unsigned char*)sourceStringTemp, (unsigned char*)dstStringTemp, len, &aes, iv, AES_ENCRYPT); /***************下面为解密*************/ printf("enc %d:", strlen((char*)dstStringTemp)); for (i = 0; dstStringTemp[i]; i += 1) { printf("%x", (unsigned char)dstStringTemp[i]); } memset((char*)sourceStringTemp, 0, MSG_LEN); if (AES_set_decrypt_key((unsigned char*)key, 128, &aes) < 0) { return 0; } AES_cbc_encrypt((unsigned char*)dstStringTemp, (unsigned char*)sourceStringTemp, len, &aes, iv, AES_DECRYPT); fwrite(sourceStringTemp, 1, len, fp1); printf("\n"); printf("dec %d:", strlen((char*)sourceStringTemp)); printf("%s\n", sourceStringTemp); for (i = 0; sourceStringTemp[i]; i += 1) { printf("%x", ( char)sourceStringTemp[i]); } printf("\n"); system("pause"); fclose(fp); fclose(fp1); return 0;}
0 0
- 利用OpenSSL 实现明文加解密
- 利用OpenSSL验证加解密相关算法
- 利用Openssl编写加解密逻辑
- 利用openssl中AES进行加解密
- springboot 配置文件明文加解密
- OpenSSL 实现RSA AES加解密
- 基于openssl的RSA加解密实现
- 利用openssl的AES加密解密数据明文(ECB模式)
- 利用openssl实现字符串加密解密
- 利用ENGINE替换OPENSSL中的加解密算法
- 利用ENGINE替换OPENSSL中的加解密算法
- 利用ENGINE替换OPENSSL中的加解密算法
- 利用ENGINE替换OPENSSL中的加解密算法
- 利用ENGINE替换OPENSSL中的加解密算法
- 利用ENGINE替换OPENSSL中的加解密算法
- PHP利用openssl整理AES加解密类
- openssl rsa加解密
- openssl enc 加解密
- 为appium配置gulp es2017 to node 6.9.x
- <a>标签onclick点击失效,触发不了。
- endRefreshingWithNoMoreData
- Centos7 yum install的nodejs版本过低,在升级nodejs的时候出错
- servlet (1) 基础
- 利用OpenSSL 实现明文加解密
- 《摆渡人》哪有那么差,它只是为爱癫狂
- WebRTC音视频引擎研究(1)--整体架构分析
- Activity2---使用
- 移动端首屏设计
- 详解IIS Express的详细配置、使用和注意事项
- Java开源-Talk:一个聊天系统
- 解决百度云非限速版本被封下载问题
- 用Azure物联网网关SDK连接设备