RSA算法和RSA数字签名算法的实现

RSA算法和RSA数字签名算法的实现
RSA算法和RSA数字签名算法的实现

RSA算法和RSA数字签名算法的实现

RSA算法和RSA数字签名算法的实现

摘要 RSA算法是一种公钥密码算法.实现RSA算法包括生成RSA密钥,

用RSA加密规则和解密规则处理数据。RSA数字签名算法利用RSA算法实现数字签名。本文详述了RSA算法的基本原理, RSA加密算法的实现以及如何利用RSA实现数字签名.

关键字 RSA算法, 数字签名, 公开密钥, 私人密钥, 加密, 解密

中图分类号 TP301

一、引言

随着网络技术的飞速发展,信息安全性已成为亟待解决的问题。公钥密码体制中,解密和加密密钥不同,解密和加密可分离,通信双方无须事先交换密钥就可建立起保密通信,较好地解决了传统密码体制在网络通信中出现的问题。另外,随着电子商务的发展,网络上资金的电子交换日益频繁,如何防止信息的伪造和欺骗也成为非常重要的问题。数字签名可以起到身份认证、核准数据完整性的作用。目前关于数字签名的研究主要集中基于公钥密码体制的数字签名。

公钥密码体制的特点是:为每个用户产生一对密钥(PK和SK);PK公开,SK保密;从PK推出SK是很困难的;A、B双方通信时,A通过任何途径取得B的公钥,用B的公钥加密信息。加密后的信息可通过任何不安全信道发送。B收到密文信息后,用自己私钥解密恢复出明文。

公钥密码体制已成为确保信息的安全性的关键技术。RSA公钥密码体制到目前为止还是一种认可为安全的体制。本文详述了RSA算法和用RSA算法实现数字签名的理论,以及它们在实际应用中的实现。

二、RSA算法和RSA数字签名算法的理论描述

1 RSA算法

RSA算法的理论基础是一种特殊的可逆模幂运算。

设n是两个不同奇素数p和q的积,即:n=pq, ?(n)=(p-1)(q-1)。

定义密钥空间 k={(n,p,q,d,e)|n=pq,p和q是素数,de≡1 mod ?(n),e 为随机整数},

对每一个k=(n,p,q,d,e),

定义加密变换为E k(x)=x b mod n,x∈Z n;

解密变换为D k(x)=y a mod n,y∈Z n,Z n为整数集合。

公开n和b,保密p,q和a.

为证明加密变换E k和解密变换 D k满足D k(E k(x))=x,这里不加证明的引用下面两个定理:

定理1(Euler)对任意的a∈Z

n

*,有a?(n)≡1 mod n,其中

Z

n *={x∈Z

n

|gcd(x,n)=1},?(·)表示Euler函数。

定理2 设p和q是两个不同的素数,n=pq, ?(n)=(p-1)(q-1),对任意的x∈Z

n 及任意的非负整数k,有 x k?(n)+1≡x mod n.

现在来证明RSA算法的加密变换和解密变换的正确性。

证明:对于加密变换E k和解密变换D k。因为ab≡1 mod ?(n),所以可设

ab=t?(n)+1,t是整数且t≥1。对于任意的x∈Z

n

,有D k(E k(x))≡D k(x b) ≡(x b)a≡x t?(n)+1≡x mod n.因此解密过程是正确的。

2 RSA数字签名算法

RSA数字签名算法的过程为:A对明文m用解密变换作: s≡D k(m)=m d mod n,其中d,n为A的私人密钥,只有A才知道它;B收到A的签名后,用A的公钥和加密变换得到明文,因:E k(s)=E k(D k(m))= (m d)e mod n,又 de≡1 mod ?(n)即de=l?(n)+1,根据欧拉定理m?(n)=1 mod n,所以E k(s)=m l?(n)+1=[m?(n)]e m=m mod n。若明文m和签名s一起送给用户B,B可以确信信息确实是A发送的。同时A也不能否认送给这个信息,因为除了A本人外,其他任何人都无法由明文m 产生s.因此RSA数字签名方案是可行的。

但是RSA数字签名算法存在着因计算方法本身同构造成签名易被伪造和计算时间长的弱点,因此实际对文件签名前,需要对消息做MD5变换。

MD5函数是一种单向散列函数,它将任意长度的消息压缩成128位的消息摘要。应用MD5的单向性(即给定散列值,计算消息很难)和抗碰撞性(即给定消息M,要找到另一消息M’并满足两者的散列值很难),可以实现信息的完整性检验。另外该函数的设计不基于任何假设和密码体制而直接构造,执行的速度快,是一种被广泛认可的单向散列算法。

三、RSA算法的实现

RSA算法的实现分为:生成密钥,加密,解密。

1 数据结构

RSA密码系统的安全性依赖于大数分解的难度,一般建议用户选择的素数p和q至少为100位,则n=pq是至少为200位的十进制数。因此实现RSA算法有必要定义大数的数据结构如图一所示。

密钥生成,加密和解密涉及到一些大数的基本运算。定义大数的基本运算库,包括加、减、乘、除、取模运算等,其中最重要的模乘运算和模幂运算。

模幂算法是加密解密的核心算法。计算模幂的一种有效算法是“平方-乘”方法,通过对指数的二进制化来实现。8

过程如图1:

Procedure modmult

begin typedef struct

{

unsigned long int bn[MAX_LENGTH];

unsigned int size; }BigNum

图2大数的数据结构

Z=1 for i=l-1 downto 0 do: begin Z=Z 2 mod n; if b i =1 then Z=Z*x mod n; end end 图一 2 密钥的生成 2.1 RSA 公钥和私钥的结构定义

根据文档PKCS#1定义RSA 公钥和私钥分别如图2和图3。理论上讲,RSA 私钥只需包括解密模数和解密指数。但是为加快RSA 解密计算的效率,采用中国剩余定理算法,因此RSA 私钥包含

p,q,d mod (p-1),d mod (q-1),q -1 mod p,其中p,q 为大素数, d mod (p-1), d

mod (q-1),q -1 mod p 由计算过程生成。

2.2 生成密钥步骤

生成RSA 密钥需完成下列步骤: (1) 选择e 的值为3或者25537; (2) 随机生成大素数p ,直到gcd (e,p-1)=1; 其中gcd(a,b)表示a,b 取最大公约数 (3) 随机生成不同于p 的大素数q ,直到 gcd (e,q-1)=1; (4) 计算n=pq , ?(n)=(p-1)(q-1); (5) 计算d,满足de ≡1 (mod ?(n)); (6) 计算 d mod (p-1), d mod (q-1); (7) 计算q -1 mod p; (8) 将n,e 放入RSA 公钥;将n,e,d mod (p-1),d mod (q-1) q -1 mod p 放入RSA 私钥。 随机素数的产生可分为两个模块: 2.2.1 随机数的产生

随机数不仅用于密钥生成,也用作公钥加密时的填充字符。它必须具有足

够的随机性,以防止破译者掌握随机数的规律性后重现密钥的配制过程或者探

测到加密块中的明文。因为在计算机上不可能产生真正的随机数,实际采用周

期大于2256位的伪随机序列发生器。

实现过程为:

(1) 记录相邻两次敲击键盘的时间间隔,直到不再需要随机事件。

(2) 做MD5计算,直到不再需要伪随机数。

相关主题
相关文档
最新文档