已经是最新一篇文章了!
已经是最后一篇文章了!
js php rsa 长文本加解密
公开的rsa加解密工具的加密长度都是有限制,文本过长加密的结果就会变成null。这篇文章主要是依托目前主流的js,php加解密程序,通过编写自定义的加解密函数,实现长文本的加解密。
1 javascript的rsa长文本加解密
1.1 首先下载JSEncrypt这个库
我们需要基于这个库写一个长文本的加密函数。 http://travistidwell.com/jsencrypt/
1.2 修改jsencrypt.js文件,加入新的加解密函数
下载后的压缩包里有很多目录,我们进入bin目录后,有两个js文件,选择jsencrypt.js这个文件,这是个未压缩的版本,方便我们将代码插进去。
以下便是用于加解密的两个函数,请插入到文件中合适的位置(可以搜索“JSEncrypt.prototype”,你就会发现底下有一大堆函数,把我们的新函数也放在这里就可以了)。
//分段加密的方法
// The right encryption code
JSEncrypt.prototype.encryptLong = function(string) {
var k = this.getKey();
var maxLength = (((k.n.bitLength()+7)>>3)-11);
// var maxLength = 117;
try {
var lt = "";
var ct = "";
if (string.length > maxLength) {
lt = string.match(/.{1,117}/g);
lt.forEach(function(entry) {
var t1 = k.encrypt(entry);
ct += t1 ;
});
return hex2b64(ct);
}
var t = k.encrypt(string);
var y = hex2b64(t);
return y;
} catch (ex) {
return false;
}
};
//分段解密的方法
// The error decryption code
JSEncrypt.prototype.decryptLong = function(string) {
var k = this.getKey();
var maxLength = ((k.n.bitLength()+7)>>3);
// var maxLength = 128;
try {
var string = b64tohex(string);
var ct = "";
if (string.length > maxLength) {
var lt = string.match(/.{1,128}/g);
lt.forEach(function(entry) {
var t1 = k.decrypt(entry);
ct += t1;
});
}
var y = k.decrypt(b64tohex(string));
return y;
} catch (ex) {
return false;
}
};
1.3 使用
修改后的用法跟原来的JSEncrypt的用法一样,只是把原来使用的加密函数encrypt换成encryptLong就可以了。下面是示例代码:
var encrypt = new JSEncrypt();
encrypt.setPublicKey(public_key);//设置公有key
data = encrypt.encryptLong(data);
2 php的rsa长文本加解密
//长文本加密方法
function encrypt($originalData){
$key_content = "-----BEGIN PUBLIC KEY-----
-----END PUBLIC KEY-----
";
$rsaPublicKey = openssl_get_publickey($key_content);
foreach (str_split($originalData, 117) as $chunk) {
openssl_public_encrypt($chunk, $encryptData, $rsaPublicKey);
$crypto .= $encryptData;
}
return base64_encode($crypto);
}
//长文本的解密方法
function decryptLong($encryptData){
$key_content = "-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
";
$rsaPrivateKey = openssl_get_privatekey($key_content);
$crypto = '';
foreach (str_split(base64_decode($encryptData), 128) as $chunk) {
openssl_private_decrypt($chunk, $decryptData, $rsaPrivateKey);
$crypto .= $decryptData;
}
return $crypto;
}