PHP rsa加密

<?php

namespace app;

class RsaUtil
{
	
	const CHAR_SET = "UTF-8";
	const BASE_64_FORMAT = "UrlSafeNoPadding";
	const RSA_ALGORITHM_KEY_TYPE = OPENSSL_KEYTYPE_RSA;
	const RSA_ALGORITHM_SIGN = OPENSSL_ALGO_SHA256;
	
	protected $public_key;
	protected $private_key;
	protected $key_len;
	
	public function __construct($pub_key = '', $pri_key = null)
	{
		if ($pub_key) {
			$this->public_key = $pub_key;
			$pub_id = openssl_pkey_get_public($this->public_key);
			$this->key_len = openssl_pkey_get_details($pub_id)['bits'];
		}
		if ($pri_key) {
			$this->private_key = $pri_key;
			$pri_id = openssl_pkey_get_private($this->private_key);
			$this->key_len = openssl_pkey_get_details($pri_id)['bits'];
		}
	}
	
	/*
	 * 创建密钥对
	 */
	public static function createKeys($key_size = 1024)
	{
		$config = array(
			"private_key_bits" => $key_size,
			"private_key_type" => self::RSA_ALGORITHM_KEY_TYPE,
		);
		$res = openssl_pkey_new($config);
		openssl_pkey_export($res, $private_key);
		$public_key_detail = openssl_pkey_get_details($res);
		$public_key = $public_key_detail["key"];
		
		return array(
			"public_key" => $public_key,
			"private_key" => $private_key,
		);
	}
	
	/*
	 * 公钥加密
	 */
	public function publicEncrypt($data)
	{
		return $this->encryptUnicodeLong($data,$this->public_key);
	}
	
	function encryptUnicodeLong($string,$key) {
		// 获取密钥的长度并计算分段长度
		$maxLength = (int)($this->key_len / 8) - 11;
		$subStr = "";
		$encryptedString = "";
		$subStart = 0;
		$subEnd = 0;
		$bitLen = 0;
		$tmpPoint = 0;
		
		for ($i = 0, $len = mb_strlen($string, 'UTF-8'); $i < $len; $i++) {
			$char = mb_substr($string, $i, 1, 'UTF-8');
			$charCode = unpack('N', mb_convert_encoding($char, 'UCS-4BE', 'UTF-8'))[1];
			
			if ($charCode <= 0x007f) {
				$bitLen += 1;
			} elseif ($charCode <= 0x07ff) {
				$bitLen += 2;
			} elseif ($charCode <= 0xffff) {
				$bitLen += 3;
			} else {
				$bitLen += 4;
			}
			
			if ($bitLen > $maxLength) {
				$subStr = mb_substr($string, $subStart, $subEnd - $subStart, 'UTF-8');
				$encrypted_temp = '';
				openssl_public_encrypt($subStr, $encrypted_temp, $key);
				$encryptedString .= $encrypted_temp;
				$subStart = $subEnd;
				$bitLen = $bitLen - $tmpPoint;
			} else {
				$subEnd = $i + 1;
				$tmpPoint = $bitLen;
			}
		}
		
		$subStr = mb_substr($string, $subStart, null, 'UTF-8');
		$encrypted_temp = '';
		openssl_public_encrypt($subStr, $encrypted_temp, $key);
		$encryptedString .= $encrypted_temp;
		
		return base64_encode($encryptedString);
	}
	
	/*
	 * 私钥解密
	 */
	public function privateDecrypt($encrypted)
	{
		$decrypted = "";
		$part_len = $this->key_len / 8;
		//url  中的get传值默认会吧+号过滤成' ',替换回来就好了
		str_replace('% ', '+', $encrypted);
//		echo $encrypted;
		$base64_decoded = base64_decode($encrypted);
		$parts = str_split($base64_decoded, $part_len);
		foreach ($parts as $part) {
			$decrypted_temp = '';
			openssl_private_decrypt($part, $decrypted_temp, $this->private_key);
			$decrypted .= $decrypted_temp;
		}
		return $decrypted;
	}
	
	/*
	 * 私钥加密
	 */
	public function privateEncrypt($data)
	{
		return $this->encryptUnicodeLong($data,$this->private_key);
	}
	
	/*
	 * 公钥解密
	 */
	public function publicDecrypt($encrypted)
	{
		$decrypted = "";
		$part_len = $this->key_len / 8;
		$base64_decoded = base64_decode($encrypted);
		$parts = str_split($base64_decoded, $part_len);
		
		foreach ($parts as $part) {
			$decrypted_temp = '';
			openssl_public_decrypt($part, $decrypted_temp, $this->public_key);
			$decrypted .= $decrypted_temp;
		}
		return $decrypted;
	}
	
	/*
	 * 数据加签
	 */
	public function sign($data)
	{
		openssl_sign($data, $sign, $this->private_key, self::RSA_ALGORITHM_SIGN);
		return base64_encode($sign);
	}
	
	/*
	 * 数据签名验证
	 */
	public function verify($data, $sign)
	{
		$pub_id = openssl_get_publickey($this->public_key);
		$res = openssl_verify($data, base64_decode($sign), $pub_id, self::RSA_ALGORITHM_SIGN);
		return $res;
	}
	
}


js

npm install jsencrypt

直接改动jsencrypt.js文件,在文件最下方的 JSEncrypt.version = “3.0.0-rc.1”; 前面,添加下面的代码:

	//任意长度RSA Key分段加密解密长字符串
	
	//获取RSA key 长度
	JSEncrypt.prototype.getkeylength = function () {  
       return ((this.key.n.bitLength()+7)>>3);
    };
	
	// 分段解密,支持中文
	JSEncrypt.prototype.decryptUnicodeLong = function (string) {
		var k = this.getKey();
		//解密长度=key size.hex2b64结果是每字节每两字符,所以直接*2
		var maxLength = ((k.n.bitLength()+7)>>3)*2;
		try {
			var hexString = b64tohex(string);
			var decryptedString = "";
			var rexStr=".{1," + maxLength  + "}";
			var rex =new RegExp(rexStr, 'g'); 
			var subStrArray = hexString.match(rex);
			if(subStrArray){
				subStrArray.forEach(function (entry) {
					decryptedString += k.decrypt(entry);
				});
				return decryptedString;
			}
		} catch (ex) {
			return false;
		}
	};
		
	// 分段加密,支持中文
	JSEncrypt.prototype.encryptUnicodeLong = function (string) {
		var k = this.getKey();
		//根据key所能编码的最大长度来定分段长度。key size - 11:11字节随机padding使每次加密结果都不同。
		var maxLength = ((k.n.bitLength()+7)>>3)-11;
		try {
			var subStr="", encryptedString = "";
			var subStart = 0, subEnd=0;
			var bitLen=0, tmpPoint=0;
			for(var i = 0, len = string.length; i < len; i++){
				//js 是使用 Unicode 编码的,每个字符所占用的字节数不同
				var charCode = string.charCodeAt(i);
				if(charCode <= 0x007f) {
					bitLen += 1;
				}else if(charCode <= 0x07ff){
					bitLen += 2;
				}else if(charCode <= 0xffff){
					bitLen += 3;
				}else{
					bitLen += 4;
				}
				//字节数到达上限,获取子字符串加密并追加到总字符串后。更新下一个字符串起始位置及字节计算。
				if(bitLen>maxLength){
					subStr=string.substring(subStart,subEnd)
					encryptedString += k.encrypt(subStr);
					subStart=subEnd;
					bitLen=bitLen-tmpPoint;
				}else{
					subEnd=i;
					tmpPoint=bitLen;
				}
			}
			subStr=string.substring(subStart,len)
			encryptedString += k.encrypt(subStr);
			return hex2b64(encryptedString);
		} catch (ex) {
			return false;
		}
	};
	//添加的函数与方法结束

js使用


import JsEncrypt from 'jsencrypt';

const publicKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA33xP6Qr1qSAl43+HLXYO
oNCSobEE6BlQ5zUfG+NWeubj7yWqmP8100V95uteHB3gTJFJyYb6BxV2KTeBmvMZ
RjGA7HCWmlSLKW72L1kg6/oca4m+IsthhDHyGgOypIbpYaMP5DttVfO6mluOkvGi
N8uZt5yGDwPn6rLQyIuMsCagjMGSv8Ibm3WSfMvn1ICL4ZRZqHU94R1Xr8sdAwfS
Dq9Md/DsxNUD9w9jSp815aAt2jvrYYmGZ2uPcpCfgDuy2SZT87JnfdsYCjMGkom3
6Ry9b8obZ8pWlb+h9apU93cf46EiqjrHLwH8DFULbNLKsPgF7Xt/gOZOek33bYu0
dwIDAQAB
-----END PUBLIC KEY-----`;
export const $encruption = (str, key = publicKey) => {
    const ENCRYPT = new JsEncrypt();
    ENCRYPT.setPublicKey(key);
    return ENCRYPT.encryptUnicodeLong(str.toString());
};
const privateKey = `-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA33xP6Qr1qSAl43+HLXYOoNCSobEE6BlQ5zUfG+NWeubj7yWq
mP8100V95uteHB3gTJFJyYb6BxV2KTeBmvMZRjGA7HCWmlSLKW72L1kg6/oca4m+
IsthhDHyGgOypIbpYaMP5DttVfO6mluOkvGiN8uZt5yGDwPn6rLQyIuMsCagjMGS
v8Ibm3WSfMvn1ICL4ZRZqHU94R1Xr8sdAwfSDq9Md/DsxNUD9w9jSp815aAt2jvr
YYmGZ2uPcpCfgDuy2SZT87JnfdsYCjMGkom36Ry9b8obZ8pWlb+h9apU93cf46Ei
qjrHLwH8DFULbNLKsPgF7Xt/gOZOek33bYu0dwIDAQABAoIBAQDJBgLDNs5+UKKE
HkQzikviL3qV4qrtM0hokInpBfbWGjXQ+WqYsId0AMAdJH3EgMMvXEio87aXBKEC
tiDohd6oGwNCqottSrrajCr5sAxC9vj1ajMTDSosRNjmuYjJIWlwH8K9ow7YD6I8
EjsOxjcKRSOB21Ni0jqcDDhtC8mC762JpTGUFsrT88aIPN+WAxFdelh+GfCZMclt
HAsYiWcOEU02tyjcvhHd7azbLo4Wfx8wvWGGRN8U62USkVB5+Xmfd8tAqr5YFw2V
ZxNEs9NlrQ35lkYIJ9vg6QpxMG06im2N5PDf0724wSVgq34mthXOSRHMP4bB5e/w
0PHZ0rYxAoGBAPHIEtGXycJ456Qk1S97r5CKeW0heeYTUbaefPraVAfcwkldCPqc
NZBXspcAelyd1XxBgJ6pfzohqiy4/FcVvMNQYhcfQzmtYcx8DPXLtTrHQLDkWTOH
p2GM57RBTxMEk9crIuq+1cXxbx25KSLoCo/Txpc4yRcbgVZMCZjCrS/bAoGBAOyg
zOVeTcyTvS1Wldp59yOe1HFQtslius/Kb2xj1HCSzOfVRi79uw0MfuA1xU39Qfq4
DqAkmucbURxHRRyRHqSpomV+FbT/clkpxzgG0ZrWly8/m75StIXpQD37Y9Y/HJtX
wPQBb2ump1kO246HdMmqpASBL+pC9nd8qmkqKK6VAoGBANkKoJITryNrQ43fHpy8
bFLVa8Fibrnxl8XWqhzKBurz6ljPMnM97PuBLilNXYpsiSs85cgIIdS+SbRR7vwB
4Gx4aUWWY9OP6B4XMc8oKaz1FwZ0RfrzCHeSdKEki2ZoEoryBysxWleRrwzAncPf
BzQriLdRW3rpzwX3xhmikLNHAoGBAKPCSOq3z+mzmOmGkaCoZbO+GNHvBQDsFdL2
CxSdJgleXvZWcALXUBsgubGbJNfrXD0SIfUMQDOOgRyr6hVyDR3x09SfZJBldJJm
SlvoxCh/OBPX1oXpoMtH+FCs6JP+C2MqYPu8/oomxIvqr2G9NsLWGDqR2UIrY3yf
xyOOrKbdAoGAdR1cC8uz2Wlx37xwx/QUYv67bAwxgfUtd18bCjtfwS5Nkyf55hIU
jIwlWamZntUTItsC7bAewT7gQxOhX4E+T2U+6NQg4x71OP8AGQZe2OHAuXjXucey
trAkib1EZOKwnCTEJe7wNPorvNBFynqGgh3OTnMKykbqzO7MeLVaQnI=
-----END RSA PRIVATE KEY-----`;
export const $decryption = (str, key = privateKey) => {
    const ENCRYPT = new JsEncrypt();
    ENCRYPT.setPrivateKey(key);
    let data = ENCRYPT.decryptUnicodeLong(str.toString());
	return /^{.+}$/g.test(data) && JSON.parse(data) || data
};
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PHP RSA 加密是一种非对称加密算法,它使用一对公钥和私钥对数据进行加密和解密。公钥用来加密数据,私钥用来解密数据。使用 PHP 实现 RSA 加密可以使用 openssl 扩展库,该库提供了多种 RSA 算法的实现,并可以方便地生成公钥和私钥。例如下面这段代码可以生成一对公钥和私钥 ``` <?php // 生成公钥和私钥 $res = openssl_pkey_new(); // 提取私钥 openssl_pkey_export($res, $privKey); // 提取公钥 $pubKey = openssl_pkey_get_details($res); $pubKey = $pubKey["key"]; // 使用公钥加密数据 $data = "hello world"; openssl_public_encrypt($data, $encrypted, $pubKey); // 使用私钥解密数据 openssl_private_decrypt($encrypted, $decrypted, $privKey); echo $decrypted; ``` ### 回答2: PHP中的RSA加密是一种非对称加密算法,它支持公钥加密和私钥解密的过程。RSA加密的主要步骤如下: 1. 生成密钥对:首先,通过调用PHP的openssl扩展库中的函数生成RSA密钥对,包括公钥和私钥。通常,公钥用于加密数据,私钥用于解密数据。 2. 加密数据:在使用RSA加密之前,需要将待加密数据转换为字节流,并且需要使用公钥进行加密。可通过`openssl_public_encrypt`函数来实现数据的加密。 3. 解密数据:在使用RSA解密之前,需要将密文转换为字节流,并且需要使用私钥进行解密。可通过`openssl_private_decrypt`函数来实现数据的解密。 需要注意的是,RSA加密算法对输入数据的长度有限制,通常能够处理的最大数据长度受到密钥长度的限制。因此,对于需要加密的数据较大的情况,可以使用对称加密算法(如AES)对数据进行加密,再使用RSA加密对称加密的密钥。 此外,为了确保数据的安全性,我们还可以对RSA密钥进行保护,如设置密钥密码、存储密钥的文件权限等。 总之,PHP中的RSA加密提供了一种可靠的非对称加密方式,可以用于保护敏感数据的安全传输。 ### 回答3: RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,常用于数据加密和数字签名。PHP中有一些库和函数可以用来实现RSA加密。 首先,我们需要生成一对RSA密钥。可以使用openssl库中的openssl_pkey_new()函数来生成一个新的密钥对,并使用openssl_pkey_export()函数将其导出为字符串格式。这样我们就得到了一个私钥和一个公钥。 然后,我们可以使用openssl_public_encrypt()函数使用公钥对要加密的数据进行加密。这个函数将返回一个加密后的字符串,在解密时需要使用私钥进行解密。 最后,我们可以使用openssl_private_decrypt()函数使用私钥对加密后的数据进行解密。这个函数将返回解密后的原始数据。 下面是一个使用RSA加密的简单示例: ```php // 生成RSA密钥对 $res = openssl_pkey_new(); openssl_pkey_export($res, $private_key); $public_key = openssl_pkey_get_details($res)['key']; // 要加密的数据 $data = 'Hello, World!'; // 使用公钥加密数据 openssl_public_encrypt($data, $encrypted, $public_key); // 使用私钥解密数据 openssl_private_decrypt($encrypted, $decrypted, $private_key); // 输出解密后的数据 echo $decrypted; // Hello, World! ``` 这是一个简单的示例,实际使用中可能需要更复杂的逻辑来处理数据的加密和解密。此外,还应该注意保护好私钥,确保只有授权的人才能访问私钥,以防止数据被非法解密。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值