php js 的rsa加密

js使用公钥对信息进行加密传输,php使用私钥解密获取信息

js rsa相关信息:

js使用16进制公钥进行加密,生成16进制加密数据,hex_string

http://www-cs-students.stanford.edu/~tjw/jsbn/

注意:js需要先对数据做url编码处理,如 encodeURIComponent(text) 再将数据传输给php

php rsa相关信息(需要openssl扩展):

php解密前需要转换成2进制数据 pack("H*", $hex_string)

http://cn.php.net/manual/zh/book.openssl.php

http://cn.php.net/manual/zh/function.openssl-private-decrypt.php

密钥生成
生成私钥
openssl genrsa -out key.pem 1024
DES3方式加密私钥
openssl rsa -in key.pem -des3 -out prikey.des3.pem
生成公钥
openssl rsa -in key.pem -pubout -out pubkey.pem
生成16进制密钥
openssl asn1parse -i -inform PEM < key.pem

0:d=0  hl=4 l= 604 cons: SEQUENCE

4:d=1  hl=2 l=   1 prim:  INTEGER           :00

7:d=1  hl=3 l= 129 prim:  INTEGER           :CC3D43A99398674AC09F0FF240833BBA9C1778EF54B98620CA6441915513F0BA264CED88700898BA5316E85DBE61780770E10C4B5B2F19B2356A1E3941B168A7AAEAE48F48A9F4BC3D7BB5281CF590993B77AB87327AB3F102F96CACC6098909A2745EAFB7198B3A0FF075228EB3C5E4CDB6B7A085FE5F2307988E7FE852D197(十六进制公钥)

139:d=1  hl=2 l=   3 prim:  INTEGER           :010001

144:d=1  hl=3 l= 128 prim:  INTEGER           :52DFD531DD3B2D46AEEC9C4ADF94A0CAF305AF43E62C35D9DE665A18BFDE0C836C8130AD795073B0BF807F1F72DE181764DD5CE0C30A54B1F46CB000E9C034478342CB00EDBECCCBC1ED63C29046CB5278AAEA0B0BA2976D37E04978CD65E856D6FEF644D2BD9AB008DA83934F8C227191CC6C8E4E9A1189E23F14A64DE5FC79(私钥)

275:d=1  hl=2 l=  65 prim:  INTEGER           :E8310AA5191EF2561C3BCA025E880B87B7A351A15C80F659C6F2C57017F7EE559038E174813BBA504D616A1502D2A5213157458DAB1BFF00FA1B929CD45395FD

342:d=1  hl=2 l=  65 prim:  INTEGER           :E12E7C078048AAD4805E5ED71D0DC4977D051083C0EA82BEC71150F181D3E67EFA3259DB0A686CDE0EF829548A95CCCB4F4D695D3A82E0DC3BAAD61E41D39023

409:d=1  hl=2 l=  64 prim:  INTEGER           :1C98458E558CA91D8FB691473F6B13B870162DEC685EFD77CAF784F72C0C7D8E8E0763449CD1C53D347A65BD16AEE8653115655C70112F936839D3117B589BE5

475:d=1  hl=2 l=  64 prim:  INTEGER           :3F441D2ACA5B204BF6090DA268924EB2B538700C646E3EEFB4E4639687006F192BD86BB083FB14E34AD7645D5156872474126ED0F7B87FCEC0A0DDE9C05ADD7B

541:d=1  hl=2 l=  65 prim:  INTEGER           :E11373ABA580936F0F3954E10E1ED8BCD85ABA6B7A343D82E1210FFF4B9440BD0AD3AE1FF35B90A39190249A28BA478181A179C5DCD6B194C267A11B7C1A0335

源代码:

js:function rsa_encrypt(text) {

   var rsa_pubkey="BD325CE52FC6BA090AC0C7A2039236587F99C30FA518F601F2AD33019514EE5A4340A964853E1BDF5374AB4AC22F5CFF3288E5DB94E6752B4999972DF4E23DACACAE4E4DCFB6CBAE256F1B19C4BA892D54C7A3E068F93AB47EC50635556FC223F02CB1F520631E2F03E5509B6C1E24DFB7962BCD6DC74159BF0E5AFC03D9A00D";

   var rsa = new RSAKey();   rsa.setPublic(rsa_pubkey, ‘10001‘);   return rsa.encrypt(text);}

function rsa_submit() {   var text = document.getElementById(‘text‘);   var en = rsa_encrypt(encodeURIComponent(text.value));   text.value = en;   return true;}

php:
<?php/** 加密助手 */class RsaHelper {    private $_public_key;    private $_private_key;

    public function __construct($path=null){        $this->_private_key  = $path ? trim($path, ‘/‘) . ‘/private.key‘ : dirname(__DIR__) . ‘/certificate/private.key‘;        $this->_public_key   = $path ? trim($path, ‘/‘) . ‘/private.key‘ : dirname(__DIR__) . ‘/certificate/public.key‘;    }

    //js解密    public function rsa_decrypt_for_js($text, $padding=OPENSSL_PKCS1_PADDING) {        $private_key_content = file_get_contents($this->_private_key);        $private_key = openssl_pkey_get_private($private_key_content);        if ($private_key == false) {            throw new Exception("The private key {$private_key_content} is not invalid");        }        $pack = pack("H*", $text);        $decrypted = ‘‘;        if (!openssl_private_decrypt($pack, $decrypted, $private_key, $padding)) {            $errmsg = ‘‘;            while ($msg = openssl_error_string()) {                $errmsg .= $msg. "\n";            }            throw new Exception("Js decrypt error: " . $errmsg);        }

        if ($padding == OPENSSL_NO_PADDING) {            return rtrim(strrev($decrypted), "/0");        } else {            return urldecode($decrypted);        }    }

    //php解密    public function rsa_decryp($text, $padding=OPENSSL_PKCS1_PADDING) {        $private_key_content = file_get_contents($this->_private_key);        $private_key = openssl_pkey_get_private($private_key_content);        if ($private_key == false) {            throw new Exception("The private key {$private_key_content} is not invalid");        }        $decrypted = ‘‘;        if (!openssl_private_decrypt($text, $decrypted, $private_key, $padding)) {            $errmsg = ‘‘;            while ($msg = openssl_error_string()) {                $errmsg .= $msg. "\n";            }            throw new Exception("Decrypt error: " . $errmsg);        }

        return $decrypted;    }

    //php加密    public function rsa_encrypt($text) {        $public_key_content = file_get_contents($this->_public_key);        $public_key = openssl_pkey_get_public($public_key_content);        if ($public_key == false) {            throw new Exception("The public key {$public_key_content} is not invalid");        }        $crypted = ‘‘;        if (!openssl_public_encrypt($text, $crypted, $public_key, OPENSSL_PKCS1_PADDING)) {            $errmsg = ‘‘;            while ($msg = openssl_error_string()) {                $errmsg .= $msg. "\n";            }            throw new Exception("Encrypt error: " . $errmsg);        }        return $crypted;    }}
时间: 2024-12-28 08:20:51

php js 的rsa加密的相关文章

用cryptico.js实现RSA加密(应对cryptico不支持PEM)

问题: 随手分享一下好了,这个问题困扰了很久. cryptico.js这个加密算法库很全,很适合在前端用到各种加密解密算法的需求.但是美中不足的是,它的RSA加密不支持PEM格式,所以如果你后端用java或者python生成的公钥不能直接用PEM的base64格式传给前端进行加密. 解决办法: 解决办法就是在后端提取出来n和e这两个数,转成16进制之后传给前端,然后人为修改cryptico的两个函数: var publicKeyFromString = function (string) { v

RSA加密,js前端,php后端

通过http://www.cnblogs.com/smismile/p/3789874.html这篇博文生成所需的公钥字符串和私钥 1. 前端加密写法,所需js文件 <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script> <script src="./Barrett.js"></script> <script src=".

React Native + Nodejs 使用RSA加密登录

想用rn做个RSA(非对称加密)登录 基本流程就是在服务端生成RSA后,将“公钥”发到客户端,然后客户端用“公钥”加密信息发送到服务端,服务务端用私钥解密. 过程不复杂,问题在于,nodejs和rn都准备用js做RSA加密,本来想用node-rsa做的,可是搞不懂它怎么设置公钥加密 于是直接做node-rsa的基础库http://www-cs-students.stanford.edu/~tjw/jsbn/,简单封装了下做了个demo 客户端: 'use strict'; const React

Jmeter_前端RSA加密下的登陆模拟_引用js文件实现

在一次项目实战中,前端登录使用了RSA加密,使用LoadRunner压测的第一步,就是模拟用户登录,可惜loadRunner11并不能录制前端的加密过程,并且安装的LR是基于C语言版,网络上关于RSA的加密更多的是Java版,最后,选择在Jmeter中先尝试一下能否解决加密的问题,毕竟它有很多处理器,用于脚本的插入: 把解决过程中遇到的问题,简单做个记录,防止遗忘,也算是给自己下一次项目一个经验总结了: [1]了解加密方式-----RSA 询问开发前端的加密方式:先请求public_key,再加

关于使用JS前台加密、JAVA后台解密的RSA实现,RSA加密和签名

需求环境: 西安项目中,客户要求保护用户的密码信息,不允许在http中传递明文的密码信息. 实现: 用RSA非对称加密方式实现.后台生成rsa密钥对,然后在登陆页面设置rsa公钥,提交时用公钥加密密码,生成的密文传到后台,用私钥解密,获取密码明文. 这样客户端只需要知道rsa加密方式和公钥,前台不知道私钥是无法解密的,此解决方案还是相对比较安全的. 附件是参照网友资料的java+JS的实现,放在这里供大家下载.访问方式/RSA/login.jsp. 需要到http://www.bouncycas

python实现网页登录时的rsa加密流程

对某些网站的登录包进行抓包时发现,客户端对用户名进行了加密,然后传给服务器进行校验. 使用chrome调试功能断点调试,发现网站用javascript对用户名做了rsa加密. 为了实现网站的自动登录,需要模拟这个加密过程. 网上搜了下关于rsa加密的最简明的解释: rsa加密是非对称加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥.公钥是可发布的供任何人使用,私钥则为自己

(原创)VS2017 C# 运行 Javasrcipt RSA 加密用户名登录 Java开发的服务器

第一次写博客. 最近想做一个Web的自动登录,用户名和密码是RSA加密过的,后台是用的JAVA,我只会点C#,抓包什么都搞定了(使用的是Fiddler),不过由于C#和RSA的加密方式不同,我搞了N天,都搞不定,中间问过很多人,愿意帮助的人不多,可能是我太菜了.就是为了得到个认证的cookie,我中间用过Webbrowser控件,让人自己登录,然后得到Cookie,不过感觉终究是个半成品. 然而,C#和Java中间的RSA互转,我遇到了2个问题,网上都是public key 转 public k

项目记录:登陆( 保存用户名密码 kaptcha验证码 shiro权限管理 RSA加密 非明文保存)

1.登陆页代码 1)引入js <script type="text/javascript" src="${base}/resources/admin/js/jquery.js"></script> <script type="text/javascript" src="${base}/resources/admin/js/jquery.validate.js"></script>

c# mvc rsa加密

基本思路: 1.后台给一个公钥对 传给前台 2.前台拿到后台给的公钥对进行密码加密 3.加密以后把值给隐藏域,后台可以通过form表单接受值 4.后台拿到值后进行解密 5.拿到解密的值 去数据库进行比对. 6.完成 前台代码: <script src="~/Scripts/jquery-1.8.2.js"></script><script src="Scripts/jQuery.md5.js" type="text/javas