首页 > 编程语言 >基于nodeje的RSA加解密

基于nodeje的RSA加解密

时间:2024-05-09 16:11:09浏览次数:16  
标签:const MAX 加解密 RSA len crypto nodeje offSet BLOCK

RAS是一种非对称加密,可以用公钥加密,私钥解密也可以反过来用私钥加密,公钥解密;以下是其实现方式,与java后台匹配,实现双向加解密。

/**
 * RSA最大加密明文大小
 */
const MAX_ENCRYPT_BLOCK = 245;
/**
 * RSA最大解密密文大小
 */
const  MAX_DECRYPT_BLOCK = 256;

通过fs.readFile()读取本地的私钥与公钥文件,要pem格式,如何读取这里就不在细述了...

let privateKey = `
-----BEGIN PRIVATE KEY-----
.........
-----END PRIVATE KEY-----
`

let publicKey = `
-----BEGIN PUBLIC KEY-----
.........
-----END PUBLIC KEY-----
`

 

1.公钥加密码私钥解

/**
 * 公钥加密
 * @param {*} publicKey 公钥
 * @param {*} callback 
 */
function encrypt_publicKey(publicKey){
  const params = {
    "a": '11111111111111111111111111156565656565656565656565656565656'
    "b": "34343434343436767676767676767676676764"   
  }
  const data = JSON.stringify(params)
  // 加密信息用Buffer封装
  const buffer = Buffer.from(data, 'utf-8');
  const len = buffer.byteLength;
  const bufs = [];
  let offSet = 0;
  let endOffSet = MAX_ENCRYPT_BLOCK;
  // 分段加密
  while (len - offSet > 0) {
    if (len - offSet > MAX_ENCRYPT_BLOCK) {
      const chunck = buffer.slice(offSet, endOffSet);
      bufs.push(crypto.publicEncrypt({key: publicKey, padding: crypto.constants.RSA_PKCS1_PADDING}, chunck));
    } else {
      const chunck = buffer.slice(offSet, len);
      bufs.push(crypto.publicEncrypt({key: publicKey, padding: crypto.constants.RSA_PKCS1_PADDING}, chunck));
    }
    offSet += MAX_ENCRYPT_BLOCK;
    endOffSet += MAX_ENCRYPT_BLOCK;
  }
  const result = Buffer.concat(bufs);
  decrypt_privateKey(result)
}
/**
 * 私钥解密
 * @param {*} privateKey 私钥
 * @param {*} arr buffer格式
 */
function decrypt_privateKey(data){
  const buf = _data instanceof Buffer ? _data : Buffer.from(_data, 'base64');
  const len = buf.byteLength; 
  const bufs = [];
  let offSet = 0;
  let endOffSet = MAX_DECRYPT_BLOCK;

  // 分段解密
  while (len - offSet > 0) {
    if (len - offSet > MAX_DECRYPT_BLOCK) {
        const bufTmp = buf.slice(offSet, endOffSet);
        bufs.push(crypto.privateDecrypt({key: privateKey, padding: crypto.constants.RSA_PKCS1_PADDING}, bufTmp));
    } else {
        const bufTmp = buf.slice(offSet, len);
        bufs.push(crypto.privateDecrypt({key: privateKey, padding: crypto.constants.RSA_PKCS1_PADDING}, bufTmp));
    }
    offSet += MAX_DECRYPT_BLOCK;
    endOffSet += MAX_DECRYPT_BLOCK;
  }
  const decrypt = Buffer.concat(bufs);
  console.log('解密后:', decrypt.toString())
}

 

2.钥加密码钥解

/**
 * 私钥加密
 * @param {*} privateKey 私钥
 * @param {*} callback 
 */
function encrypt_privateKey(){
  const params = {
    "a": "121212111111111111111111111111111111111",
    "b": "33333333333333333333333",
  }
  const data = JSON.stringify(params)
  // 加密信息用Buffer封装
  const buffer = Buffer.from(data, 'utf-8');
  const len = buffer.byteLength;
  const bufs = [];
  let offSet = 0;
  let endOffSet = MAX_ENCRYPT_BLOCK;
  console.log('len==', len)
  // 分段加密
  while (len - offSet > 0) {
    if (len - offSet > MAX_ENCRYPT_BLOCK) {
      const chunck = buffer.slice(offSet, endOffSet);
      bufs.push(crypto.privateEncrypt({key: privateKey, padding: crypto.constants.RSA_PKCS1_PADDING}, chunck));
    } else {
      const chunck = buffer.slice(offSet, len);
      bufs.push(crypto.privateEncrypt({key: privateKey, padding: crypto.constants.RSA_PKCS1_PADDING}, chunck));
    }
    offSet += MAX_ENCRYPT_BLOCK;
    endOffSet += MAX_ENCRYPT_BLOCK;
  }
  const result = Buffer.concat(bufs);
  console.log('加密后密文:', result.toString('base64'));
  decrypt_publicKey(result)
}

/**
 * 公钥解密
 * @param {*} publicKey 公钥
 * @param {*} data 
 */
function decrypt_publicKey(data){
  const buf = data instanceof Buffer ? data : Buffer.from(data, 'base64');
  const len = buf.byteLength; 
  const bufs = [];
  let offSet = 0;
  let endOffSet = MAX_DECRYPT_BLOCK;
  // 分段解密
  while (len - offSet > 0) {
    if (len - offSet > MAX_DECRYPT_BLOCK) {
        const bufTmp = buf.slice(offSet, endOffSet);
        bufs.push(crypto.publicDecrypt({key: publicKey, padding: crypto.constants.RSA_PKCS1_PADDING}, bufTmp));
    } else {
        const bufTmp = buf.slice(offSet, len);
        bufs.push(crypto.publicDecrypt({key: publicKey, padding: crypto.constants.RSA_PKCS1_PADDING}, bufTmp));
    }
    offSet += MAX_DECRYPT_BLOCK;
    endOffSet += MAX_DECRYPT_BLOCK;
  }
  const decrypt = Buffer.concat(bufs);
  console.log('解密后:', decrypt.toString())
}

 

标签:const,MAX,加解密,RSA,len,crypto,nodeje,offSet,BLOCK
From: https://www.cnblogs.com/bm20131123/p/18182501

相关文章

  • Server-side vulnerabilities :path traversal
    来自bp的学院,提供了靶机,是个学习好地方服务器漏洞之路径遍历 就是说网站提供的图片,如果直接通过src="/loadImage?filename=xxx.jpg“读取的话,可以通过构造”filename=../../../etc/passwd"参数,拿到服务器的passwd文件,这样能读取服务器的用户放一个靶机地址:https://portswigg......
  • Rsa1
    一、1、两个大素数:p,q(验证13是否是素数则输入13,显示结果为13=13,可见13是素数)2、模数n:n=p*q(分解出素数p和q的网站http://www.factordb.com/)3、计算欧拉函数φ(n)=(p-1)*(q-1)4、公钥指数:e与f(n)互质,且与1<e<f(n)amodb=1一般为655375、私钥指数d满足e*d=1(mod(f(n))......
  • Luminar Neo 1.19.0 (macOS Universal) - 创新 AI 图像编辑器
    LuminarNeo1.19.0(macOSUniversal)-创新AI图像编辑器利用尖端的人工智能生成技术,轻松增强照片效果请访问原文链接:LuminarNeo1.19.0(macOSUniversal)-创新AI图像编辑器,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org提升您的照片编辑能力。你想象......
  • 非对称加密中,加解密和签名
    在非对称加密中,加解密使用的密钥取决于具体的用途:加密:通常情况下,当想要确保数据的机密性,即希望只有特定接收方能够读取信息时,发送方会使用接收方的公钥对数据进行加密。这样一来,只有拥有对应私钥的接收方才能够解密并查看原始信息。解密:对应地,接收方收到加密后的数据后,......
  • Pixelmator Pro 3.5.10 Flare (macOS Universal) - 专业图像编辑工具
    PixelmatorPro3.5.10Flare(macOSUniversal)-专业图像编辑工具Photoshop的卓越替代软件请访问原文链接:PixelmatorPro3.5.10Flare(macOSUniversal)-专业图像编辑工具,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgPixelmatorPro真正基于AppleMac......
  • rsa加密解密
    packagecom.hcp.config.rsa;importorg.bouncycastle.util.encoders.Base64;importjavax.crypto.Cipher;importjava.security.*;publicclassRsaUtil{/***公钥*/privatestaticPublicKeypublicKey;/***私钥*/private......
  • 基于混沌序列的图像加解密算法matlab仿真,并输出加解密之后的直方图
    1.算法运行效果图预览 2.算法运行软件版本matlab2022a 3.算法理论概述3.1混沌系统特性       混沌系统是一类具有确定性、非线性、初值敏感性、遍历性和伪随机性等特性的动力学系统。其主要特性包括: 确定性:混沌系统由一组确定性微分方程或差分方程描述......
  • The 2018 ICPC Asia Qingdao Regional Programming Contest (The 1st Universal Cup,
    Preface久违地VP一场,虽然打的挺唐但勉强写出了8题前中期EFB三开三卡属实有点难受,而且B题这个套路大合集我和徐神两个人写了快200行也占用了一定机时但好在后面把卡住的题慢慢都写出来了,然后最后40min冲刺L题成功比较可惜的是I这个开场看的题没有再细想一步,感觉想到在线段树上D......
  • 陈畅亮搞的专利在Windows上利用加解密DLL模块对数据库连接字符串进行加解密
    陈畅亮搞的专利在Windows上利用加解密DLL模块对数据库连接字符串进行加解密  这种专利权人是公司,个人是发明人,专利年费是申请人先垫付,然后公司报销了,这个专利本身就不属于员工的这个是公司是专利权人, 使用权是公司,如果想要维持权利的话,需要缴纳年费,专利发明现在一个市......
  • RuntimeBroker.exe 是 Windows 操作系统中的一个系统进程,它负责管理 Metro 应用程序(现
    RuntimeBroker.exe是Windows操作系统中的一个系统进程,它负责管理Metro应用程序(现在称为UniversalWindowsPlatform应用程序)的权限和沙盒环境。该进程通常在用户登录后启动,并且对于每个用户会话都会有一个实例在运行。具体来说,RuntimeBroker主要有以下作用:权限管......