RSA加解密

/*
 * 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;
}

猜你喜欢

转载自blog.csdn.net/cyf15238622067/article/details/78742420
今日推荐