-
-
Save zhangyonglei/a5186d67aa7a9ebc573aefd3e9d01a6f to your computer and use it in GitHub Desktop.
RSA非对称数据加密算法使用示例
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <string.h> | |
#include <openssl/rsa.h> | |
#include <openssl/applink.c> | |
void print_buf_hex( unsigned char *buf, int len ) | |
{ | |
int i; | |
for( i = 0; i < len; i++ ) | |
{ | |
printf( "%02x", buf[i] ); | |
} | |
} | |
int main( int argc, char *argv[] ) | |
{ | |
RSA *rsa; | |
int n; | |
unsigned char text[128], cipher[128]; | |
unsigned char rsa_n[128], rsa_d[128]; | |
// 生成密钥 | |
rsa = RSA_generate_key( 1024, RSA_F4, NULL, NULL ); | |
if( NULL == rsa ) | |
{ | |
printf( "main.RSA_generate_key\n" ); | |
return -1; | |
} | |
n = RSA_size( rsa ); | |
BN_bn2bin( rsa->n, rsa_n ); // 保存公钥 | |
BN_bn2bin( rsa->d, rsa_d ); // 保存私钥 | |
RSA_free( rsa ); | |
printf( "RSA_size: %d\n\npublic modulus:\n", n ); | |
print_buf_hex( rsa_n, sizeof(rsa_n) ); | |
printf( "\n\nprivate exponent:\n" ); | |
print_buf_hex( rsa_d, sizeof(rsa_d) ); | |
printf( "\n\n" ); | |
// 加密的过程 | |
rsa = RSA_new(); | |
if( NULL == rsa ) | |
{ | |
printf( "main.RSA_new for encrypt\n" ); | |
return -1; | |
} | |
// 设置公钥 | |
rsa->n = BN_bin2bn( rsa_n, sizeof(rsa_n), rsa->n ); | |
rsa->e = BN_bin2bn( "\x01\x00\x01", 3, rsa->e ); | |
// 设置明文并加密 | |
for( n = 0; n < sizeof(text); n++ ) | |
{ | |
text[n] = n; | |
} | |
n = RSA_public_encrypt( sizeof(text), text, cipher, rsa, RSA_NO_PADDING ); | |
RSA_free( rsa ); | |
printf( "RSA_public_encrypt: %d\ncipher:\n", n ); | |
print_buf_hex( cipher, sizeof(cipher) ); | |
printf( "\n\n" ); | |
// 解密的过程 | |
rsa = RSA_new(); | |
if( NULL == rsa ) | |
{ | |
printf( "main.RSA_new for decrypt\n" ); | |
return -1; | |
} | |
// 设置公钥及私钥 | |
rsa->n = BN_bin2bn( rsa_n, sizeof(rsa_n), rsa->n ); | |
rsa->e = BN_bin2bn( "\x01\x00\x01", 3, rsa->e ); | |
rsa->d = BN_bin2bn( rsa_d, sizeof(rsa_d), rsa->d ); | |
// 解密数据 | |
n = RSA_private_decrypt( sizeof(cipher), cipher, text, rsa, | |
RSA_NO_PADDING ); | |
RSA_free( rsa ); | |
printf( "RSA_private_decrypt: %d\ntext:\n", n ); | |
print_buf_hex( text, sizeof(text) ); | |
putchar( '\n' ); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment