openssl库中BIGNUM的使用

本文演示了如何使用OpenSSL库中的BIGNUM类型执行基本的数学运算,包括随机数生成、加减乘除、取模、指数运算等,并展示了生成素数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随机数

加减乘除

取模

指数

 

  1. #include <stdio.h>  
  2. #include <openssl/bn.h>  
  3. #include <openssl/rand.h>  
  4. #include <openssl/err.h>  
  5.   
  6. void bn_printf(BIGNUM * a, int n)  
  7. {  
  8.     printf(”0x”);  
  9.     BN_print_fp(stdout, a);  
  10.     if (n)  
  11.         printf(”\n”);  
  12. }  
  13.   
  14. void bn_hex_printf(BIGNUM * a)  
  15. {  
  16.     char *p = BN_bn2hex(a);  
  17.     printf(”0x%s\n”, p);  
  18.     OPENSSL_free(p);  
  19. }  
  20.   
  21. void bn_dec_printf(BIGNUM * a)  
  22. {  
  23.     char *p = BN_bn2dec(a);  
  24.     printf(”%s\n”, p);  
  25.     OPENSSL_free(p);  
  26. }  
  27.   
  28. int main(int argc, char *argv[])  
  29. {  
  30.     int bits = 3;  
  31.   
  32.     if (argc > 1) {  
  33.         bits = atoi(argv[1]);  
  34.     }  
  35.     if (bits <= 0) {  
  36.         bits = 8;  
  37.     }  
  38.     printf(”bits: %d\n”, bits);  
  39.   
  40.     BN_CTX *ctx;  
  41.     BIGNUM a, b, c, d;  
  42.   
  43.     ctx = BN_CTX_new();  
  44.     if (ctx == NULL)  
  45.         exit(1);  
  46.   
  47.     BN_init(&a);  
  48.     BN_init(&b);  
  49.     BN_init(&c);  
  50.     BN_init(&d);  
  51.   
  52.     BN_rand(&a, bits, 1, 1);  
  53.     printf(”BN_rand a: ”);  
  54.     bn_printf(&a, 1);  
  55.     bn_hex_printf(&a);  
  56.     bn_dec_printf(&a);  
  57.   
  58.     BN_add_word(&a, 1);  
  59.     printf(”BN_add_word a + 1\n”);  
  60.     bn_printf(&a, 1);  
  61.   
  62.     BN_free(&a);  
  63.     BN_init(&a);  
  64.   
  65.     BN_rand(&a, bits, 1, 0);  
  66.     printf(”BN_rand a: ”);  
  67.     bn_printf(&a, 1);  
  68.   
  69.     BN_rand(&b, bits, 0, 1);  
  70.     printf(”BN_rand b: ”);  
  71.     bn_printf(&b, 1);  
  72.   
  73.     BN_add(&c, &a, &b);  
  74.     printf(”BN_add a + b\n”);  
  75.     bn_printf(&a, 0);  
  76.     printf(” + ”);  
  77.     bn_printf(&b, 0);  
  78.     printf(” = ”);  
  79.     bn_printf(&c, 1);  
  80.   
  81.     BN_sub(&c, &a, &b);  
  82.     printf(”BN_sub a - b\n”);  
  83.     bn_printf(&a, 0);  
  84.     printf(” - ”);  
  85.     bn_printf(&b, 0);  
  86.     printf(” = ”);  
  87.     bn_printf(&c, 1);  
  88.   
  89.     BN_mul(&c, &a, &b, ctx);  
  90.     printf(”BN_mul a * b\n”);  
  91.     bn_printf(&a, 0);  
  92.     printf(” * ”);  
  93.     bn_printf(&b, 0);  
  94.     printf(” = ”);  
  95.     bn_printf(&c, 1);  
  96.   
  97.     BN_div(&d, &c, &a, &b, ctx);  
  98.     printf(”BN_div a / b\n”);  
  99.     bn_printf(&a, 0);  
  100.     printf(” / ”);  
  101.     bn_printf(&b, 0);  
  102.     printf(” = ”);  
  103.     bn_printf(&d, 1);  
  104.     printf(”remainder ”);  
  105.     bn_printf(&c, 1);  
  106.   
  107.     BN_mod(&c, &a, &b, ctx);  
  108.     printf(”BN_mod a %% b\n”);  
  109.     bn_printf(&a, 0);  
  110.     printf(” %% ”);  
  111.     bn_printf(&b, 0);  
  112.     printf(” = ”);  
  113.     bn_printf(&c, 1);  
  114.   
  115.     BN_exp(&c, &a, &b, ctx);  
  116.     printf(”BN_exp a ^ b\n”);  
  117.     bn_printf(&a, 0);  
  118.     printf(” ^ ”);  
  119.     bn_printf(&b, 0);  
  120.     printf(” = ”);  
  121.     if (BN_num_bits(&c) < 64 * 8) {  
  122.         bn_printf(&c, 1);  
  123.     } else {  
  124.         printf(”BN_num_bits(c) %d too long, not print\n”,  
  125.                BN_num_bits(&c));  
  126.     }  
  127.   
  128.     BN_set_word(&a, 100);  
  129.     printf(”BN_set_word a: ”);  
  130.     bn_printf(&a, 1);  
  131.   
  132.     bn_printf(&a, 0);  
  133.     if (BN_is_word(&a, 100)) {  
  134.         printf(” is 100\n”);  
  135.     } else {  
  136.         printf(” is not 100\n”);  
  137.     }  
  138.   
  139.     BN_set_negative(&a, 1);  
  140.     printf(”BN_set_negative a: ”);  
  141.     bn_dec_printf(&a);  
  142.   
  143.     BN_free(&a);  
  144.     BN_init(&a);  
  145.   
  146.     BN_generate_prime_ex(&a, bits, 1, NULL, NULL, NULL);  
  147.     printf(”BN_generate_prime_ex a: ”);  
  148.     bn_printf(&a, 1);  
  149.   
  150.     bn_printf(&a, 0);  
  151.     if (1 == BN_is_prime_ex(&a, BN_prime_checks, NULL, NULL)) {  
  152.         printf(” is prime\n”);  
  153.     } else {  
  154.         printf(” is not prime\n”);  
  155.     }  
  156.   
  157.     BN_add_word(&a, 2);  
  158.     bn_printf(&a, 0);  
  159.     if (1 == BN_is_prime_ex(&a, BN_prime_checks, NULL, NULL)) {  
  160.         printf(” is prime\n”);  
  161.     } else {  
  162.         printf(” is not prime\n”);  
  163.     }  
  164.   
  165.     BN_free(&a);  
  166.     BN_free(&b);  
  167.     BN_free(&c);  
  168.     BN_free(&d);  
  169.   
  170.     BN_CTX_free(ctx);  
  171.   
  172.     return 0;  
  173. }  
#include <stdio.h>




include <openssl/bn.h>

include <openssl/rand.h>

include <openssl/err.h>

void bn_printf(BIGNUM * a, int n)
{
printf("0x");
BN_print_fp(stdout, a);
if (n)
printf("\n");
}

void bn_hex_printf(BIGNUM * a)
{
char *p = BN_bn2hex(a);
printf("0x%s\n", p);
OPENSSL_free(p);
}

void bn_dec_printf(BIGNUM * a)
{
char *p = BN_bn2dec(a);
printf("%s\n", p);
OPENSSL_free(p);
}

int main(int argc, char *argv[])
{
int bits = 3;

if (argc &gt; 1) {
    bits = atoi(argv[1]);
}
if (bits &lt;= 0) {
    bits = 8;
}
printf("bits: %d\n", bits);

BN_CTX *ctx;
BIGNUM a, b, c, d;

ctx = BN_CTX_new();
if (ctx == NULL)
    exit(1);

BN_init(&amp;a);
BN_init(&amp;b);
BN_init(&amp;c);
BN_init(&amp;d);

BN_rand(&amp;a, bits, 1, 1);
printf("BN_rand a: ");
bn_printf(&amp;a, 1);
bn_hex_printf(&amp;a);
bn_dec_printf(&amp;a);

BN_add_word(&amp;a, 1);
printf("BN_add_word a + 1\n");
bn_printf(&amp;a, 1);

BN_free(&amp;a);
BN_init(&amp;a);

BN_rand(&amp;a, bits, 1, 0);
printf("BN_rand a: ");
bn_printf(&amp;a, 1);

BN_rand(&amp;b, bits, 0, 1);
printf("BN_rand b: ");
bn_printf(&amp;b, 1);

BN_add(&amp;c, &amp;a, &amp;b);
printf("BN_add a + b\n");
bn_printf(&amp;a, 0);
printf(" + ");
bn_printf(&amp;b, 0);
printf(" = ");
bn_printf(&amp;c, 1);

BN_sub(&amp;c, &amp;a, &amp;b);
printf("BN_sub a - b\n");
bn_printf(&amp;a, 0);
printf(" - ");
bn_printf(&amp;b, 0);
printf(" = ");
bn_printf(&amp;c, 1);

BN_mul(&amp;c, &amp;a, &amp;b, ctx);
printf("BN_mul a * b\n");
bn_printf(&amp;a, 0);
printf(" * ");
bn_printf(&amp;b, 0);
printf(" = ");
bn_printf(&amp;c, 1);

BN_div(&amp;d, &amp;c, &amp;a, &amp;b, ctx);
printf("BN_div a / b\n");
bn_printf(&amp;a, 0);
printf(" / ");
bn_printf(&amp;b, 0);
printf(" = ");
bn_printf(&amp;d, 1);
printf("remainder ");
bn_printf(&amp;c, 1);

BN_mod(&amp;c, &amp;a, &amp;b, ctx);
printf("BN_mod a %% b\n");
bn_printf(&amp;a, 0);
printf(" %% ");
bn_printf(&amp;b, 0);
printf(" = ");
bn_printf(&amp;c, 1);

BN_exp(&amp;c, &amp;a, &amp;b, ctx);
printf("BN_exp a ^ b\n");
bn_printf(&amp;a, 0);
printf(" ^ ");
bn_printf(&amp;b, 0);
printf(" = ");
if (BN_num_bits(&amp;c) &lt; 64 * 8) {
    bn_printf(&amp;c, 1);
} else {
    printf("BN_num_bits(c) %d too long, not print\n",
           BN_num_bits(&amp;c));
}

BN_set_word(&amp;a, 100);
printf("BN_set_word a: ");
bn_printf(&amp;a, 1);

bn_printf(&amp;a, 0);
if (BN_is_word(&amp;a, 100)) {
    printf(" is 100\n");
} else {
    printf(" is not 100\n");
}

BN_set_negative(&amp;a, 1);
printf("BN_set_negative a: ");
bn_dec_printf(&amp;a);

BN_free(&amp;a);
BN_init(&amp;a);

BN_generate_prime_ex(&amp;a, bits, 1, NULL, NULL, NULL);
printf("BN_generate_prime_ex a: ");
bn_printf(&amp;a, 1);

bn_printf(&amp;a, 0);
if (1 == BN_is_prime_ex(&amp;a, BN_prime_checks, NULL, NULL)) {
    printf(" is prime\n");
} else {
    printf(" is not prime\n");
}

BN_add_word(&amp;a, 2);
bn_printf(&amp;a, 0);
if (1 == BN_is_prime_ex(&amp;a, BN_prime_checks, NULL, NULL)) {
    printf(" is prime\n");
} else {
    printf(" is not prime\n");
}

BN_free(&amp;a);
BN_free(&amp;b);
BN_free(&amp;c);
BN_free(&amp;d);

BN_CTX_free(ctx);

return 0;
}


 

运行结果

 

  1. &nbsp;gcc&nbsp;-Wall&nbsp;-lcrypto&nbsp;bn.c&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span> &nbsp;gcc&nbsp;-Wall&nbsp;-lcrypto&nbsp;bn.c&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>  ./a.out 5                                               
  2. bits: 5  
  3. BN_rand a: 0x19  
  4. 0x19  
  5. 25  
  6. BN_add_word a + 1  
  7. 0x1A  
  8. BN_rand a: 0x1E  
  9. BN_rand b: 0x1D  
  10. BN_add a + b  
  11. 0x1E + 0x1D = 0x3B  
  12. BN_sub a - b  
  13. 0x1E - 0x1D = 0x1  
  14. BN_mul a * b  
  15. 0x1E * 0x1D = 0x366  
  16. BN_div a / b  
  17. 0x1E / 0x1D = 0x1  
  18. remainder 0x1  
  19. BN_mod a % b  
  20. 0x1E % 0x1D = 0x1  
  21. BN_exp a ^ b  
  22. 0x1E ^ 0x1D = 0x4EC8A7BC9DC1FCCECDF11AC97979E0000000  
  23. BN_set_word a: 0x64  
  24. 0x64 is 100  
  25. BN_set_negative a: -100  
  26. BN_generate_prime_ex a: 0x8C27  
  27. 0x8C27 is prime  
  28. 0x8C29 is not prime  
  29.   
  30.   
  31. &nbsp;./a.out&nbsp;16&nbsp;&nbsp;</span></li><li class="alt"><span>bits:&nbsp;16&nbsp;&nbsp;</span></li><li class=""><span>BN_rand&nbsp;a:&nbsp;0xD3C5&nbsp;&nbsp;</span></li><li class="alt"><span>0xD3C5&nbsp;&nbsp;</span></li><li class=""><span>54213&nbsp;&nbsp;</span></li><li class="alt"><span>BN_add_word&nbsp;a&nbsp;+&nbsp;1&nbsp;&nbsp;</span></li><li class=""><span>0xD3C6&nbsp;&nbsp;</span></li><li class="alt"><span>BN_rand&nbsp;a:&nbsp;0xCDE5&nbsp;&nbsp;</span></li><li class=""><span>BN_rand&nbsp;b:&nbsp;0xB79B&nbsp;&nbsp;</span></li><li class="alt"><span>BN_add&nbsp;a&nbsp;+&nbsp;b&nbsp;&nbsp;</span></li><li class=""><span>0xCDE5&nbsp;+&nbsp;0xB79B&nbsp;=&nbsp;0x18580&nbsp;&nbsp;</span></li><li class="alt"><span>BN_sub&nbsp;a&nbsp;-&nbsp;b&nbsp;&nbsp;</span></li><li class=""><span>0xCDE5&nbsp;-&nbsp;0xB79B&nbsp;=&nbsp;0x164A&nbsp;&nbsp;</span></li><li class="alt"><span>BN_mul&nbsp;a&nbsp;*&nbsp;b&nbsp;&nbsp;</span></li><li class=""><span>0xCDE5&nbsp;*&nbsp;0xB79B&nbsp;=&nbsp;0x93AB5CA7&nbsp;&nbsp;</span></li><li class="alt"><span>BN_div&nbsp;a&nbsp;/&nbsp;b&nbsp;&nbsp;</span></li><li class=""><span>0xCDE5&nbsp;/&nbsp;0xB79B&nbsp;=&nbsp;0x1&nbsp;&nbsp;</span></li><li class="alt"><span>remainder&nbsp;0x164A&nbsp;&nbsp;</span></li><li class=""><span>BN_mod&nbsp;a&nbsp;%&nbsp;b&nbsp;&nbsp;</span></li><li class="alt"><span>0xCDE5&nbsp;%&nbsp;0xB79B&nbsp;=&nbsp;0x164A&nbsp;&nbsp;</span></li><li class=""><span>BN_exp&nbsp;a&nbsp;^&nbsp;b&nbsp;&nbsp;</span></li><li class="alt"><span>0xCDE5&nbsp;^&nbsp;0xB79B&nbsp;=&nbsp;BN_num_bits(c)&nbsp;737278&nbsp;too&nbsp;long,&nbsp;not&nbsp;print&nbsp;&nbsp;</span></li><li class=""><span>BN_set_word&nbsp;a:&nbsp;0x64&nbsp;&nbsp;</span></li><li class="alt"><span>0x64&nbsp;is&nbsp;100&nbsp;&nbsp;</span></li><li class=""><span>BN_set_negative&nbsp;a:&nbsp;-100&nbsp;&nbsp;</span></li><li class="alt"><span>BN_generate_prime_ex&nbsp;a:&nbsp;0xDEA7&nbsp;&nbsp;</span></li><li class=""><span>0xDEA7&nbsp;is&nbsp;prime&nbsp;&nbsp;</span></li><li class="alt"><span>0xDEA9&nbsp;is&nbsp;not&nbsp;prime&nbsp;&nbsp;</span></li></ol></div><pre class="plain" name="code" style="display: none;"> &nbsp;./a.out&nbsp;16&nbsp;&nbsp;</span></li><li class="alt"><span>bits:&nbsp;16&nbsp;&nbsp;</span></li><li class=""><span>BN_rand&nbsp;a:&nbsp;0xD3C5&nbsp;&nbsp;</span></li><li class="alt"><span>0xD3C5&nbsp;&nbsp;</span></li><li class=""><span>54213&nbsp;&nbsp;</span></li><li class="alt"><span>BN_add_word&nbsp;a&nbsp;+&nbsp;1&nbsp;&nbsp;</span></li><li class=""><span>0xD3C6&nbsp;&nbsp;</span></li><li class="alt"><span>BN_rand&nbsp;a:&nbsp;0xCDE5&nbsp;&nbsp;</span></li><li class=""><span>BN_rand&nbsp;b:&nbsp;0xB79B&nbsp;&nbsp;</span></li><li class="alt"><span>BN_add&nbsp;a&nbsp;+&nbsp;b&nbsp;&nbsp;</span></li><li class=""><span>0xCDE5&nbsp;+&nbsp;0xB79B&nbsp;=&nbsp;0x18580&nbsp;&nbsp;</span></li><li class="alt"><span>BN_sub&nbsp;a&nbsp;-&nbsp;b&nbsp;&nbsp;</span></li><li class=""><span>0xCDE5&nbsp;-&nbsp;0xB79B&nbsp;=&nbsp;0x164A&nbsp;&nbsp;</span></li><li class="alt"><span>BN_mul&nbsp;a&nbsp;*&nbsp;b&nbsp;&nbsp;</span></li><li class=""><span>0xCDE5&nbsp;*&nbsp;0xB79B&nbsp;=&nbsp;0x93AB5CA7&nbsp;&nbsp;</span></li><li class="alt"><span>BN_div&nbsp;a&nbsp;/&nbsp;b&nbsp;&nbsp;</span></li><li class=""><span>0xCDE5&nbsp;/&nbsp;0xB79B&nbsp;=&nbsp;0x1&nbsp;&nbsp;</span></li><li class="alt"><span>remainder&nbsp;0x164A&nbsp;&nbsp;</span></li><li class=""><span>BN_mod&nbsp;a&nbsp;%&nbsp;b&nbsp;&nbsp;</span></li><li class="alt"><span>0xCDE5&nbsp;%&nbsp;0xB79B&nbsp;=&nbsp;0x164A&nbsp;&nbsp;</span></li><li class=""><span>BN_exp&nbsp;a&nbsp;^&nbsp;b&nbsp;&nbsp;</span></li><li class="alt"><span>0xCDE5&nbsp;^&nbsp;0xB79B&nbsp;=&nbsp;BN_num_bits(c)&nbsp;737278&nbsp;too&nbsp;long,&nbsp;not&nbsp;print&nbsp;&nbsp;</span></li><li class=""><span>BN_set_word&nbsp;a:&nbsp;0x64&nbsp;&nbsp;</span></li><li class="alt"><span>0x64&nbsp;is&nbsp;100&nbsp;&nbsp;</span></li><li class=""><span>BN_set_negative&nbsp;a:&nbsp;-100&nbsp;&nbsp;</span></li><li class="alt"><span>BN_generate_prime_ex&nbsp;a:&nbsp;0xDEA7&nbsp;&nbsp;</span></li><li class=""><span>0xDEA7&nbsp;is&nbsp;prime&nbsp;&nbsp;</span></li><li class="alt"><span>0xDEA9&nbsp;is&nbsp;not&nbsp;prime&nbsp;&nbsp;</span></li></ol></div><pre class="plain" name="code" style="display: none;"> gcc -Wall -lcrypto bn.c ./a.out5bits:5BNranda:0x190x1925BNaddworda+10x1ABNranda:0x1EBNrandb:0x1DBNadda+b0x1E+0x1D=0x3BBNsubab0x1E0x1D=0x1BNmulab0x1E0x1D=0x366BNdiva/b0x1E/0x1D=0x1remainder0x1BNmoda0x1EBNexpab0x1E0x1D=0x4EC8A7BC9DC1FCCECDF11AC97979E0000000BNsetworda:0x640x64is100BNsetnegativea:100BNgenerateprimeexa:0x8C270x8C27isprime0x8C29isnotprime . / a . o u t 5 b i t s : 5 B N r a n d a : 0 x 19 0 x 19 25 B N a d d w o r d a + 1 0 x 1 A B N r a n d a : 0 x 1 E B N r a n d b : 0 x 1 D B N a d d a + b 0 x 1 E + 0 x 1 D = 0 x 3 B B N s u b a − b 0 x 1 E − 0 x 1 D = 0 x 1 B N m u l a ∗ b 0 x 1 E ∗ 0 x 1 D = 0 x 366 B N d i v a / b 0 x 1 E / 0 x 1 D = 0 x 1 r e m a i n d e r 0 x 1 B N m o d a 0 x 1 E B N e x p a b 0 x 1 E 0 x 1 D = 0 x 4 E C 8 A 7 B C 9 D C 1 F C C E C D F 11 A C 97979 E 0000000 B N s e t w o r d a : 0 x 64 0 x 64 i s 100 B N s e t n e g a t i v e a : − 100 B N g e n e r a t e p r i m e e x a : 0 x 8 C 27 0 x 8 C 27 i s p r i m e 0 x 8 C 29 i s n o t p r i m e ./a.out 16 bits: 16 BN_rand a: 0xD3C5 0xD3C5 54213 BN_add_word a + 1 0xD3C6 BN_rand a: 0xCDE5 BN_rand b: 0xB79B BN_add a + b 0xCDE5 + 0xB79B = 0x18580 BN_sub a - b 0xCDE5 - 0xB79B = 0x164A BN_mul a * b 0xCDE5 * 0xB79B = 0x93AB5CA7 BN_div a / b 0xCDE5 / 0xB79B = 0x1 remainder 0x164A BN_mod a % b 0xCDE5 % 0xB79B = 0x164A BN_exp a ^ b 0xCDE5 ^ 0xB79B = BN_num_bits(c) 737278 too long, not print BN_set_word a: 0x64 0x64 is 100 BN_set_negative a: -100 BN_generate_prime_ex a: 0xDEA7 0xDEA7 is prime 0xDEA9 is not prime


     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值