出处:http://blog.csdn.net/zahuopuboss/article/details/9670795
作者:杂货铺
随机数
加减乘除
取模
指数
- #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 > 1) {
- bits = atoi(argv[1]);
- }
- if (bits <= 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(&a);
- BN_init(&b);
- BN_init(&c);
- BN_init(&d);
- BN_rand(&a, bits, 1, 1);
- printf("BN_rand a: ");
- bn_printf(&a, 1);
- bn_hex_printf(&a);
- bn_dec_printf(&a);
- BN_add_word(&a, 1);
- printf("BN_add_word a + 1\n");
- bn_printf(&a, 1);
- BN_free(&a);
- BN_init(&a);
- BN_rand(&a, bits, 1, 0);
- printf("BN_rand a: ");
- bn_printf(&a, 1);
- BN_rand(&b, bits, 0, 1);
- printf("BN_rand b: ");
- bn_printf(&b, 1);
- BN_add(&c, &a, &b);
- printf("BN_add a + b\n");
- bn_printf(&a, 0);
- printf(" + ");
- bn_printf(&b, 0);
- printf(" = ");
- bn_printf(&c, 1);
- BN_sub(&c, &a, &b);
- printf("BN_sub a - b\n");
- bn_printf(&a, 0);
- printf(" - ");
- bn_printf(&b, 0);
- printf(" = ");
- bn_printf(&c, 1);
- BN_mul(&c, &a, &b, ctx);
- printf("BN_mul a * b\n");
- bn_printf(&a, 0);
- printf(" * ");
- bn_printf(&b, 0);
- printf(" = ");
- bn_printf(&c, 1);
- BN_div(&d, &c, &a, &b, ctx);
- printf("BN_div a / b\n");
- bn_printf(&a, 0);
- printf(" / ");
- bn_printf(&b, 0);
- printf(" = ");
- bn_printf(&d, 1);
- printf("remainder ");
- bn_printf(&c, 1);
- BN_mod(&c, &a, &b, ctx);
- printf("BN_mod a %% b\n");
- bn_printf(&a, 0);
- printf(" %% ");
- bn_printf(&b, 0);
- printf(" = ");
- bn_printf(&c, 1);
- BN_exp(&c, &a, &b, ctx);
- printf("BN_exp a ^ b\n");
- bn_printf(&a, 0);
- printf(" ^ ");
- bn_printf(&b, 0);
- printf(" = ");
- if (BN_num_bits(&c) < 64 * 8) {
- bn_printf(&c, 1);
- } else {
- printf("BN_num_bits(c) %d too long, not print\n",
- BN_num_bits(&c));
- }
- BN_set_word(&a, 100);
- printf("BN_set_word a: ");
- bn_printf(&a, 1);
- bn_printf(&a, 0);
- if (BN_is_word(&a, 100)) {
- printf(" is 100\n");
- } else {
- printf(" is not 100\n");
- }
- BN_set_negative(&a, 1);
- printf("BN_set_negative a: ");
- bn_dec_printf(&a);
- BN_free(&a);
- BN_init(&a);
- BN_generate_prime_ex(&a, bits, 1, NULL, NULL, NULL);
- printf("BN_generate_prime_ex a: ");
- bn_printf(&a, 1);
- bn_printf(&a, 0);
- if (1 == BN_is_prime_ex(&a, BN_prime_checks, NULL, NULL)) {
- printf(" is prime\n");
- } else {
- printf(" is not prime\n");
- }
- BN_add_word(&a, 2);
- bn_printf(&a, 0);
- if (1 == BN_is_prime_ex(&a, BN_prime_checks, NULL, NULL)) {
- printf(" is prime\n");
- } else {
- printf(" is not prime\n");
- }
- BN_free(&a);
- BN_free(&b);
- BN_free(&c);
- BN_free(&d);
- BN_CTX_free(ctx);
- return 0;
- }