PHP RSA加解密示例

1.生成密钥和公钥 
开始前需要准备openssl环境  

密钥生成 
openssl genrsa 用于生成rsa私钥文件,生成是可以指定私钥长度和密码保护,具体参数请参考文档。 


  1. openssl genrsa -out rsa_private_key.pem 1024  


-out 指定生成的密钥的文件名,可以随意定义,但是最好为意义的名字,在此生成的密钥文件为 rsa_private_key.pem  
在此生成一个1024长度的密钥,密钥长度越长越安全,但加解密所耗时间亦变长。 
生成的密钥rsa_private_key.pem文件的内容为: 

  1. -----BEGIN RSA PRIVATE KEY-----  

  2. MIICXAIBAAKBgQCxLKt87Xxt+tjZqggwy5xBqd7hMrVNGWxDmEC8N02VLKjydwB8  

  3. fU4OooKgtGpSNHy2o4L1S0AAxyplPQbcoou4Aa4NaiqvSrbfotZHIgoMK3UnfxcD  

  4. xH9f9rJdiD3UTPrh+9sijhjusRc8lWLSOGvHio2/Xj4/yZAZVYQEnWcGfQIDAQAB  

  5. AoGANWU3/Xt5H5AU4Gxs8X+7hNKUGBx3JVg/F5QAFnk4SXffJsuUevAsoR567cHR  

  6. tRqaZ1SZ+CEIlfNwJHii48WdA4QkzoJp8leIHEnDcwlutM7zQBFTLI9keE2Fdi2n  

  7. ArNFu//R7wRk5NNscZst0DV/kksUbP//4TSRePqWiD6cKkECQQDXy7s+TDRrVkVt  

  8. kD4/3ae5H3ExoKcyBwwkhvBAzGjfiZYSfNDHX04Sv4zJf0BT1Gu48kO/AcfSzEKa  

  9. vxbW6ujtAkEA0i7qCXAQsyW1T9xZrFkhw8vXgI2NDaQ7RbKG8OxnzsA6TYjmTy79  

  10. YQF+Q1KQ52F7IABY5JtlIBBoT5XHC3+x0QJATCap6d8MdIBaOcK4JON8Z5iP4lp2  

  11. BfJ0t4Miz0sTCydLXTTMnD6ml3kfHpAYTDze0sIzY/kl4d6Q9njOf4MgNQJAeIQh  

  12. +etiB/bVMcd9O4+YBra5CKMhf/LtcZdePIKxOyGJzK90r26YJqk+hsevAp0ohj7s  

  13. uZhIscv2o7uT+AnuIQJBAKUDl8ZyOPz/75dCVVTMFKhhMQ/AR+uhqu2AEQCzOgU3  

  14. 5/iNjbvKOzHLgXit78jNr7kCOYfb5G4OBTtzo0ZYYaQ=  

  15. -----END RSA PRIVATE KEY-----  



公钥生成 
Rsa命令用于处理RSA密钥、格式转换和打印信息 

  1. openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem  


其中 
-in filename:输入的RSA密钥文件,在此为上面生成的密钥 rsa_private_key.pem。 
-pubout:设置此选项后,保存公钥值到输出文件中。 
-out filename:输出文件,在此我们定义成rsa_public_key.pem 
生成的公钥rsa_public_key.pem文件的内容为: 

  1. -----BEGIN PUBLIC KEY-----  

  2. MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDt8lasjepyr1vq/Q87iNJCv7ge  

  3. QXI2rgAB7lVFS02FxLNwgtqQ1cf+NH6mP88ufxxDVI2oL1RcH48dZPG7MGS4c0YT  

  4. EDOpIeTCZ8fW+AiPYTaq1axtS51LNwXeYIak28L8mEZoQjmn+nb3vfmTAKTUKrzz  

  5. XIDT3R83+lX4xxxQXwIDAQAB  

  6. -----END PUBLIC KEY-----  



2.PHP用RSA加解密 
开始前需要准备php openssl环境,开启PHP openssl扩展,window将php的配置文件php.ini中的 
;extension=php_openssl.dll 
改为 
extension=php_openssl.dll 

代码如下: 

  1. <?php  

  2. /** 

  3. * User: jason 

  4. * Date: 17-10-9 

  5. * Time: 下午21:05 

  6. */  

  7.   

  8. /** 

  9. * 密钥文件的路径 

  10. */  

  11. $privateKeyFilePath = 'rsa_private_key.pem';  

  12. /** 

  13. * 公钥文件的路径 

  14. */  

  15. $publicKeyFilePath = 'rsa_public_key.pem';  

  16.   

  17. extension_loaded('openssl') or die('php需要openssl扩展支持');  

  18.   

  19. (file_exists($privateKeyFilePath) && file_exists($publicKeyFilePath))  

  20. or die('密钥或者公钥的文件路径不正确');  

  21. /** 

  22. * 生成Resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private函数返回false 

  23. */  

  24. $privateKey = openssl_pkey_get_private(file_get_contents($privateKeyFilePath));  

  25. /** 

  26. * 生成Resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public函数返回false 

  27. */  

  28. $publicKey = openssl_pkey_get_public(file_get_contents($publicKeyFilePath));  

  29.   

  30. ($privateKey && $publicKey) or die('密钥或者公钥不可用');  

  31. /** 

  32. * 原数据 

  33. */  

  34. $originalData = '我的帐号是:shiki,密码是:matata';  

  35. /** 

  36. * 加密以后的数据,用于在网路上传输 

  37. */  

  38. $encryptData = '';  

  39.   

  40. echo '原数据为:', $originalData, PHP_EOL;  

  41.   

  42. ///////////////////////////////用私钥加密////////////////////////  

  43. if (openssl_private_encrypt($originalData, $encryptData, $privateKey)) {  

  44.   

  45.     /** 

  46.      * 加密后 可以base64_encode后方便在网址中传输 或者打印  否则打印为乱码 

  47.      */  

  48.     echo '加密成功,加密后数据(base64_encode后)为:', base64_encode($encryptData), PHP_EOL;  

  49.   

  50. else {  

  51.     die('加密失败');  

  52. }  

  53.   

  54.   

  55. ///////////////////////////////用公钥解密////////////////////////  

  56.   

  57. /** 

  58. * 解密以后的数据 

  59. */  

  60. $decryptData ='';  

  61.   

  62. if (openssl_public_decrypt($encryptData, $decryptData, $publicKey)) {  

  63.   

  64.     echo '解密成功,解密后数据为:', $decryptData, PHP_EOL;  

  65.   

  66. else {  

  67.     die('解密成功');  

  68. }  



打印结果: 

  1. 原数据为:我的帐号是:jason,密码是:jason  

  2. 加密成功,加密后数据(base64_encode后)为:(加密数据) 

  3. 解密成功,解密后数据为:我的帐号是:jason,密码是:jason  


公钥加密 openssl_public_encrypt 和私钥解密 openssl_private_decrypt 与上面的过程很类似,可以完成测试。


JasonBlog

JasonBlog
请先登录后发表评论
  • 最新评论
  • 总共0条评论