SM2算法第二十三篇:openssl库中BIGNUM的使用
来源:互联网 发布:js在线解析 编辑:程序博客网 时间:2024/04/27 22:17
出处: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;
- }
0 0
- SM2算法第二十三篇:openssl库中BIGNUM的使用
- SM2算法第二十六篇:openSSL 中BIGNUM的使用记录
- openssl库中BIGNUM的使用
- SM2算法第二十七篇: openssl库中的BIGNUM(超赞)
- openSSL 中BIGNUM的使用记录(二)——BIGNUM的使用
- SM2算法第二十四篇:谈谈PBOC3.0中使用的国密SM2算法
- openssl库中的BIGNUM
- openssl库中的BIGNUM
- 用openssl实现sm2算法文档中示例,包含sm3
- openssl BIGNUM
- 谈谈PBOC3.0中使用的国密SM2算法
- 谈谈PBOC3.0中使用的国密SM2算法
- PBOC3.0中使用的国密SM2算法
- 谈谈PBOC3.0中使用的国密SM2算法
- SM2算法第七篇:Windows下Openssl安装与配置
- SM2算法第四篇:基于Openssl实现SM2秘钥协商协议
- openssl库中MD算法的使用
- 关于openssl BIGNUM
- 网络专业名词
- servlet中文乱码
- forwar 标签
- <DFS> POJ 2034 Anti-prime Sequences
- 逆--Win7x64 UserTimer结构获取,NtUserSetTimer,_SetTimer,InternalSetTimer 枚举进程定时器
- SM2算法第二十三篇:openssl库中BIGNUM的使用
- 新版mysql5.7.12在win7系统下成功安装小结
- Android基础之注解和XML心得
- UML实践详细经典教程----用例图、顺序图、状态图、类图、包图、协作图
- 冒泡排序
- C++学习基础篇 —— 引用(&)的用法和应用
- error: ‘to_string’ is not a member of ‘std’———已解决
- 聊聊前端,JavaScript
- 操作短息数据库权限被禁用,自行开启。其他的权限一样的