1. <?php
  2. /**
  3. * RSA加密
  4. *
  5. * @param string $data 待加密数据
  6. * @param string $publicKey 公钥
  7. * @return string|false 加密结果
  8. * @author SC
  9. */
  10. function rsaEncrypt($data, $publicKey)
  11. {
  12. $ciphertext = '';
  13. $publicKey = openssl_pkey_get_public($publicKey);
  14. $data = str_split($data, 117); // 加密的数据长度限制为比密钥长度少11位,如128位的密钥最多加密的数据长度为117
  15. foreach ($data as $d) {
  16. openssl_public_encrypt($d, $crypted, $publicKey); // OPENSSL_PKCS1_PADDING
  17. $ciphertext .= $crypted;
  18. }
  19. openssl_free_key($publicKey);
  20.  
  21. return base64_encode($ciphertext);
  22. }
  23.  
  24. /**
  25. * RSA解密
  26. *
  27. * @param string $data 待解密数据
  28. * @param string $privateKey 私钥
  29. * @param string 解密结果
  30. * @author SC
  31. */
  32. function rsaDecrypt($data, $privateKey)
  33. {
  34. $plaintext = '';
  35. $privateKey = openssl_pkey_get_private($privateKey);
  36. $data = base64_decode($data);
  37. $data = str_split($data, 128);
  38. foreach ($data as $d) {
  39. $r = openssl_private_decrypt($d, $decrypted, $privateKey);
  40. $plaintext .= $decrypted;
  41. }
  42.  
  43. return $plaintext;
  44. }
  45.  
  46. /**
  47. * 生成RSA签名
  48. *
  49. * @param string $data 待签名数据
  50. * @param string $privateKey 私钥
  51. * @return string 签名
  52. * @author SC
  53. */
  54. function rsaSign($data, $privateKey)
  55. {
  56. $privateKey = openssl_get_privatekey($privateKey);
  57. openssl_sign($data, $sign, $privateKey, OPENSSL_ALGO_MD5); // OPENSSL_ALGO_MD5 or OPENSSL_ALGO_SHA1(default)
  58. openssl_free_key($privateKey);
  59.  
  60. return base64_encode($sign);
  61. }
  62.  
  63. /**
  64. * 检验RSA签名
  65. *
  66. * @param string $data 待签名数据
  67. * @param string $sign 待验证签名
  68. * @param string $publicKey 公钥
  69. * @return bool 检验结果
  70. * @author SC
  71. */
  72. function rsaVerify($data, $sign, $publicKey)
  73. {
  74. $publicKey = openssl_get_publickey($publicKey);
  75. $result = openssl_verify($data, base64_decode($sign), $publicKey, OPENSSL_ALGO_MD5); // OPENSSL_ALGO_MD5 or OPENSSL_ALGO_SHA1(default)
  76. openssl_free_key($publicKey);
  77.  
  78. return ($result == 1) ? true : false; // -1:错误;0:签名错误;1:签名正确
  79. }
  80.  
  81. $pubKey = '-----BEGIN PUBLIC KEY-----
  82. MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsvvkZ0EYjDcmYsRbcdEugUybF
  83. YGM3WKZfmZQaU+jHIk0UTw2I9kDHC2wmYcIAA3fqCeJ71WvdiqJNXByUYgsKGuLC
  84. SYUP9wqOGze0U9hNb/M8E1JHlKbo3v0oAsp8awXl7QDRsOhibJUjIdf3Gt/qwh1R
  85. mAtYSWHi/BLfzC6nfQIDAQAB
  86. -----END PUBLIC KEY-----';
  87. $a = rsaEncrypt(123, $pubKey);
  88.  
  89. $priKey = '-----BEGIN PRIVATE KEY-----
  90. MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKy++RnQRiMNyZix
  91. Ftx0S6BTJsVgYzdYpl+ZlBpT6MciTRRPDYj2QMcLbCZhwgADd+oJ4nvVa92Kok1c
  92. HJRiCwoa4sJJhQ/3Co4bN7RT2E1v8zwTUkeUpuje/SgCynxrBeXtANGw6GJslSMh
  93. 1/ca3+rCHVGYC1hJYeL8Et/MLqd9AgMBAAECgYBJvO9KJIx71BvU0OsISaAqnLP1
  94. FtLjQjUqo70DjAPWVP8AB0qoxy0ZifetXpdYOCLMxVFnOM/lbpMfYI1WjY9WGmDQ
  95. C0UMpOEuk/bhqAJMIN79WpEqWvJQYFzRWw3O63SwbU3mcYgqssULk6VXhhTuCuNI
  96. gc9D/xNyj3CsfKLgRQJBANNsErsLNeM07lOaeTRXC+OYZmz9TOIgXRliYH+r52rF
  97. QTYGY6zfs1SgDPIZZZ+1nCA6ifkFlm4xnhptlWTZTzsCQQDRK0cGCt52Iusu0LV9
  98. 2jiY1fNP8QX4bJThT+iAuGuSZeOgzWQE1Wic6j1Rsgn6XELwY7kpZbLKXWoXLVJC
  99. 9GinAkA1J53J8vaYai1lTZgdhakSjrVpv4F99L8Ta71xO+oR2QgdKhwTUabHpvm6
  100. QJJhRgq7u5wGxNXeXJEwec6urUgTAkAstHo2kWYgi7AGTncr0dMc30VkhZgIE3Ty
  101. fvirYj8jiAFRofRJkC8OsoWui0XUq5lm9XlinqjK1ZJSJ86YHtKrAkBnB6+fO1/h
  102. j1Jm7L5miQVDYE4VRlVK/oAWTlceVn7a6HUQOTQUlHAiKGxuhzB7jIyLoQWLXHyG
  103. vpZ0T54nyQqu
  104. -----END PRIVATE KEY-----';
  105. $b = rsaDecrypt($a, $priKey);
  106. echo $b;
  107.  
  108. $c = rsaSign(333, $priKey);
  109. // echo $c;
  110. echo '<pr>';
  111. var_dump(rsaVerify(333, $c, $pubKey));

php 验证rsa公钥和私钥是否正确的更多相关文章

  1. rsa公钥和私钥到底哪个才是用来加密,哪个用来解密?

    本文转自:91博客:原文地址:http://www.9191boke.com/138589019.html 公钥和私钥在一些银行系统.第三方支付系统SDK中经常会遇到,刚接触公钥私钥的朋友们估计很难区 ...

  2. c#生成rsa公钥和私钥

    c#生成rsa公钥和私钥的类库,包括加密解密,可以用在网站和winform项目 源码地址: http://download.csdn.net/detail/jine515073/8383809

  3. Windows 下使用OpenSSL生成RSA公钥和私钥

    Windows 下使用OpenSSL生成RSA公钥和私钥 (1)下载OpenSSL 可到该地址下载OpenSSL: https://www.openssl.org/source/(https://ww ...

  4. RSA公钥,私钥和数字签名通用理解

    一.公钥加密 假设一下,我找了两个数字,一个是1,一个是2.我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥. 我有一个文件,不能让别人看,我就用1加密了.别人找到了这个 ...

  5. 如何使用openssl生成RSA公钥和私钥对

      在ubuntu上要使用openssl的话需要先进行安装,命令如下: sudo apt-get install openssl 安装完成就可以使用openssl了. 首先需要进入openssl的交互 ...

  6. 把Java生成的RSA公钥、私钥转换成.NET使用的XML格式

    import java.security.KeyFactory; import java.security.interfaces.RSAPrivateCrtKey; import java.secur ...

  7. 在Linux下如何使用openssl生成RSA公钥和私钥对

    在<Java实现RSA密钥对并在加解密.加签验签中应用的实例>中,我们有用Java代码生成RSA密钥对,其实在Linux操作系统中,用openssl也是很容易生成密钥对的. 一.如果在ub ...

  8. openssl生成RSA公钥和私钥对

    在ubuntu上要使用openssl的话需要先进行安装,命令如下: sudo apt-get install openssl 安装完成就可以使用openssl了. 首先需要进入openssl的交互界面 ...

  9. 使用openssl生成RSA公钥和私钥对

    在ubuntu上要使用openssl的话需要先进行安装,命令如下: sudo apt-get install openssl 安装完成就可以使用openssl了. 首先需要进入openssl的交互界面 ...

随机推荐

  1. LINUX系统的常用知识

    常用的命令: man config   查看linux里面所有命令的详细描述 man pwd   按回车是一行一行的走,按空格是一页一页的走,按q键是退出的意思 mkdir test   创建文件夹p ...

  2. LightOJ - 1170 - Counting Perfect BST(卡特兰数)

    链接: https://vjudge.net/problem/LightOJ-1170 题意: BST is the acronym for Binary Search Tree. A BST is ...

  3. log4j+junit+maven

    本文在开发第一个maven示例的基础上进行扩展. 日志级别测试 在src\main\resources文件夹下新建log4j.properties log4j.rootLogger = warn,st ...

  4. Oracle substr() 字符截取函数

    1.substr函数格式   (俗称:字符截取函数) 格式1: substr(string string, int a, int b); 格式2:substr(string string, int a ...

  5. linux学习5 Linux开篇入门和基本操作

    一.完整的操作系统 1.GNU系统:表示GNU is Not Unix.表示不做商业化.制定了GPL(General Public License)即任何软件程序只要遵循GPL协议就是自由软件.还制定 ...

  6. centos7.3 安装 mysql-5.7.13

    系统环境: [root@localhost ~]# cat /etc/RedHat-release CentOS release 6.7 (Final)[root@localhost tools]# ...

  7. HTML5自定义属性操作

    一.自定义属性(html5标准)data-属性名称="属性值" 自定义属性的名称驼峰式命名规则需要用-隔开 自定义属性名称如果连在一起写,大写会自动转为小写 data-user=& ...

  8. 常见的 eslint 基本报错信息

    Missing semicolon 缺少分号 Missing space before opening brace 左大括号前缺少空格 Trailing spaces not allowed 不允许尾 ...

  9. 前端项目, 每次运行都需要输入 sudo 的解决方法

    前端项目, 每次运行都需要输入 sudo 的解决方法 node一直提示的sudo问题根本原因为: node 的所有者, 项目的所有者, 不同; 解决方法为: 将项目的所有者更改为 chown -R ` ...

  10. segfault at 0 ip sp error 14

    error 14从未见过.谁能帮我解答什么情况才会出现这个,而且怎么定位崩溃函数地址? 备忘: segfault at 引起故障的地址ip 指令的内存地址sp 堆栈指针地址, 及栈顶指针err is ...