JS与PHP互通的RSA加解密

引言

        为了更安全地传输密码,我决定采用RSA,在前端通过JS用公钥加密,服务器通过PHP用私钥解密。
PHP端可以使用openssl的RSA加解密,已经非常成熟了。主要的问题是,JS端虽然也能做RSA加解密,但做起来好像都很麻烦。
在网上找到Barrett.js+BigInt.js+RSA.js组合,以及base64.js+rsa.js+rng.js+prng4.js+jsbn.js组合,虽然也能用,但它里面用的16进制密钥,用起来不方便。
最终找到了jsencrypt.js,类似openssl的风格,完美解决!

jsencrypt.js

项目描述:
A Javascript library to perform OpenSSL RSA Encryption, Decryption, and Key Generation.
项目地址:
https://github.com/travist/jsencrypt
使用时只需jsencrypt.js一个文件,够清爽!项目里带有一个sample,我为了测试它与PHP的互通性,在原有基础上改动了一下。

测试实例链接 http://download.csdn.net/detail/bhzsisui/9063957。

加解密测试

demo.html的代码:


  JSEncrypt Example
  
  
  


  















经测试,只能使用公钥加密、私钥解密。不过这正是我需要的!

demo.php的内容:
";
// print_r($pu_key);echo "
"; $data = "This is a test!";//原始数据 $encrypted = ""; $decrypted = ""; openssl_private_encrypt($data,$encrypted,$pi_key);//私钥加密 $encrypted = base64_encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的 openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);//私钥加密的内容通过公钥可用解密出来 openssl_public_encrypt($data,$encrypted2,$pu_key);//公钥加密 $encrypted2 = base64_encode($encrypted2); openssl_private_decrypt(base64_decode($encrypted2),$decrypted2,$pi_key);//私钥解密 ?> JSEncrypt Example





"; echo "private key encrypt by PHP:"."
"; echo $encrypted."
"; echo "public key decrypt by PHP:"."
"; echo $decrypted."
"; echo "---------------------------------------"."
"; echo "public key encrypt by PHP:"."
"; echo $encrypted2."
"; echo "private key decrypt by PHP:"."
"; echo $decrypted2."
"; echo "private key decrypt by JS:"."
"; ?>









经测试,可以让PHP与JS轻松配合,实现公钥加密与私钥解密。
JS端在加解密多于116个字符时超限,但对于密码是够用了。

另外,jsencrypt.js还可以生成密钥对:
var crypt = new JSEncrypt({default_key_size: 1024});
crypt.getKey();
crypt.getPrivateKey();
crypt.getPublicKey();



你可能感兴趣的:(学习笔记,openssl,php,rsa,javascript,加解密)