/*
* rsa_crypt.c
*
* Created on: Dec 7, 2017
* Author: cui
*/
#include <string.h>
#include <openssl/rsa.h>
#include <openssl/sha.h>
int main( int argc, char *argv[] )
{
RSA *r;
int bits = 1024;
int ret, len, flen, padding, i;
unsigned long e = RSA_3;
BIGNUM *bne;
unsigned char *key, *p;
BIO *b;
unsigned char from[500], to[500], out[500];
bne = BN_new();
ret = BN_set_word(bne, e); //set bne format
if( ret != 1 ){
printf("BN_set_word err!\n");
return -1;
}
r = RSA_new();
ret=RSA_generate_key_ex(r,bits,bne,NULL);
if(ret!=1){
printf("RSA_generate_key_ex err!\n");
return -1;
}
RSA_print_fp(stdout,r,0); //print RSA
/* private key i2d */
b = BIO_new(BIO_s_mem());
if( NULL == b ){
fprintf( stderr, "BIO_new create mem io failed\n" );
return -1;
}
ret=i2d_RSAPrivateKey_bio(b,r); //get private key
key = malloc(1024);
if( NULL == key){
fprintf(stderr, "malloc 1024bytes for key failed\n");
/* free RSA */
return -1;
}
len=BIO_read(b,key,1024); //read private key to key buffer
BIO_free(b);
b = BIO_new_file("rsa.key","w");
if( NULL == b ){
fprintf( stderr, "BIO_new_file create rsa.key file failed\n" );
}
ret=i2d_RSAPrivateKey_bio(b,r); //get private key to b
BIO_free(b);
/* 私钥d2i */
/* 公钥i2d */
/* 公钥d2i */
/* 私钥加密 */
flen=RSA_size(r);
printf("please select private enc padding : \n");
printf("1.RSA_PKCS1_PADDING\n");
printf("3.RSA_NO_PADDING\n");
printf("5.RSA_X931_PADDING\n");
scanf("%d",&padding);
if(padding==RSA_PKCS1_PADDING)
flen-=11;
else if(padding==RSA_X931_PADDING)
flen-=2;
else if(padding==RSA_NO_PADDING)
flen=flen;
else{
printf("rsa not surport !\n");
return -1;
}
printf( "\nfrom: (total numbers%d)\n", flen );
for( i = 0; i < flen; i++ ){
memset( &from[i], i, 1 );
printf("%.2X ",from[i]);
}
printf("\n");
len=RSA_private_encrypt(flen,from,to,r,padding); //private key encrypt
if(len<=0){
printf("RSA_private_encrypt err!\n");
return -1;
}
printf( "\nto: (total numbers%d)\n", flen );
for( i = 0; i < flen; i++)
printf( "%.2X ", to[i] );
printf("\n");
len=RSA_public_decrypt(len,to,out,r,padding); //public key decript
if(len<=0){
printf("RSA_public_decrypt err!\n");
return -1;
}
printf( "\nout: (total numbers%d)\n", flen );
for( i = 0; i < flen; i++)
printf( "%.2X ", out[i] );
printf("\n");
if(memcmp(from,out,flen)){
printf("err!\n");
return -1;
}
printf( " \nin == out\n\n" );
/* 公匙加密 私匙解密*/
printf("\nplease select public enc padding : \n");
printf("1.RSA_PKCS1_PADDING\n");
printf("2.RSA_SSLV23_PADDING\n");
printf("3.RSA_NO_PADDING\n");
printf("4.RSA_PKCS1_OAEP_PADDING\n");
scanf("%d",&padding);
flen=RSA_size(r);
if(padding==RSA_PKCS1_PADDING)
flen-=11;
else if(padding==RSA_SSLV23_PADDING)
flen-=11;
else if(padding==RSA_X931_PADDING)
flen-=2;
else if(padding==RSA_NO_PADDING)
flen=flen;
else if(padding==RSA_PKCS1_OAEP_PADDING)
flen=flen-2 * SHA_DIGEST_LENGTH-2 ;
else{
printf("rsa not surport !\n");
return -1;
}
printf( "\nfrom: (total numbers%d)\n", flen );
for( i = 0; i < flen; i++ ){
memset( &from[i], i+1, 1 );
printf("%.2X ",from[i]);
}
printf("\n");
len=RSA_public_encrypt(flen,from,to,r,padding);
if(len<=0)
{
printf("RSA_public_encrypt err!\n");
return -1;
}
printf( "\nto: (total numbers%d)\n", flen );
for( i = 0; i < flen; i++)
printf( "%.2X ", to[i] );
printf("\n");
len=RSA_private_decrypt(len,to,out,r,padding);
if(len<=0){
printf("RSA_private_decrypt err!\n");
return -1;
}
printf( "\nout: (total numbers%d)\n", flen );
for( i = 0; i < flen; i++)
printf( "%.2X ", out[i] );
printf("\n");
if(memcmp(from,out,flen)){
printf("err!\n");
return -1;
}
printf("test ok!\n");
RSA_free(r);
return 0;
}
* rsa_crypt.c
*
* Created on: Dec 7, 2017
* Author: cui
*/
#include <string.h>
#include <openssl/rsa.h>
#include <openssl/sha.h>
int main( int argc, char *argv[] )
{
RSA *r;
int bits = 1024;
int ret, len, flen, padding, i;
unsigned long e = RSA_3;
BIGNUM *bne;
unsigned char *key, *p;
BIO *b;
unsigned char from[500], to[500], out[500];
bne = BN_new();
ret = BN_set_word(bne, e); //set bne format
if( ret != 1 ){
printf("BN_set_word err!\n");
return -1;
}
r = RSA_new();
ret=RSA_generate_key_ex(r,bits,bne,NULL);
if(ret!=1){
printf("RSA_generate_key_ex err!\n");
return -1;
}
RSA_print_fp(stdout,r,0); //print RSA
/* private key i2d */
b = BIO_new(BIO_s_mem());
if( NULL == b ){
fprintf( stderr, "BIO_new create mem io failed\n" );
return -1;
}
ret=i2d_RSAPrivateKey_bio(b,r); //get private key
key = malloc(1024);
if( NULL == key){
fprintf(stderr, "malloc 1024bytes for key failed\n");
/* free RSA */
return -1;
}
len=BIO_read(b,key,1024); //read private key to key buffer
BIO_free(b);
b = BIO_new_file("rsa.key","w");
if( NULL == b ){
fprintf( stderr, "BIO_new_file create rsa.key file failed\n" );
}
ret=i2d_RSAPrivateKey_bio(b,r); //get private key to b
BIO_free(b);
/* 私钥d2i */
/* 公钥i2d */
/* 公钥d2i */
/* 私钥加密 */
flen=RSA_size(r);
printf("please select private enc padding : \n");
printf("1.RSA_PKCS1_PADDING\n");
printf("3.RSA_NO_PADDING\n");
printf("5.RSA_X931_PADDING\n");
scanf("%d",&padding);
if(padding==RSA_PKCS1_PADDING)
flen-=11;
else if(padding==RSA_X931_PADDING)
flen-=2;
else if(padding==RSA_NO_PADDING)
flen=flen;
else{
printf("rsa not surport !\n");
return -1;
}
printf( "\nfrom: (total numbers%d)\n", flen );
for( i = 0; i < flen; i++ ){
memset( &from[i], i, 1 );
printf("%.2X ",from[i]);
}
printf("\n");
len=RSA_private_encrypt(flen,from,to,r,padding); //private key encrypt
if(len<=0){
printf("RSA_private_encrypt err!\n");
return -1;
}
printf( "\nto: (total numbers%d)\n", flen );
for( i = 0; i < flen; i++)
printf( "%.2X ", to[i] );
printf("\n");
len=RSA_public_decrypt(len,to,out,r,padding); //public key decript
if(len<=0){
printf("RSA_public_decrypt err!\n");
return -1;
}
printf( "\nout: (total numbers%d)\n", flen );
for( i = 0; i < flen; i++)
printf( "%.2X ", out[i] );
printf("\n");
if(memcmp(from,out,flen)){
printf("err!\n");
return -1;
}
printf( " \nin == out\n\n" );
/* 公匙加密 私匙解密*/
printf("\nplease select public enc padding : \n");
printf("1.RSA_PKCS1_PADDING\n");
printf("2.RSA_SSLV23_PADDING\n");
printf("3.RSA_NO_PADDING\n");
printf("4.RSA_PKCS1_OAEP_PADDING\n");
scanf("%d",&padding);
flen=RSA_size(r);
if(padding==RSA_PKCS1_PADDING)
flen-=11;
else if(padding==RSA_SSLV23_PADDING)
flen-=11;
else if(padding==RSA_X931_PADDING)
flen-=2;
else if(padding==RSA_NO_PADDING)
flen=flen;
else if(padding==RSA_PKCS1_OAEP_PADDING)
flen=flen-2 * SHA_DIGEST_LENGTH-2 ;
else{
printf("rsa not surport !\n");
return -1;
}
printf( "\nfrom: (total numbers%d)\n", flen );
for( i = 0; i < flen; i++ ){
memset( &from[i], i+1, 1 );
printf("%.2X ",from[i]);
}
printf("\n");
len=RSA_public_encrypt(flen,from,to,r,padding);
if(len<=0)
{
printf("RSA_public_encrypt err!\n");
return -1;
}
printf( "\nto: (total numbers%d)\n", flen );
for( i = 0; i < flen; i++)
printf( "%.2X ", to[i] );
printf("\n");
len=RSA_private_decrypt(len,to,out,r,padding);
if(len<=0){
printf("RSA_private_decrypt err!\n");
return -1;
}
printf( "\nout: (total numbers%d)\n", flen );
for( i = 0; i < flen; i++)
printf( "%.2X ", out[i] );
printf("\n");
if(memcmp(from,out,flen)){
printf("err!\n");
return -1;
}
printf("test ok!\n");
RSA_free(r);
return 0;
}