最近涉及到一个项目,其中的业务中有一个支付业务,开始考虑了很多种加密验证的办法,RC4,普通的MD5验证,最后敲定为RSA。
因为项目是PHP代码实现的,因此,服务端就需要用PHP来处理密文的处理。消费端则为JAVA等其他语言。这样就出现了RSA算法中各种语言互通的问题。
找了很多PHP关于RSA的类库。其中有PEAR库中的http://pear.php.net/package/Crypt_RSA,结果发现速度很慢,1024bits的加密解密过程需要很长的时间。不得已采用了PHP的openssl扩展来完成业务需求。
简单介绍一下RSA的算法流程。
RSA(Rivest-Shamir-Adleman)算法是基于大数不可能被质因数分解假设的公钥体系。简单地说就是找两个很大的质数。一个用来做对外公开的公钥(Public key),另一个不告诉任何人,称为私钥(Private key)。
RSA体制的密钥生成可以简单描述如下:
(1)选择两个大素数p和q(p≠q)。(一般为100位以上的十进制数)
(2)计算出n=p*q及φ(n)=(p-1)(q-1) ,这里φ(n)是Euler函数。
(3)选择一个随机整数e(加密密钥),且满足1
(5)明文为a ,对每一个密钥k=(n,p,q,d,e),定义加密变换为:Ek(a)= aemod n = c,定义解密变换为:Dk(c)= cd mod n = a。
(6)公布整数n和加密密钥e。以{e,n}作为公开密钥,以{d,n}作为私有密钥。

由上图可以看出。
一般业务中使用流程:首先生产密钥对,私钥和公钥。私钥作为服务端,作为解密只用,公钥发往消费端,作为数据加密只用。每次消费端用公钥加密信息后,提交服务端用私钥解密,得到密文信息。
Continue reading





