RSA(非对称)-JS加密_PHP解密 - 笔记搬迁6

此小demo的其它依赖文件,如各种库的JS、公私钥的文件网上都有或可以自己生成。所以就不贴了。大概目录如下


以下为代码为核心,文件名为form.php,
<?php
	error_reporting(E_ALL);
	ini_set('display_errors', '1'); 
	## RSA加密 PHP部分
	if ($_SERVER['REQUEST_METHOD'] === 'POST') {
		$data = $_POST;
		## 检测openssl模块
		extension_loaded('openssl')
		or die(json_encode(['code' => 100, 'data' => '', 'msg' => '需要php_openssl扩展支持']));
		## 加载私钥文件
		$private_key = file_get_contents('./rsa_key/private.pem');

		## 生成私钥资源,用于加、解密
		$private_resource = openssl_pkey_get_private($private_key);

		## base64解码(pwd密码的)值
		$encrypt_pwd = base64_decode($data['pwd']);

		## 用私钥解密(第四个参数与加密时的规则对应)
		openssl_private_decrypt($encrypt_pwd, $decrypt_pwd, $private_resource, OPENSSL_PKCS1_PADDING);

		die(json_encode([
				'code' => 200,
				'data' => $decrypt_pwd,
				'msg'  => '获取解密数据成功',
			]));
	}
	
?>

<center>
	<form id="form">
		<tr>
			<td>姓名</td>
			<td><input type="text" id="uname"></td>
		</tr>
		<tr>
			<td>密码</td>
			<td><input type="password" id="pwd"></td>
		</tr>
		<tr>
			<td><button type="button" id="login">查询安全码</button></td>
			<td></td>
		</tr>
	</form>
</center>
<script src='./lib/jquery-3.2.1.min.js'></script>
<script src='./lib/BigInt.js'></script>
<script src='./lib/Barrett.js'></script>
<script src='./lib/RSA.js'></script>
<script src='./lib/base64.min.js'></script>

<script>
	// RSA加密 JS部分(私钥存放前端,公钥存放后端)
	// 
	// 一、生成私钥(以pem格式为例,PPK格式需要经过puTTyGen转换成pem)
	// 	   命令:openssl genrsa -out private_key.pem 2048
	// 
	// 二、根据私钥生成公钥:openssl rsa -in private.pem -pubout -out public.pem
	//    (private.pem为当前目录下的私钥文件,public.pem为将要生成的公钥文件)
	// 
	// 三、Rsa公、私钥分解 Exponent、Modulus,即:Rsa公私钥指数、系数(模数)分解方法
	//     1、百度搜索:在线Rsa公私钥分解 Exponent、Modulus
	//     2、命令:(JS端为公钥文件,所以下面分解公钥)
	//       (1)分解模数 :openssl rsa -pubin -inform PEM -text -noout < public.pem
	//   	     (public.pem为公钥文件,结果中 modulus 后的值为结果)
	//       (2)分解指数 :openssl rsa -pubin -inform PEM -text -noout < public.pem
	//           (public.pem为公钥文件,如,结果中 publicExponent: 37 (0x25) 为结果,其中25为RSA指数)
	//           
	// 备注:(参考:http://www.ohdave.com/rsa/)
	//        RSA加密JS文件需要三个:Multiple-precision library (http://www.ohdave.com/rsa/BigInt.js)
	//								 Barrett modular reduction library (……/rsa/Barrett.js)
	//								 RSA library with documentation comments (……/rsa/RSA.js)
	//								 或者 stripped for production use. (……/rsa/RSA_Stripped.js)
	// 
	$(function(){
		$("#login").click(function(){

			// 设置最大编译长度
			// 在BigInt.js的62行注释里写到,这里的最小值一般为:KEY的字节 N * 2 / 16,
			// 但是我自己测试过后,发现不可行。必须要在 2 * N / 16 的基础 + 1,即 2 * N / 16 + 1,
			//  
			// 所以这里的值必须大于等于 2*N/16+1,哪怕小1个都会解密失败。
            setMaxDigits(2048*2/16+1);
            
            // RSA的模数(系数)Modulus (openssl rsa -inform PEM -text -noout < private_key.pem)
            var modulus = 'D9CD8620AD1D9B42CA142D2CFFF53CC6EF7FC386B51B2E2FB1EC7D2129D3689E900FD67C2B56B84D8D550AB35D40692BD618686904B119DDE1B7E7830A7C340AB7A8DBB3BE860F2A0B9AFA855A82EA8EB495D01EA3EC98F8AEFEE8B04F45AA452788489D7EA8697A4CD4BD9B9B538D7945918DC051AC8E47A71CA4FF86B8D524A5910553BBB9C37B8164AD4227D1E17AE8EB71E20007BAA504684A68BB459AAB310396A010CB860B7C3EFFA4AB3CE0D5917C6E470C4D0DDCDC5A31A54FB2167D72F3845A3837E989AA58E01E030941753D085F62FA1E3EAA4C0843B9F620ACFAD25C221BABB16F435D3408666981CC79CFC7218CA0DC9E2951CB59E8DD71B48F';

            // 公钥的指数Exponent  (不做加密,可默认10001)
            var public_e = '25';

            // 私钥的指数Exponent  (不做解密,可默认10001) 
            var private_e = '25';

            // 生成【钥匙实例】
            var key = new RSAKeyPair(public_e, private_e, modulus, 2048);

            // 通过【钥匙实例】对密码加密(第三、四个参数为加密策略,具体值的话,去看注释)
            var pwd = encryptedString(key, $("#pwd").val(), RSAAPP.PKCS1Padding, RSAAPP.RawEncoding);

            // 密码base64编码
            pwd = window.btoa(pwd);
            //请求并解密返回的信息
            $.ajax({
            	url: './form.php',
            	type: 'POST',
            	dataType: 'json',
            	data: {uname:$('#uname').val(), pwd:pwd},
            })
            .done(function(msg) {
            	if (msg.code == 200) {
            		alert(msg.msg + ',密码为:' + msg.data);
            	}
            });
            
        });
	})
</script>

文章来源: RSA(非对称)-JS加密_PHP解密 - 笔记搬迁6

人吐槽 人点赞

猜你喜欢

发表评论

用户名: 密码:
验证码: 匿名发表

你可以使用这些语言

查看评论:RSA(非对称)-JS加密_PHP解密 - 笔记搬迁6