博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

OpenSSL 编程 - RSA 加密解密

Posted on 2008-03-14 15:42  NadOo  阅读(8253)  评论(5编辑  收藏  举报

这几天做这方面的东西,网上资料很少,贴一个自己试验写的代码,做个记录。
加密:

/*
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 
*= RSA_new();
    r
->= bnn;
    r
->= bne;
    r
->= 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, inout, 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[] = {0x980x790xb20x76};
    unsigned 
char *out;

    bnn 
= BN_new();
    bne 
= BN_new();
    BN_hex2bn(
&bnn, MODULUS);
    BN_set_word(bne, PUBLIC_EXPONENT);

    RSA 
*= RSA_new();
    r
->= bnn;
    r
->= 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), inout, 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;
}