c语言(openssl)实现rsa/none/pcks1padding算法,匹配java后端
来源:互联网 发布:分配网络流量的软件 编辑:程序博客网 时间:2024/06/07 20:04
前一篇文章:http://blog.csdn.net/qq372848728/article/details/78687876
int rsa_key_encrypt(EVP_PKEY *key, const unsigned char *orig_data, size_t orig_data_len, unsigned char *enc_data, size_t &enc_data_len){ EVP_PKEY_CTX *ctx = NULL; OpenSSL_add_all_ciphers(); ctx = EVP_PKEY_CTX_new(key, NULL); if (NULL == ctx) { printf("ras_pubkey_encryptfailed to open ctx.\n"); EVP_PKEY_free(key); return -1; } if (EVP_PKEY_encrypt_init(ctx) <= 0) { printf("ras_pubkey_encryptfailed to EVP_PKEY_encrypt_init.\n"); EVP_PKEY_free(key); return -1; } int ret = EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING); if (!ret) { printf("set padding error!"); return 0; } //EVP_CIPHER_CTX_set_padding(ctx, EVP_CIPH_NO_PADDING); if (EVP_PKEY_encrypt(ctx, enc_data, &enc_data_len, orig_data, orig_data_len) <= 0) { printf("ras_pubkey_encryptfailed to EVP_PKEY_encrypt.\n"); EVP_PKEY_CTX_free(ctx); EVP_PKEY_free(key); return -1; } EVP_PKEY_CTX_free(ctx); EVP_PKEY_free(key); return 0;}// 使用密钥解密,这种封装格式只适用公钥加密,私钥解密,这里key必须是私钥 int rsa_key_decrypt(EVP_PKEY *key, const unsigned char *enc_data, size_t enc_data_len, unsigned char *orig_data, size_t &orig_data_len){ EVP_PKEY_CTX *ctx = NULL; OpenSSL_add_all_ciphers(); ctx = EVP_PKEY_CTX_new(key, NULL); if (NULL == ctx) { printf("ras_prikey_decryptfailed to open ctx.\n"); EVP_PKEY_free(key); return -1; } if (EVP_PKEY_decrypt_init(ctx) <= 0) { printf("ras_prikey_decryptfailed to EVP_PKEY_decrypt_init.\n"); EVP_PKEY_free(key); return -1; } int ret = EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING); if (ret = EVP_PKEY_decrypt(ctx, orig_data, &orig_data_len, enc_data, enc_data_len) <= 0) { printf("ras_prikey_decryptfailed to EVP_PKEY_decrypt.\n"); EVP_PKEY_CTX_free(ctx); EVP_PKEY_free(key); return -1; } EVP_PKEY_CTX_free(ctx); EVP_PKEY_free(key); return 0;}EVP_PKEY *generatePubEVPKEY(char * keyChar) { int ret, flen, bio_len; BIO *bio = NULL; RSA *r = NULL; if ((bio = BIO_new_mem_buf((void *)keyChar, strlen(keyChar))) == NULL) //从字符串读取RSA公钥 { //LOGE("BIO_new_mem_buf failed!\n"); } PEM_read_bio_RSA_PUBKEY(bio, &r, 0, 0); flen = RSA_size(r); EVP_PKEY *evp_key = EVP_PKEY_new();//新建一个EVP_PKEY变量 if (evp_key == NULL) { RSA_free(r); return NULL; } if (EVP_PKEY_set1_RSA(evp_key, r) != 1) //保存RSA结构体到EVP_PKEY结构体 { RSA_free(r); EVP_PKEY_free(evp_key); return NULL; } RSA_free(r); return evp_key;}extern EVP_PKEY *generatePriEVPKEY(char *keyChar) { int ret, flen, bio_len; BIO *bio = NULL; RSA *r = NULL; if ((bio = BIO_new_mem_buf((void *)keyChar, strlen(keyChar))) == NULL) //从字符串读取RSA公钥 { //LOGE("BIO_new_mem_buf failed!\n"); } PEM_read_bio_RSAPrivateKey(bio, &r, 0, 0); flen = RSA_size(r); EVP_PKEY *evp_key = EVP_PKEY_new();//新建一个EVP_PKEY变量 if (evp_key == NULL) { RSA_free(r); return NULL; } if (EVP_PKEY_set1_RSA(evp_key, r) != 1) //保存RSA结构体到EVP_PKEY结构体 { RSA_free(r); EVP_PKEY_free(evp_key); return NULL; } RSA_free(r); return evp_key;}
EVP_PKEY *pub_key = generatePubEVPKEY(pubkey1024);//新建一个EVP_PKEY变量
EVP_PKEY *pri_key = generatePriEVPKEY(prikey1024);
调用rsa_key_decrypt/rsa_key_encrypt两个函数即可加解密
阅读全文
0 0
- c语言(openssl)实现rsa/none/pcks1padding算法,匹配java后端
- c语言实现rsa nopadding非对称加密算法(openssl api方式),匹配java后端 bouncycastle
- openssl C语言编码实现rsa加密
- RSA算法C语言实现
- RSA算法C语言实现
- openssl RSA java实现
- RSA算法详解及C语言实现
- RSA算法详解及C语言实现
- RSA算法详解及C语言实现
- RSA算法详解及C语言实现
- RSA算法详解及C语言实现
- C语言实现的RSA算法程序
- RSA算法详解及C语言实现
- 用OpenSSL实现RSA算法加密(转)
- KMP字符串匹配算法C语言实现
- 模式匹配 KMP C语言算法实现
- C语言实现串的匹配算法
- 字符串匹配--Sunday算法-C语言实现
- MTK 平台memory(emmc)移植常见问题总结
- Angular之基础知识
- 使用navicate将sqlsever数据库导入到mysql数据库中
- c语言高级指针理解及应用(下)
- ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
- c语言(openssl)实现rsa/none/pcks1padding算法,匹配java后端
- python manage.py makemigrations 和python manage.py migrate
- Ajax4
- 视频开发(三) FFmpeg相关结构体
- 简单的SSS整合(Sping,SpringMVC,SpringData)+redis缓存服务配置+logback日志
- App图标不显示:Xcode项目在Xcode9中运行会出现AppIcon不显示的 BUG
- 日期工具类
- mac 安装nginx 配置识别php文件
- Android客制化------开机拷贝文件到内置存储