網路上資料傳送中若有安全顧慮需要保密, 除使用 ssl 外, 就是在Client端先行將資料加密, 然後再後端再解開
以目前較簡易且較佳的加解密方式就是使用 RSA 加密法, 這是目前可以不用擔心 Client 端加秘密鑰被知道後, 會被解密的困擾.
實做的方式如下
publicKey = "00b0c2732193eeb......"; keyLen = "10001"; var rsa = new RSAKey(); rsa.setPublic(publicKey, keyLen); var ciphertext = rsa.encrypt("原文"); //ciphertext 密文
需引入的相關 JS 檔有 jsbn.js,prng4.js,rng.js,rsa.js 可至 RSA and ECC in JavaScript 下載(該網站也有範例可直接操作)
Server端 解碼, 直接使用 openssl 相關函數
有關 key 的產生方式可參考本站 openssl 的相關文章$str = convert($_POST['ciphertext']); $privateKey = openssl_get_privatekey(file_get_contents('key.pem')); openssl_private_decrypt($str, $newsource, $privateKey); print "$newsource"; function convert($hexString) { $hexLenght = strlen($hexString); unset($binString); for ($x = 1; $x <= $hexLenght / 2; $x++) { $binString .= chr(hexdec(substr($hexString, 2 * $x - 2, 2))); } return $binString; }
參考: RSA and ECC in JavaScript
我完全按照博主的方法,用rsa.encrypt函数加密,是用公钥加密的,然后php解密,openssl_get_privatekey成功,但是就是不能解密,不知道什么原因。
下面是加密过程:
var publickey="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDeqjKboP4kOcebp23YKOsjND2pPcARinmMXTgBOpHTRYIeW6GYYvKdhLocl5/IrnVFYeNXomRKgVXl3OfeeLJfpcv4A/Hv0G5BxbwYaX/5ecFyvPWYyDknJTV+8MF95e804NhWtsTnlqQJDvl54Ay6SElon7K66xbLZR3CJ6bMPwIDAQAB";
var text="123";
var rsa=new RSAKey();
rsa.setPublic(publickey,"10001");
var m=rsa.encrypt(text);
解密过程:
function convert($hexString) {
$hexLenght = strlen($hexString);
$binString="";
for ($x = 1; $x <= $hexLenght / 2; $x++) {
$binString .= chr(hexdec(substr($hexString, 2 * $x - 2, 2)));
}
return $binString;
}
$Data=file_get_contents("php://input");
$str=convert($Data);
$privateKey = openssl_get_privatekey(file_get_contents('private1.pem'));
openssl_private_decrypt($str, $newsource, $privateKey);
echo $newsource;