SEEDLAB2.0-RSA Encryption and Signature Lab

本文详细介绍了如何通过RSA算法手动操作BIGNUM API,包括大数运算、私钥获取、消息加密以及证书解析。重点讲解了BN_CTX的使用和关键步骤如BN_mod_exp和BN_mod_inverse的实现。

RSA Public-Key Encryption and Signature Lab
本次实验的目的是对RSA有个手动的实际的体验。

BIGNUM APIs
一些库函数要求临时变量。在重复的子程序调用时,创建BIGNUM所需的动态内存分配是非常昂贵的,一个BN_CTX结构被创建来放置库函数会使用的BIGNUM临时变量。我们需要创建这种结构并将其传递给需要它的函数
BN_CTX *ctx = BN_CTX_new()
初始化一个BIGNUM变量
BIGNUM *a = BN_new()
给BIGNUM变量分配值有如下方法
//分配一个10进制字符值
BN_dec2bin(&a,”1125654765”);
//分类一个16进制数字
BN_hex2bin(&a,”2A2B”);
//生成128位的随机数
BN_rand(a,128,0,0);
//生成128位的随机素数
BN_generate_prime_ex(a,128,1,NULL,NULL,NULL);

打印一个大数
Void printBN(char *msg,BIGBUM *a)
{
//把BIGNUM转为number string
Char *number_str = BN_dn2dec(a);
//打印number string
Printf(“%s %s\n”,msg,number_str);
//释放动态分配的内存
OPENSSL_free(number_str);
}
计算res=a-b和res=a+b;
BN_sub(res,a,b);
BN_add(res,a,b);
计算res=a*b(注意,在这个API中需要BN_CTX结构)
BN_mul(res,a,b,ctx)
计算res=a*b mod n:
BN_mod_mul(res,a,b,n,ctx)
计算res=a^c mod n:
BN_mod_exp(res,a,c,n,ctx)
计算模逆,比如给定a,计算b,使得a*b mod n =1,b则称为a在模n下的逆
BN_mod_inverse(b,a,n,ctx)
一个典型的代码如下
#include <stdio.h>
#include <openss
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值