PHP实现RSA算法对数据加密解密

最近在研究RSAPHP中的实现,在百度上一搜,记录倒不少,但点进去一看,老半天也没发现可用的东西,很多都只是直接给出一个RSA类文件的内容,哥不想骂人啊,你说一个方法rsa_encrypt($message,$public_key, $modulus, $keylength),这第一个是要加密的信息,但后面几个呢?啥意思此外这公钥、私钥怎么获取呢?

经过不断地查找资料,参考网上各大神的成果,在此略做总结与大家分享下,当然这里我主要就实现一个简单的演示,也算是入门吧


1、准备工作

Math_BigInteger库,从http://pear.php.net/package/Math_BigInteger/download下载,里面有个叫BigInteger.php的文件,解压出来可直接用。

RSA.php加解密库,网上比较多,也就是上面所说的rsa_encryptrsa_decrypt这些方法的文件。


2、生成RSA密钥对

这里我用到的是Linux系统中的openssl

openssl genrsa -out privatekey.pem 1024

生成了一个1024位的密钥对文件,也应该就是私钥文件,privatekey.pem是生成的密钥文件名,自己指定,至于内容,不是很明确~~

openssl rsa in privatekey.pem -out publickey.pem -pubout

从私钥文件中提取出公钥文件(公钥包含中私钥中)


opensslrsa -in key.pem -noout -modulus

这个是我们等下要用到的参数$modulus把它拷贝出来。

 

openssl rsa -in key.pem -text -noout
把这其中的privateExponent中的内容给拷贝出来分析下

[liujizhong@localhost 01]$ openssl rsa -in aaa.key  -noout -text
Private-Key: (1024 bit)
modulus:
    00:b8:0c:3e:2e:4a:a7:12:cf:dd:02:b7:14:da:6f:
    f8:9b:56:0b:6d:8a:8e:fe:61:0a:f2:2a:5b:6b:05:
    ea:f7:22:35:36:0c:95:21:fe:7a:1b:3e:87:b5:a9:
    97:96:e4:7e:b9:21:9a:79:d4:90:65:47:94:04:67:
    23:b4:ea:fa:33:08:c7:71:02:aa:46:b9:ad:79:2f:
    56:87:57:1b:1b:cc:d5:d8:d9:19:b0:5b:b4:f8:4f:
    13:16:e7:a1:b7:f8:0b:fb:5a:4e:1d:24:52:87:61:
    f1:b7:ae:c1:4e:17:4b:1a:d3:52:d2:3f:eb:d4:f8:
    d0:67:c2:c6:dc:39:49:26:8d
publicExponent: 65537 (0x10001)
privateExponent:
    79:71:3a:a6:79:03:fd:59:c3:4f:c3:56:b3:3c:27:
    22:f8:87:d9:e4:0f:ae:b2:81:f2:81:18:89:6a:02:
    3c:c8:09:ac:7c:68:fb:61:5b:59:16:cd:9d:85:26:
    4d:9e:c0:2f:90:88:c9:d3:04:e4:8f:72:8f:e5:2e:
    9e:76:5e:58:a6:a2:01:b7:31:38:9d:c8:5d:2f:45:
    96:ad:f9:1b:1c:09:4b:1d:4e:9f:18:a0:38:1f:ad:
    39:67:08:82:66:8e:2c:09:53:1e:d3:dc:c1:d3:cb:
    6c:7e:81:33:1b:e5:0f:f2:fe:83:cf:3f:83:74:a7:
    bf:1d:6b:40:ea:e6:d2:01
prime1:
    00:ef:5d:84:ca:89:c1:fe:b8:eb:38:64:91:79:63:
    14:49:d1:b2:4d:bc:23:ac:7f:b8:53:68:59:8b:04:
    50:c6:ec:71:ee:9b:4b:7c:a0:60:1a:28:5e:0a:d3:
    b3:e2:48:4b:ca:c9:9b:25:6c:05:00:8e:5b:88:fd:
    5f:13:fb:0a:21
prime2:
    00:c4:d6:96:16:e9:2e:2f:f3:48:2e:dc:23:d4:ac:
    ae:2f:85:05:17:ea:cb:bf:62:9d:96:ce:bf:fd:1a:
    90:9c:ee:d6:13:12:20:de:8a:50:7a:c8:f2:26:2d:
    f4:34:ea:4d:20:76:22:f7:26:4f:ac:3a:42:2f:42:
    62:0b:24:06:ed
exponent1:
    00:9e:39:6a:42:db:c6:e1:92:e8:e1:b1:10:bc:75:
    b2:fe:8c:df:d9:24:a9:4c:28:6c:f6:ad:7e:ab:37:
    22:12:2c:4f:af:92:f5:d6:1e:c9:07:e1:71:30:a4:
    fa:3e:74:dd:ac:e1:91:6d:ae:36:ac:44:6d:db:62:
    e8:cb:73:61:21
exponent2:
    00:90:36:e8:20:41:17:a5:ea:08:a8:cc:81:34:00:
    90:5e:20:87:6a:ce:8c:18:dc:97:b9:36:21:53:bf:
    72:d4:87:e8:30:70:c7:c4:44:72:52:83:87:66:91:
    a4:aa:60:3f:c1:d8:cc:25:67:dc:57:c3:17:5a:a8:
    b8:4c:91:48:c1
coefficient:
    0e:d5:4f:fc:43:ec:55:36:92:ea:e3:c8:eb:42:b2:
    f0:83:f4:19:8d:01:87:03:53:fa:76:f1:67:ed:48:
    04:b4:67:8c:be:18:83:a1:cd:84:12:12:99:0b:fd:
    46:61:5c:f9:7d:1d:b3:43:ee:5a:65:db:ea:c5:e5:
    a2:ef:b6:73


不难看出这里有上述方法调用用到的参数$modulus$public_keykeylength等。


3、PHP实现加密解密

<?php

require 'BigInteger.php';
require 'RSA.php';

$message= "hello this is the  message to be tested and 汉字可以吗?";

$public_key = 65537;
$keylength = 1024;
//命令openssl rsa  -in key.pem -noout -modulus 得到的内容
$modulus = "B80C3E2E4AA712CFDD02B714DA6FF89B560B6D8A8EFE610AF22A5B6B05EAF72235360C9521FE7A1B3E87B5A99796E47EB9219A79D490654794046723B4EAFA3308C77102AA46B9AD792F5687571B1BCCD5D8D919B05BB4F84F1316E7A1B7F80BFB5A4E1D24528761F1B7AEC14E174B1AD352D23FEBD4F8D067C2C6DC3949268D";
//这个就是上面privateExponent的内容,我们把它COPY出来,去掉中间的“:”号,注意不要换行
$pri = "79713aa67903fd59c34fc356b33c2722f887d9e40faeb281f28118896a023cc809ac7c68fb615b5916cd9d85264d9ec02f9088c9d304e48f728fe52e9e765e58a6a201b731389dc85d2f4596adf91b1c094b1d4e9f18a0381fad39670882668e2c09531ed3dcc1d3cb6c7e81331be50ff2fe83cf3f8374a7bf1d6b40eae6d201";

$modulus_16 = new Math_BigInteger($modulus, 16);
$mend = $modulus_16->toString();

$pri_16 = new Math_BigInteger($pri, 16);
$private_key = $pri_16->toString();

echo "-------------TEST----------------<br>";
//加密
$result = rsa_encrypt($message, $public_key, $mend, $keylength);
echo "原始信息:". $message . '<br />';
echo '加密结果:' . bin2hex($result) . '<br />';
//解密
$de = rsa_decrypt($result, $private_key, $mend, $keylength);
echo '解密结果:' . $de . "<hr />";
//签名
$sig = rsa_sign($message, $private_key, $mend, $keylength);
echo '签名结果:' . bin2hex($sig) . '<br />';
//认证
$ver = rsa_verify($sig, $public_key, $mend, $keylength);
echo '验证结果:' . $ver . '<br />';

?>


4、运行结果




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值