RSA
来源:互联网 发布:安装ubuntu后无法上网 编辑:程序博客网 时间:2024/06/15 07:12
#ifdef __cplucplus#if __cplusplusextern "C" {#endif#endif#include <stdio.h>#include <stdlib.h>#include <string.h>#include <openssl/rsa.h>#include <openssl/pem.h>#include <openssl/err.h>#include <time.h>#define PRIKEY "prikey.pem"#define PUBKEY "pubkey.pem"typedef enum pubKeyType{ RSA_PUBKEY = 0, RSA_PUBLICKEY = 1, RSA_BULT}RSA_PUBKEYTYPE;struct timespec diff(struct timespec start, struct timespec end){ struct timespec temp; memset(&temp, 0x00, sizeof(temp)); if ((end.tv_nsec - start.tv_nsec) < 0) { temp.tv_sec = end.tv_sec-start.tv_sec-1; temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec; } else { temp.tv_sec = end.tv_sec-start.tv_sec; temp.tv_nsec = end.tv_nsec-start.tv_nsec; } return temp;}/************************************************************************ * RSA加密解密函数 * * gcc -Wall -O2 -o test_rsa_encdec test_rsa_encdec.c -lcrypto -lssl * * author: gospell/wildwolf.heya ************************************************************************/int rsa_generate_key(const char *prikeyname, const char *pubkeyname, int keylen, RSA_PUBKEYTYPE pubkeytype){ RSA *rsa = NULL; BIGNUM *bne = NULL; rsa = RSA_new(); bne = BN_new(); BN_set_word(bne, RSA_F4); if (1 != RSA_generate_key_ex(rsa, keylen, bne, NULL)) { printf("RSA_generate_key err!\n"); return -1; } //start generate private key BIO *bp = BIO_new_file(prikeyname, "w+"); if (NULL == bp) { printf("generate_key bio file new err2!\n"); return -1; } if (PEM_write_bio_RSAPrivateKey(bp, rsa, NULL, NULL, 0, NULL, NULL) != 1) { printf("PEM_write_bio_RSAPrivateKey err!\n"); return -1; } printf("create private key ok!\n"); BIO_free_all(bp); bp = NULL; //start generate public key bp = BIO_new_file(pubkeyname, "w+"); if (NULL == bp) { printf("generate_key bio file new err!\n"); return -1; } if (RSA_PUBKEY == pubkeytype) { if (PEM_write_bio_RSA_PUBKEY(bp, rsa) != 1) { printf("PEM_write_bio_RSAPublicKey err!\n"); return -1; } } else if (RSA_PUBLICKEY == pubkeytype) { if (PEM_write_bio_RSAPublicKey(bp, rsa) != 1) { printf("PEM_write_bio_RSAPublicKey err!\n"); return -1; } } printf("create public key ok!\n"); BIO_free_all(bp); bp = NULL; RSA_free(rsa); rsa = NULL; return 0;}int rsa_pub_encrypt(unsigned char *srcdata, int srcdata_len, unsigned char *desdata, char *pubkey_path, int keymode, RSA_PUBKEYTYPE pubkeytype){ RSA *rsa = NULL; int result = -1; BIO *bp = NULL; if ((NULL == srcdata) || (0 == srcdata_len) || (NULL == desdata) || (NULL == pubkey_path)) { printf("%s %d:input paramters err!\n", __FUNCTION__, __LINE__); return -1; } bp = BIO_new_file(pubkey_path, "rb"); if (NULL == bp) { printf("BIO_new_file err!\n"); return -1; } /* 读取公钥PEM,PUBKEY格式PEM使用PEM_read_RSA_PUBKEY函数 */ if (RSA_PUBKEY == pubkeytype) { if ((rsa = PEM_read_bio_RSA_PUBKEY(bp, &rsa, NULL, NULL)) == NULL) { printf("%s %d:PEM_read_RSAPublicKey failure!\n", __FUNCTION__, __LINE__); return -1; } } else if (RSA_PUBLICKEY == pubkeytype) { if ((rsa = PEM_read_bio_RSAPublicKey(bp, &rsa, NULL, NULL)) == NULL) { printf("%s %d:PEM_read_RSAPublicKey failure!\n", __FUNCTION__, __LINE__); return -1; } } //RSA_print_fp(stdout, rsa, 0); if (srcdata_len > RSA_size(rsa) - RSA_PKCS1_PADDING_SIZE) { RSAerr(RSA_F_RSA_SIGN, RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY); return -1; } if ((result = RSA_public_encrypt(srcdata_len, srcdata, desdata, rsa, keymode)) < 0) { printf("%s %d:RSA_public_encrypt err! result = %d\n", __FUNCTION__, __LINE__, result); return -1; } RSA_free(rsa); rsa = NULL; return result;}int rsa_pri_encrypt(unsigned char *srcdata, int srcdata_len, unsigned char *desdata, char *prikey_path, int keymode){ RSA *rsa = NULL; int result = -1; BIO *bp = NULL; if ((NULL == srcdata) || (0 == srcdata_len) || (NULL == desdata) || (NULL == prikey_path)) { printf("%s %d:input paramters err!\n", __FUNCTION__, __LINE__); return -1; } bp = BIO_new_file(prikey_path, "rb"); if (NULL == bp) { printf("BIO_new_file err!\n"); return -1; } if ((rsa = PEM_read_bio_RSAPrivateKey(bp, &rsa, NULL, NULL)) == NULL) { printf("%s %d:PEM_read_RSAPrivateKey\n", __FUNCTION__, __LINE__); return -1; } //RSA_print_fp(stdout, rsa, 0); if (srcdata_len > RSA_size(rsa) - RSA_PKCS1_PADDING_SIZE) { RSAerr(RSA_F_RSA_SIGN, RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY); return -1; } struct timespec time1; struct timespec time2; memset(&time1, 0x00, sizeof(time1)); memset(&time2, 0x00, sizeof(time2)); clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1); result = RSA_private_encrypt(srcdata_len, srcdata, desdata, rsa, keymode); clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2); printf("time1:%ld s :%ld ns\n", time1.tv_sec, time1.tv_nsec); printf("time2:%ld s :%ld ns\n", time2.tv_sec, time2.tv_nsec); printf("time1-time2:%ld s :%ld ns\n", diff(time1, time2).tv_sec, diff(time1, time2).tv_nsec); //if ((result = RSA_private_encrypt(srcdata_len, srcdata, desdata, rsa, keymode)) < 0) if (result < 0) { printf("%s %d:RSA_private_encrypt err! result = %d\n", __FUNCTION__, __LINE__, result); return -1; } RSA_free(rsa); rsa = NULL; return result;}int rsa_pri_decrypt(unsigned char *srcdata, int srcdata_len, unsigned char *desdata, char *prikey_path, int keymode){ RSA *rsa = NULL; int result = -1; BIO *bp = NULL; if ((NULL == srcdata) || (0 == srcdata_len) || (NULL == desdata) || (NULL == prikey_path)) { printf("%s %d:input paramters err!\n", __FUNCTION__, __LINE__); return -1; } bp = BIO_new_file(prikey_path, "rb"); if (NULL == bp) { printf("BIO_new_file err!\n"); return -1; } if ((rsa = PEM_read_bio_RSAPrivateKey(bp, &rsa, NULL, NULL)) == NULL) { printf("%s %d:PEM_read_RSAPrivateKey\n", __FUNCTION__, __LINE__); return -1; } //RSA_print_fp(stdout, rsa, 0); struct timespec time1; struct timespec time2; memset(&time1, 0x00, sizeof(time1)); memset(&time2, 0x00, sizeof(time2)); clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1); result = RSA_private_decrypt(srcdata_len, srcdata, desdata, rsa, keymode); clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2); printf("time1:%ld s :%ld ns\n", time1.tv_sec, time1.tv_nsec); printf("time2:%ld s :%ld ns\n", time2.tv_sec, time2.tv_nsec); printf("time1-time2:%ld s :%ld ns\n", diff(time1, time2).tv_sec, diff(time1, time2).tv_nsec); //if ((result = RSA_private_decrypt(srcdata_len, srcdata, desdata, rsa, keymode)) < 0) if (result < 0) { printf("%s %d:RSA_private_decrypt err! result = %d\n", __FUNCTION__, __LINE__, result); return -1; } RSA_free(rsa); rsa = NULL; return result;}int rsa_pub_decrypt(unsigned char *srcdata, int srcdata_len, unsigned char *desdata, char *pubkey_path, int keymode, RSA_PUBKEYTYPE pubkeytype){ RSA *rsa = NULL; int result = -1; BIO *bp = NULL; if ((NULL == srcdata) || (0 == srcdata_len) || (NULL == desdata) || (NULL == pubkey_path)) { printf("%s %d:input paramters err!\n", __FUNCTION__, __LINE__); return -1; } bp = BIO_new_file(pubkey_path, "rb"); if (NULL == bp) { printf("BIO_new_file err!\n"); return -1; } /* 读取公钥PEM,PUBKEY格式PEM使用PEM_read_RSA_PUBKEY函数 */ if (RSA_PUBKEY == pubkeytype) { if ((rsa = PEM_read_bio_RSA_PUBKEY(bp, &rsa, NULL, NULL)) == NULL) { printf("%s %d:PEM_read_RSAPublicKey failure!\n", __FUNCTION__, __LINE__); return -1; } } else if (RSA_PUBLICKEY == pubkeytype) { if ((rsa = PEM_read_bio_RSAPublicKey(bp, &rsa, NULL, NULL)) == NULL) { printf("%s %d:PEM_read_RSAPublicKey failure!\n", __FUNCTION__, __LINE__); return -1; } } //RSA_print_fp(stdout, rsa, 0); if ((result = RSA_public_decrypt(srcdata_len, srcdata, desdata, rsa, keymode)) < 0) { printf("%s %d:RSA_public_encrypt err! result = %d\n", __FUNCTION__, __LINE__, result); return -1; } RSA_free(rsa); rsa = NULL; return result;}int main(int argc, char *argv[]){ char endata[1024]; int endata_len = 0; char dedata[1024]; int dedata_len = 0; int keymode = RSA_PKCS1_PADDING; RSA_PUBKEYTYPE pubkeytype = RSA_PUBLICKEY; memset(endata, 0x00, sizeof(endata)); memset(dedata, 0x00, sizeof(dedata)); if (argc > 1) { strcpy(endata, argv[1]); endata_len = strlen(argv[1]) + 1; } else { char *defaultstr = "helloawildwolf! abcdefwildwolf! 12345wildwolf! @#$%^wildwolf!*"; strcpy(endata, defaultstr); endata_len = strlen(defaultstr) + 1; } rsa_generate_key(PRIKEY, PUBKEY, 1024, pubkeytype); printf("\nendata:%s, endata_len = %d\n", endata, endata_len); //签名 dedata_len = rsa_pri_encrypt((unsigned char *)endata, endata_len, (unsigned char *)dedata, PRIKEY, keymode); printf("\n\nsignature enc is:\n %s len:%d\n\n", dedata, dedata_len); memset(endata, 0x00, sizeof(endata)); endata_len = 0; endata_len = rsa_pub_decrypt((unsigned char *)dedata, dedata_len, (unsigned char *)endata, PUBKEY, keymode, pubkeytype); printf("\n\nsignature dec is:\n %s len:%d\n\n", endata, endata_len); //数据加密 dedata_len = rsa_pub_encrypt((unsigned char *)endata, endata_len, (unsigned char *)dedata, PUBKEY, keymode, pubkeytype); printf("\n\ndata enc is:\n %s len:%d\n\n", dedata, dedata_len); memset(endata, 0x00, sizeof(endata)); endata_len = 0; endata_len = rsa_pri_decrypt((unsigned char *)dedata, dedata_len, (unsigned char *)endata, PRIKEY, keymode); printf("\n\ndata dec is:\n %s len:%d\n\n", endata, endata_len); return 0;}#ifdef __cplusplus#if cplusplus}#endif#endif
阅读全文
0 0
- RSA
- RSA
- RSA
- RSA
- RSA
- rsa
- rsa
- RSA
- RSA
- rsa
- rsa
- RSA
- RSA
- RSA
- RSA
- RSA
- RSA
- rsa
- 由图片的网络地址获取图片的base64编码
- 【单调队列】POJ_2823 Sliding Window
- 【数据】Marvell 88W8782 WiFi模块的固件数据
- hdu 2015 偶数求和
- 常见基础排序算法总结及java代码
- RSA
- Linux下用户组、文件权限详解
- 集群之RHCS
- leetcode(34). Search for a Range
- 关于在anaconda下安装selenium后import报错问题
- vue学习笔记(一)
- git管理碰到的问题 -- 什么时候新建 branch
- BZOJ 4868 HEOI 期末考试
- 关于Docker的服务发现与注册