这几天做这方面的东西,网上资料很少,贴一个自己试验写的代码,做个记录。
加密:
/*
gcc -o rsa-encrypt rsa-encrypt.c -lcrypto
*/
#include <openssl/rsa.h>
#include <openssl/err.h>
#define MODULUS "C8FBCF21"
#define PUBLIC_EXPONENT RSA_F4
#define PRIVATE_EXPONENT "97B55D7D"
int main()
{
int ret, flen;
BIGNUM *bnn, *bne, *bnd;
unsigned char *in = "abc";
unsigned char *out;
bnn = BN_new();
bne = BN_new();
bnd = BN_new();
BN_hex2bn(&bnn, MODULUS);
BN_set_word(bne, PUBLIC_EXPONENT);
BN_hex2bn(&bnd, PRIVATE_EXPONENT);
RSA *r = RSA_new();
r->n = bnn;
r->e = bne;
r->d = bnd;
RSA_print_fp(stdout, r, 5);
flen = RSA_size(r);// - 11;
out = (char *)malloc(flen);
bzero(out, flen);
//memset(out, 0, flen);
printf("Begin encrypt... ");
ret = RSA_private_encrypt(flen, in, out, r, RSA_NO_PADDING);
if (ret < 0)
{
printf("Encrypt failed! ");
return 1;
}
printf("Size:%d ", ret);
printf("ClearText:%s ", in);
printf("CipherText(Hex):");
int i;
for (i=0; i<ret; i++)
{
printf("0x%02x, ", *out);
out++;
}
printf(" ");
//free(out);
RSA_free(r);
return 0;
}
gcc -o rsa-encrypt rsa-encrypt.c -lcrypto
*/
#include <openssl/rsa.h>
#include <openssl/err.h>
#define MODULUS "C8FBCF21"
#define PUBLIC_EXPONENT RSA_F4
#define PRIVATE_EXPONENT "97B55D7D"
int main()
{
int ret, flen;
BIGNUM *bnn, *bne, *bnd;
unsigned char *in = "abc";
unsigned char *out;
bnn = BN_new();
bne = BN_new();
bnd = BN_new();
BN_hex2bn(&bnn, MODULUS);
BN_set_word(bne, PUBLIC_EXPONENT);
BN_hex2bn(&bnd, PRIVATE_EXPONENT);
RSA *r = RSA_new();
r->n = bnn;
r->e = bne;
r->d = bnd;
RSA_print_fp(stdout, r, 5);
flen = RSA_size(r);// - 11;
out = (char *)malloc(flen);
bzero(out, flen);
//memset(out, 0, flen);
printf("Begin encrypt... ");
ret = RSA_private_encrypt(flen, in, out, r, RSA_NO_PADDING);
if (ret < 0)
{
printf("Encrypt failed! ");
return 1;
}
printf("Size:%d ", ret);
printf("ClearText:%s ", in);
printf("CipherText(Hex):");
int i;
for (i=0; i<ret; i++)
{
printf("0x%02x, ", *out);
out++;
}
printf(" ");
//free(out);
RSA_free(r);
return 0;
}
解密:
/*
gcc -o rsa-decrypt rsa-decrypt.c -lcrypto
*/
#include <openssl/rsa.h>
#define MODULUS "C8FBCF21"
#define PUBLIC_EXPONENT RSA_F4
#define PRIVATE_EXPONENT "97B55D7D"
int main()
{
int ret, flen;
BIGNUM *bnn, *bne;
unsigned char in[] = {0x98, 0x79, 0xb2, 0x76};
unsigned char *out;
bnn = BN_new();
bne = BN_new();
BN_hex2bn(&bnn, MODULUS);
BN_set_word(bne, PUBLIC_EXPONENT);
RSA *r = RSA_new();
r->n = bnn;
r->e = bne;
RSA_print_fp(stdout, r, 5);
flen = RSA_size(r);
out = (unsigned char *)malloc(flen);
bzero(out, flen);
printf("Begin decrypt... ");
ret = RSA_public_decrypt(sizeof(in), in, out, r, RSA_NO_PADDING);
if (ret < 0)
{
printf("Decrypt failed! ");
return 1;
}
printf("Size:%d ", ret);
printf("ClearText:%s ", out);
free(out);
RSA_free(r);
return 0;
}
gcc -o rsa-decrypt rsa-decrypt.c -lcrypto
*/
#include <openssl/rsa.h>
#define MODULUS "C8FBCF21"
#define PUBLIC_EXPONENT RSA_F4
#define PRIVATE_EXPONENT "97B55D7D"
int main()
{
int ret, flen;
BIGNUM *bnn, *bne;
unsigned char in[] = {0x98, 0x79, 0xb2, 0x76};
unsigned char *out;
bnn = BN_new();
bne = BN_new();
BN_hex2bn(&bnn, MODULUS);
BN_set_word(bne, PUBLIC_EXPONENT);
RSA *r = RSA_new();
r->n = bnn;
r->e = bne;
RSA_print_fp(stdout, r, 5);
flen = RSA_size(r);
out = (unsigned char *)malloc(flen);
bzero(out, flen);
printf("Begin decrypt... ");
ret = RSA_public_decrypt(sizeof(in), in, out, r, RSA_NO_PADDING);
if (ret < 0)
{
printf("Decrypt failed! ");
return 1;
}
printf("Size:%d ", ret);
printf("ClearText:%s ", out);
free(out);
RSA_free(r);
return 0;
}