C++实践(六):基于RSA与HMAC的数字签名算法及其原理

RSA

RSA算法的步骤如下:

1、选择两个不同的大素数p与q
2、计算n=p*q
3、计算∅(n)=(p-1)(q-1)
4、选择整数e gcd(e, ∅(n))=1 1

基于RSA与HMAC的数字签名算法及其原理

数字签名是一种认证机制,它使得消息的产生者可以添加一个起签名作用的码字。通过计算消息的Hash值并使用产生者的私钥加密Hash值来生成签名。签名保证了消息来源和完整性。
基于RSA的数字签名方法,Hash的输入是要签名的消息,输出是定长的Hash码,用发送方的私钥将该Hash值加密形成签名,然后发送消息及其签名。接收方接收到消息,计算Hash值。接收方用发送方的公钥对签名解密,如果计算出的Hash值与解密出的结果相同,说明签名是有效的。因为只有发送方拥有私钥,所以只有发送方才能产生有效的签名。
本实验的数字签名的Hash算法采用SHA-512。
基于RSA与HMAC的数字签名算法流程如下图所示:
这里写图片描述

RSA测试

大数的表示:用有100个元素的整形数组BigNum[100]表示一个大数,每个int 类型的元素取0-9,表示大数的一位。BigNum[99]表示大数的实际位数,BigNum[98]表示大数的正负。大数保存在数组中时,低位在前,高位在后。
主要函数介绍:
互素测试 int coprime(int e[MAX], int s[MAX]);
素性测试int is_prime_san(int p[MAX]);
生成素数void prime_random(int *p, int *q);
加密函数string encrypt(int e[MAX], int n[MAX], const char* plaintext,uint64_t len);
解密函数string decrypt(int d[MAX], int n[MAX], string ciphertext);
生成密钥 bool generateKey();
明文为plaintext=”abc”,加密之后,打印出大素数p/q、加密密钥e、解密密钥d如图:
这里写图片描述
注意:为便于阅读我们倒序打印,所以得到各变量的值如下:
p=94531 q=985493 e=98549 d=88974652469
n=93159638783
结果符合预期。

基于RSA与HMAC的数字签名算法测试

1、编写类RSA_SIGN_SHA
该类有成员变量RSA mRsa与HMAC mHmac,主要有两个函数:
生成数字签名:
string getSign(const unsigned char *msg, uint64_t msgLen,
const unsigned char *key, uint64_t keyLen);
验证数字签名:
bool verifySign(const unsigned char *msg, uint64_t len,
const string sign, const unsigned char *key, uint64_t keyLen);
根据输入的消息及密钥产生HMAC,用私钥解密数字签名并与HMAC比较,若相同则签名有效,返回true,否则返回false。

2、测试RSA_SIGN_SHA类
测试数据Message=”abc” Key=”abc”
这里写图片描述
解密后的Hash码与用Message生成的相同,验证数字签名有效。测试结果符合预期。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值