rsa数字签名算法c语言实现,RSA算法的C++实现

RSA算法的C++实现

[摘要]公

钥密码体制出现以前,所有的密码算法基本上都是基于代替和置换。而公钥密码体制则是基于新的理论和技术:它突破了传统的代替与置换,是数学函数;它以非对

称的形式提供两个密钥。两个密钥的出现对于保密性、密钥分配、认证等都有划时代的意义。非对称密码体制在加密和解密操作中使用不同的密钥,从而构成不对称

体制。加密密钥可以公开,解密密钥必须保密。其密钥分发简单,可以通过一般的通信渠道分发,需要保密保存的密钥量大大减少,N个人只需N把密钥(线性增

长),可满足互不相识的人之间的私人谈话的保密要求,可以完成数字签名。

[关键词] RSA 加密 模数 明文 密文

1. 概述

前最著名、应用最广泛的公钥系统RSA是在1978年,由美国麻省理工学院(MIT)的Rivest、Shamir和Adleman在题为《获得数字签名

和公开钥密码系统的方法》的论文中提出的。它是一个基于数论的非对称(公开钥)密码体制,是一种分组密码体制。其名称来自于三个发明者的姓名首字母。

它的安全性是基于大整数素因子分解的困难性,而大整数因子分解问题是数学上的著名难题,至今没有有效的方法予以解决,因此可以确保RSA算法的安全性。

RSA系统是公钥系统的最具有典型意义的方法,大多数使用公钥密码进行加密和数字签名的产品和标准使用的都是RSA算法。

RSA算法是第

一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。它通常是先生成一对RSA

密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册,人们用公钥加密文件发送给个人,个人就可以用私钥解密

接受。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。

该算法基于下面的两个事实,这些事实保证了RSA算法的安全有效性:

1) 已有确定一个数是不是质数的快速算法;

2) 尚未找到确定一个合数的质因子的快速算法。

前,日益激增的电子商务和其它因特网应用需求使公钥体系得以普及,这些需求量主要包括对服务器资源的访问控制和对电子商务交易的保护,以及权利保护、个人

隐私、无线交易和内容完整性(如保证新闻报道或股票行情的真实性)等方面。公钥技术发展到今天,在市场上明显的发展趋势就是PKI与操作系统的集

成,PKI是“Public Key

Infrastructure”的缩写,意为“公钥基础设施”。公钥体制广泛地用于CA认证、数字签名和密钥交换等领域。

公钥加密算法中

使用最广的是RSA。RSA算法研制的最初理念与目标是努力使互联网安全可靠,旨在解决DES算法秘密密钥的利用公开信道传输分发的难题。而实际结果不但

很好地解决了这个难题;还可利用RSA来完成对电文的数字签名以抗对电文的否认与抵赖;同时还可以利用数字签名较容易地发现攻击者对电文的非法篡改,以保

护数据信息的完整性。目前为止,很多种加密技术采用了RSA算法,该算法也已经在互联网的许多方面得以广泛应用,包括在安全接口层(SSL)标准(该标准

是网络浏览器建立安全的互联网连接时必须用到的)方面的应用。此外,RSA加密系统还可应用于智能IC卡和网络安全产品。

2. RSA算法的编程思路

1) 确定密钥的宽度。

2) 随机选择两个不同的素数p处q,它们的宽度是密钥宽度的二分之一。

3) 计算出p和q的乘积n 。

4) 在2和Φ(n)之间随机选择一个数e , e 必须和Φ(n)互素,整数e用做加密密钥(其中Φ(n)=(p-1)*(q-1))。

5) 从公式ed ≡ 1 mod Φ(n)中求出解密密钥d 。

6) 得公钥(e ,n ), 私钥 (d , n) 。

7) 公开公钥,但不公开私钥。

8) 将明文P (假设P是一个小于n的整数)加密为密文C,计算方法为:C = Pe mod n    9) 将密文C解密为明文P,计算方法为:

P = Cd mod n    然而只根据n和e(不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密

3. 程序实现

3.1 密钥产生模块流程图

uid-20792262-id-439739.html

key_produce.h //==本程序提供密钥产生的一些基本数学实现

#include

class CKEY_PRODUCE

{

public:

CKEY_PRODUCE();

virtual ~CKEY_PRODUCE();

public:

int JudgePrime(unsigned int prime);//==========判prime是否为素数

//========================================

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言实现RSA算法数字签名的大致流程与C++类似,具体实现可以参考下面的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/rsa.h> #include <openssl/pem.h> #include <openssl/err.h> #include <openssl/md5.h> // 生成RSA密钥对 RSA* generateRSAKey() { RSA *rsa = RSA_new(); BIGNUM *bne = BN_new(); BN_set_word(bne, RSA_F4); RSA_generate_key_ex(rsa, 2048, bne, NULL); return rsa; } // RSA数字签名 bool rsaSign(const char* data, size_t dataLen, RSA* rsa, unsigned char* sig, unsigned int* sigLen) { unsigned char md[MD5_DIGEST_LENGTH]; MD5((unsigned char*)data, dataLen, md); int ret = RSA_sign(NID_md5, md, MD5_DIGEST_LENGTH, sig, sigLen, rsa); return (ret == 1); } // RSA验签 bool rsaVerify(const char* data, size_t dataLen, RSA* rsa, unsigned char* sig, unsigned int sigLen) { unsigned char md[MD5_DIGEST_LENGTH]; MD5((unsigned char*)data, dataLen, md); int ret = RSA_verify(NID_md5, md, MD5_DIGEST_LENGTH, sig, sigLen, rsa); return (ret == 1); } int main() { // 生成RSA密钥对 RSA* rsa = generateRSAKey(); // 要签名的数据 char data[] = "Hello World!"; // RSA数字签名 unsigned char sig[1024]; unsigned int sigLen = 0; rsaSign(data, sizeof(data), rsa, sig, &sigLen); // RSA验签 bool result = rsaVerify(data, sizeof(data), rsa, sig, sigLen); if (result) { printf("RSA verify success!\n"); } else { printf("RSA verify failed!\n"); } RSA_free(rsa); return 0; } ``` 需要注意的是,本示例同样使用了OpenSSL库来实现RSA签名和验签,使用前需要先安装OpenSSL库并链接到项目中。另外,本示例中bool类型需要根据实际情况自行定义或使用stdbool.h头文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值