公开的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;
}

版权声明:如无特别声明,本文版权归 一年四季 所有,转载请注明本文链接。

(采用 CC BY-NC-SA 4.0 许可协议进行授权)

本文标题:《 js php rsa 长文本加解密 》

本文链接:https://www.yucanlin.cn/develop/js-php-rsa.html