SM2算法第二十三篇:openssl库中BIGNUM的使用


出处:http://blog.csdn.net/zahuopuboss/article/details/9670795

作者:杂货铺


随机数

加减乘除

取模

指数

 

[cpp]  view plain  copy
  1. #include   
  2. #include   
  3. #include   
  4. #include   
  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. }

你可能感兴趣的:(SM2椭圆曲线)