随机数
加减乘除
取模
指数
- #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;
- }
#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;
}
运行结果
- gcc -Wall -lcrypto bn.c </span></span></li><li class=""><span> </span></li><li class="alt"><span> </span></li><li class=""><span> gcc -Wall -lcrypto bn.c </span></span></li><li class=""><span> </span></li><li class="alt"><span> </span></li><li class=""><span> ./a.out 5
- bits: 5
- BN_rand a: 0x19
- 0x19
- 25
- BN_add_word a + 1
- 0x1A
- BN_rand a: 0x1E
- BN_rand b: 0x1D
- BN_add a + b
- 0x1E + 0x1D = 0x3B
- BN_sub a - b
- 0x1E - 0x1D = 0x1
- BN_mul a * b
- 0x1E * 0x1D = 0x366
- BN_div a / b
- 0x1E / 0x1D = 0x1
- remainder 0x1
- BN_mod a % b
- 0x1E % 0x1D = 0x1
- BN_exp a ^ b
- 0x1E ^ 0x1D = 0x4EC8A7BC9DC1FCCECDF11AC97979E0000000
- BN_set_word a: 0x64
- 0x64 is 100
- BN_set_negative a: -100
- BN_generate_prime_ex a: 0x8C27
- 0x8C27 is prime
- 0x8C29 is not prime
- ./a.out 16 </span></li><li class="alt"><span>bits: 16 </span></li><li class=""><span>BN_rand a: 0xD3C5 </span></li><li class="alt"><span>0xD3C5 </span></li><li class=""><span>54213 </span></li><li class="alt"><span>BN_add_word a + 1 </span></li><li class=""><span>0xD3C6 </span></li><li class="alt"><span>BN_rand a: 0xCDE5 </span></li><li class=""><span>BN_rand b: 0xB79B </span></li><li class="alt"><span>BN_add a + b </span></li><li class=""><span>0xCDE5 + 0xB79B = 0x18580 </span></li><li class="alt"><span>BN_sub a - b </span></li><li class=""><span>0xCDE5 - 0xB79B = 0x164A </span></li><li class="alt"><span>BN_mul a * b </span></li><li class=""><span>0xCDE5 * 0xB79B = 0x93AB5CA7 </span></li><li class="alt"><span>BN_div a / b </span></li><li class=""><span>0xCDE5 / 0xB79B = 0x1 </span></li><li class="alt"><span>remainder 0x164A </span></li><li class=""><span>BN_mod a % b </span></li><li class="alt"><span>0xCDE5 % 0xB79B = 0x164A </span></li><li class=""><span>BN_exp a ^ b </span></li><li class="alt"><span>0xCDE5 ^ 0xB79B = BN_num_bits(c) 737278 too long, not print </span></li><li class=""><span>BN_set_word a: 0x64 </span></li><li class="alt"><span>0x64 is 100 </span></li><li class=""><span>BN_set_negative a: -100 </span></li><li class="alt"><span>BN_generate_prime_ex a: 0xDEA7 </span></li><li class=""><span>0xDEA7 is prime </span></li><li class="alt"><span>0xDEA9 is not prime </span></li></ol></div><pre class="plain" name="code" style="display: none;">
./a.out 16 </span></li><li class="alt"><span>bits: 16 </span></li><li class=""><span>BN_rand a: 0xD3C5 </span></li><li class="alt"><span>0xD3C5 </span></li><li class=""><span>54213 </span></li><li class="alt"><span>BN_add_word a + 1 </span></li><li class=""><span>0xD3C6 </span></li><li class="alt"><span>BN_rand a: 0xCDE5 </span></li><li class=""><span>BN_rand b: 0xB79B </span></li><li class="alt"><span>BN_add a + b </span></li><li class=""><span>0xCDE5 + 0xB79B = 0x18580 </span></li><li class="alt"><span>BN_sub a - b </span></li><li class=""><span>0xCDE5 - 0xB79B = 0x164A </span></li><li class="alt"><span>BN_mul a * b </span></li><li class=""><span>0xCDE5 * 0xB79B = 0x93AB5CA7 </span></li><li class="alt"><span>BN_div a / b </span></li><li class=""><span>0xCDE5 / 0xB79B = 0x1 </span></li><li class="alt"><span>remainder 0x164A </span></li><li class=""><span>BN_mod a % b </span></li><li class="alt"><span>0xCDE5 % 0xB79B = 0x164A </span></li><li class=""><span>BN_exp a ^ b </span></li><li class="alt"><span>0xCDE5 ^ 0xB79B = BN_num_bits(c) 737278 too long, not print </span></li><li class=""><span>BN_set_word a: 0x64 </span></li><li class="alt"><span>0x64 is 100 </span></li><li class=""><span>BN_set_negative a: -100 </span></li><li class="alt"><span>BN_generate_prime_ex a: 0xDEA7 </span></li><li class=""><span>0xDEA7 is prime </span></li><li class="alt"><span>0xDEA9 is not prime </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=0x3BBNsuba−b0x1E−0x1D=0x1BNmula∗b0x1E∗0x1D=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