java rsa enc 源码_RSA加解密源码 | 学步园

源码:

#include

#include

#include

#include

#include

#include

#include

typedef struct{

unsigned char encData[128];

unsigned char encData2[128];

}ENC_DATA;

static char *MODULUS="9EC7D9A2DC5B095F8E5F90295121F41262FAEFBE9AF57B772A71F1F9D9635F8769CB78DA2BCFE9B27FC1F3AD4A3D178F8C61981225EF5DEACBDC5665F12E691AA13DDD321A59CFCF376F002036612FF3C5E057A3007FF675AFA3EDE34DC23A1A2637294870EBE823F76B5CE21E25F3FA5137F5DE12437DE0118245B927B28221";

static char *PRIVATE="8B26E30ECA6E8F3668F6FA78B0C55FB75A4A3FAD0667B152933A4991D7A815D1498F5E1EF44ACEF6CDF252E56F367DED5BA024DF6B267B7E36BD35552DFA0A4CC1E9D0A4BC8E7C76F98D4971441D6693745A0A76E175571BD160E4B1536A6EFF5A08EDA45236E96E7A4748CF4D031CA8B2F4CCE9F2E1286F432DE6495A535E43";

/**************************************

功能:获取RSA结构指针

输入:无

输出:无

返回:RSA结构指针

**************************************/

static RSA *get_key()

{

RSA *r;

int ret;

BIGNUM *bne,*bnn,*bnd;

//使用的密匙数据

unsigned long e = 75011;

//构建RSA数据结构

bne = BN_new();

bnd = BN_new();

bnn = BN_new();

ret = BN_set_word(bne, e);

BN_hex2bn(&bnd, PRIVATE);

BN_hex2bn(&bnn, MODULUS);

r = RSA_new();

r->e=bne;

r->d=bnd;

r->n=bnn;

RSA_print_fp(stdout, r, 5);

return r;

}

/**************************************

功能:加密

输入:r: RSA结构指针

in: 输入需要加密的字符串

输出:无

返回:加密后的字符串

**************************************/

static unsigned char *RSA_encrypt(RSA *r, unsigned char *in)

{

int ret, flen, i;

unsigned char *encData, *tmpData;//加密后的数据/临时指针

//准备输出的加密数据结构

flen = RSA_size(r);

encData = (unsigned char *)malloc(flen);

bzero(encData, flen);

printf("Begin RSA_private_encrypt ...\n");

ret = RSA_private_encrypt(flen, in, encData, r, RSA_NO_PADDING);

if(ret < 0)

{

printf("Encrypt failed!\n");

return;

}

printf("Size:%d\n", ret);

printf("ClearText:%s\n", in);

printf("CipherText(Hex):\n");

tmpData=encData;

for (i=0; i

{

printf("0x%02x, ", *tmpData);

tmpData++;

}

return encData;

}

/**************************************

功能:解密

输入:r: RSA结构指针

in: 输入需要解密的字符串

输出:无

返回:解密后的字符串

**************************************/

static unsigned char *RSA_decrypt(RSA *r, unsigned char *in)

{

int ret, flen;

unsigned char *decData;

flen = RSA_size(r);

decData = (unsigned char *)malloc(flen);

bzero(decData, flen);

printf("Begin RSA_public_decrypt ...\n");

ret = RSA_public_decrypt(flen, in, decData, r, RSA_NO_PADDING);

if(ret < 0)

{

printf("RSA_public_decrypt failed!\n");

return;

}

printf("Size:%d\n", ret);

printf("ClearText:%s\n", decData);

return decData;

}

int main(void) {

int i = 0;

unsigned char *in1 = "test2", *in2="test3";

unsigned char *enc1 = NULL, *enc2 = NULL;

unsigned char *dec1 = NULL, *dec2 = NULL;

RSA *r = get_key();

FILE *tmpfp = fopen("a.bin", "wb+");

ENC_DATA tmp_Data;

memset(&tmp_Data, 0, sizeof(ENC_DATA));

//加密

enc1 = RSA_encrypt(r, in1);

enc2 = RSA_encrypt(r, in2);

unsigned char *tmpData = enc1;

for (i=0; i<128; i++)

{

tmp_Data.encData[i] = *tmpData;

tmpData++;

}

tmpData = enc2;

for (i=0; i<128; i++)

{

tmp_Data.encData2[i] = *tmpData;

tmpData++;

}

fwrite(&tmp_Data,1, sizeof(ENC_DATA), tmpfp);

free(enc1);

enc1 = NULL;

free(enc2);

enc2 = NULL;

fclose(tmpfp);

RSA_free(r);

//解密

r = get_key();

tmpfp = fopen("a.bin", "rb");

memset(&tmp_Data, 0, sizeof(ENC_DATA));

fread(&tmp_Data,1, sizeof(ENC_DATA), tmpfp);

dec1 = RSA_decrypt(r, tmp_Data.encData);

dec2 = RSA_decrypt(r, tmp_Data.encData2);

free(dec1);

dec1 = NULL;

free(dec2);

dec2 = NULL;

fclose(tmpfp);

RSA_free(r);

return EXIT_SUCCESS;

}

编译:

gcc -o test test_rsa.c -I/home/openssl/include/ -L/home/openssl/lib -lcrypto -lssl -ldl

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值