前端 JavaScript + RSA 加密, 後端 PHP 解密做法

2 篇文章 / 0 new
最新文章
author
前端 JavaScript + RSA 加密, 後端 PHP 解密做法

網路上資料傳送中若有安全顧慮需要保密, 除使用 ssl 外, 就是在Client端先行將資料加密, 然後再後端再解開
以目前較簡易且較佳的加解密方式就是使用 RSA 加密法, 這是目前可以不用擔心 Client 端加秘密鑰被知道後, 會被解密的困擾.
實做的方式如下

Client 端 JS 部分
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 相關函數

$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;
}
有關 key 的產生方式可參考本站 openssl 的相關文章

參考: RSA and ECC in JavaScript
cristina (未確認)
按照博主说的方法,解密失败,请问是什么原因。

我完全按照博主的方法,用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;

 

 

發表回應前,請先登入
Free Web Hosting