欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

RSA实现JS前端加密与PHP后端解密功能示例

程序员文章站 2023-09-08 09:15:51
本文实例讲述了rsa实现js前端加密与php后端解密功能。分享给大家供大家参考,具体如下: web前端,用户注册与登录,不能直接以明文形式提交用户密码,容易被截获,这时就...

本文实例讲述了rsa实现js前端加密与php后端解密功能。分享给大家供大家参考,具体如下:

web前端,用户注册与登录,不能直接以明文形式提交用户密码,容易被截获,这时就引入rsa。

前端加密

需引入4个js扩展文件,jsbn.js、prng4.js、rng.js和rsa.js。

<html>
<head>
  <title>rsa login test</title>
  <meta charset="utf-8">
  <script type="text/javascript" src="./js/jsbn.js"></script>
  <script type="text/javascript" src="./js/prng4.js"></script>
  <script type="text/javascript" src="./js/rng.js"></script>
  <script type="text/javascript" src="./js/rsa.js"></script>
  <script src="//cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
  <script type="text/javascript">
    function cmdencrypt() {
      var passwd = $('#passwd').val();
      var rsa = new rsakey();
//openssl生成的modulus,十六进制数据
      var modulus = "db1ea572b55f5d9c8adf092f5dcc3559cfea8ce8bb54e3a71da9b1afbd7d17cf80adb224fe4ea5379bc782f41c137748d8f1b5a36ad62a127ef5e87efb25c209a66bcee9925ce09631bf2271e81123e93438646625080ff04f4f2cf532b077e3e390486df40e7586f0ae522c873f33170222f46bdb6084f55de6b7031e55dbe7";
      //openssl生成秘钥时的e的值(0x10001)
var exponent = "10001";
      rsa.setpublic(modulus, exponent);
      var res = rsa.encrypt(passwd);
      $('#passwd').val(res);
    }
  </script>
</head>
<body>
<form action="./login.php" method="post" >
  <label for="username">用户名:</label><input type="text" name="username" id="username">
  <label for="passwd">密 码:</label><input type="password" name="password" id="passwd">
  <input type="submit" value="登录" onclick="cmdencrypt();">
</form>
</body>
</html>

前端代码十分简单,只有短短的几行,下面分别解释具体的含义:

  • 1.new一个rsakey对象,
  • 2.定义modulus(模数),我们可以根据私钥计算出该值(十六进制),具体指令: rsa -in rsa_private_key.pem -noout -modulus 
  • 3.定义exponent,此值在openssl生成秘钥时,输出,一般情况下e的取值是一个定值10001(十六进制)
  • 4.设置公钥
  • 5.加密数据

至此,我们就完成了前端的公钥加密。

后端解密

//私钥
$private_key = "-----begin rsa private key-----
miicxaibaakbgqdicrxl+elhqfe0xcga3/xdn1vxwuc5kxakb5f3f28hy40zdxbn
uwpdqnknhwtnvhzupbrhlypqx+1plti81sradtyknwvolrlwwp3mziyrrvo0hf3c
vxn33r4a5y1yuh+txvfgikbmmnsjp4pp3cizc0tedmt1+h17cv6s6kddoqidaqab
aogadu2/nqkdikvcc7+dn65yycyklovw34jqsxom++8nqfnsucktpzn60hraipet
fu/l7x2jpqhp9+wuf1puyvjazqb5e9n8g12nxdubs5ux085inowp69pxnsljhyip
mprgpf7zsgglftvxlg+hrufzxj26nqekwn61mi+cjmsmt/ecqqdpg868peijed/g
pumtt7grgdadmpj0+aln82zsfa84zda8po9erefxrm2mar/fuvxl/vc0fbrygaa/
vainkj6takea203jdovtnfg87znl9z0/z3kuxcmry+7m28+7btf1eadzxjwvfwtx
cv4ejhjdn6clht6atuamw0snlta9n4cgpqjasbltxitubhv5u5htniq5thwzrzoy
yldfpo7zi89on+a7yg4cebyi/ft9z6ysh7cvk1rg6wqfuyn4a3wj0ldlzqjbaijr
pq0trbll25toxtaiki9jreduuga/mc1gu+albdhc+htzaxpvy0rlj2hgf9l6nf1d
sw4rewqssfbnkcrkc+0cqclxcpv2wwsgmfhltqpkeyspievy4nrthv8zeyvm7muu
gvlsj6sqvcuuqbvholrpqqidi8tpaemhzs9fhdjvuuc=
-----end rsa private key-----";
$hex_encrypt_data = trim($_post['password']); //十六进制数据
$encrypt_data = pack("h*", $hex_encrypt_data); //对十六进制数据进行转换
openssl_private_decrypt($encrypt_data, $decrypt_data, $private_key); //解密数据
echo '解密后的数据:' . $decrypt_data;

openssl操作截图:

RSA实现JS前端加密与PHP后端解密功能示例

需要注意的是:前端加密的时候如果是中文,则解密后是乱码。

openssl工具和完整demo,详见:https://github.com/cqingt/rsa_js_php

ps:关于加密解密感兴趣的朋友还可以参考本站在线工具:

在线rsa加密/解密工具:

文字在线加密解密工具(包含aes、des、rc4等):

在线散列/哈希算法加密工具:

在线md5/hash/sha-1/sha-2/sha-256/sha-512/sha-3/ripemd-160加密工具:

在线sha1/sha224/sha256/sha384/sha512加密工具: