Javascript 到 PHP 加密通讯的简单实现

对于大多数网站来说,大部分数据往往没必要搞这么严密,可以选择性地只针对某些重要的小数据进行加密,例如密码。对于小数据量加密来说,可以没必要使用整个流程,只使用RSA即可,这样将大大简化流程。

为什么是小数据量?因为相对于对称加密来说,非对称加密算法随着数据量的增加,加密过程将变的巨慢无比。所以实际数据加密一般都会选用对称加密算法。因此PHP中的openssl扩展公私钥加密函数也只支持小数据(加密时117字节,解密时128字节)。

网上已有一些AES、RSA的开源Javascript算法库,在PHP中更可直接通过相关扩展来实现(AES算法可以通过mcrypt的相关函数来实现,RSA则可通过openssl的相关函数实现),而不用像网上说的用纯PHP代码实现算法。由于篇幅所限,本文只介绍Javascript和PHP的RSA加密通讯实现,拿密码加密为例。

$(document).ready(function(){ 

//十六进制公钥 

var rsa_n = "C34E069415AC02FC4EA5F45779B7568506713E9210789D527BB89EE462662A1D0E94285E1A764F111D553ADD7C65673161E69298A8BE2212DF8016787E2F4859CD599516880D79EE5130FC5F8B7F69476938557CD3B8A79A612F1DDACCADAA5B6953ECC4716091E7C5E9F045B28004D33548EC89ED5C6B2C64D6C3697C5B9DD3";

     

$("#submit").click(function(){ 

    setMaxDigits(131); //131 => n的十六进制位数/2+3 

    var key = new RSAKeyPair("10001", '', rsa_n); //10001 => e的十六进制 

    var password = $("#password").val(); 

    password = encryptedString(key, password);//美中不足,不支持汉字~ 

    $("#password").val(password); 

    $("#login").submit(); 

}); 

});

/**

 * 私钥解密

 *

 * @param string 密文(base64编码)

 * @param string 密钥文件(.pem)

 * @param string 密文是否来源于JS的RSA加密

 * @return string 明文

 */ 

function privatekey_decodeing($crypttext, $fileName,$fromjs = FALSE)

{ 

    $key_content = file_get_contents($fileName); 

    $prikeyid    = openssl_get_privatekey($key_content); 

    $crypttext   = base64_decode($crypttext); 

    $padding = $fromjs ? OPENSSL_NO_PADDING : OPENSSL_PKCS1_PADDING;

    if (openssl_private_decrypt($crypttext, $sourcestr, $prikeyid, $padding)) 

    { 

        return $fromjs ? rtrim(strrev($sourcestr), "/0") : "".$sourcestr; 

    } 

    return FALSE; 

}

/**

 * 私钥解密

 *

 * @param string 密文(base64编码)

 * @param string 密钥文件(.pem)

 * @param string 密文是否来源于JS的RSA加密

 * @return string 明文

 */ 

function privatekey_decodeing($crypttext, $fileName,$fromjs = FALSE)

{ 

    $key_content = file_get_contents($fileName); 

    $prikeyid    = openssl_get_privatekey($key_content); 

    $crypttext   = base64_decode($crypttext); 

    $padding = $fromjs ? OPENSSL_NO_PADDING : OPENSSL_PKCS1_PADDING;

    if (openssl_private_decrypt($crypttext, $sourcestr, $prikeyid, $padding)) 

    { 

        return $fromjs ? rtrim(strrev($sourcestr), "/0") : "".$sourcestr; 

    } 

    return FALSE; 

}

define("CRT", "ssl/server.crt"); //公钥文件

define("PEM", "ssl/server.pem"); //私钥文件

//JS->PHP 测试

$data = $_POST['password']; 

$txt_en = base64_encode(pack("H*", $data)); //转成base64格式

$txt_de = privatekey_decodeing($txt_en, PEM, TRUE); 

var_dump($txt_de); 

//PHP->PHP 测试 

$data = "测试TEST"; //PHP端支持汉字:D

$txt_en = publickey_encodeing($data, CRT); 

$txt_de = privatekey_decodeing($txt_en, PEM); 

var_dump($txt_de);


获取公钥十六进制

openssl asn1parse -out temp.ans -i -inform PEM < server.pem

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值