以下主要介绍的长解密
一 后端部分处理
/**
* 公钥解密 RSA算法私钥加密
* @param string $encrypted 公钥加密串
* @param string $privKey 私钥
* @return bool|null|string
*/
public static function RSADecrypt($encrypted = '', $privKey = '')
{
//用base64将内容还原成二进制
$content = base64_decode($encrypted);
//把需要解密的内容,按128位拆开解密
$decrypted = '';
for ($i = 0; $i < strlen($content) / 128; $i++) {
$data = substr($content, $i * 128, 128);
openssl_public_decrypt($data, $decrypt, $privKey);
$decrypted .= $decrypt;
}
openssl_free_key($res);
return $decrypted;
}
/**
* 公钥加密
* @param string $content [待加密字符串]
* @param string $publicKey [公钥]
*/
public static function RSAEncrypt($content = '', $publicKey = '')
{
$encrypted = '';
openssl_public_encrypt($content, $encrypted, openssl_pkey_get_public($publicKey));
//加密成功,返回base64编码的字符串
return base64_encode($encrypted);
}
二 前端部分处理
一般我们使用到公钥加密的比较多,但是也会有一些需求需要前端来进行公钥解密
实现
- 修改 RSAKey.prototype.decrypt 中 this.doPrivate 为 this.doPublic
RSAKey.prototype.decrypt = function (ctext) {
var c = parseBigInt(ctext, 16);
var m = this.doPublic©;
//var m = this.doPrivate©;
if (m == null) {
return null;
}
return pkcs1unpad2(m, (this.n.bitLength() + 7) >> 3);
}; - 修改 pkcs1unpad2;
function pkcs1unpad2(d, n) {
var b = d.toByteArray();
var i = 0;
while (i < b.length && b[i] == 0) {
++i;
}
//注释即可
// if (b.length - i != n - 1 || b[i] != 2) {
// return null;
// }
++i;
while (b[i] != 0) {
if (++i >= b.length) {
return null;
}
}
var ret = “”;
while (++i < b.length) {
var c = b[i] & 255;
if (c < 128) { // utf-8 decode
ret += String.fromCharCode©;
} else if ((c > 191) && (c < 224)) {
ret += String.fromCharCode(((c & 31) << 6) | (b[i + 1] & 63));
++i;
} else {
ret += String.fromCharCode(((c & 15) << 12) | ((b[i + 1] & 63) << 6) | (b[i + 2] & 63));
i += 2;
}
}
return ret;
}
当然了以上只是试用于浏览器的情况,小程序的情况 需要另做修改 这里没有window对象
还需要 将 window 改成 window2
navigator 改成 navigator2
以下举例公钥解密
var encrypt = new JSEncrypt();
encrypt.setPublicKey('-----BEGIN PUBLIC KEY-----' + PUBLIC_KEY + '-----END PUBLIC KEY-----');
var str = 'QIMXGxXvt5jrE/LNB0aaL3Ejpv4WQbNPNBxXSjrnIgDceTY2s0aaJcpWvTcNhjv+UoudA4HtJ6+sogqbpVWxV7WdhsyTyqjiqij0YkmjH4cn2uftZaWjljD9ZjBoJ6gxh/tlOK9h+tpuafhXv9CbQRQqcDfB44q35OZQvuG6bnFf+2sBFTMNsdHGTtKVslJUcLoFQwZ0NAv/NQyaQ0zWOb42mN/xSXrhEcP7H4+EHtcQ6J8NQqj6pcn439zSShSgQFlnHpkyWA3et/BvAcs1ly1JCBpd9vLAx3R/oHq6SBWxjthzY5N4SnsGV82PKUtGxfCDYjLFbUwVJNnCkWbPG7cV83uDAwX9vs1ikXn2O1j5C/rH4v3yB9a2uub/VGOi1x+o36OCLLgch1wRuj+252cWEhE8UQHy48lbznv7itvy6UjG+G5hf1frHqRziFIM+aPlmVYrlsBo8cKN9/Y04fxiTzwZSIAbNUvpQYc+jbqWExNwPGW4GgeqsEA60xWVocYPDInqhP5GvWV0L2hoG97QXiyIHR7nba/l/CS1E/e0oWkWiOBIDqj8eyajUUm2SExQSxW2/xy23eXkcNNr2iApHQloqAfc9CzJUGc47iIUT4r9cVO7hbLwRMw05+5Kagc6Z9vRxwhV2viFTpNYZVIYekyWtt3IU91EzCnhiL65fsRc4vJT2Vym0jHQdgufnVCPjT1dDNJEi9d4hObYUEFkOsAFPV80lOG+YGLRT6sZ4Jhy4VYv2LGPJhv5ZehqUjkph0AqeDlPOI+if/mT0OktLFG/t3FjVyY6yOq3xgYvCBQxBO+fnFr35fD2FJEpSnwlcTfwunWJ+VWW1pgyjw==';
var s = encrypt.decryptLong(str);
console.log(s);
以上就是大概介绍吧,用到的伙伴可以直接拿去用 有什么需要完善的欢迎大家评论!