zoukankan      html  css  js  c++  java
  • 区块链加密技术

    base64
    来源:要求把三个八位字节 24位转化 4 个6位 24位 ,补齐八位变成32位
    的形式。
    如果不足三个字节:用=补齐

    Base64编码表
    为保证可读码表的容量是64个,因此被称为base64。
    //加密解密类

    var crypto = require('crypto');
    var fs = require('fs');
    var path = require('path');

    /**

    • RSA最大加密明文大小
      */
      var MAX_ENCRYPT_BLOCK = 117-31;

    /**

    • RSA最大解密密文大小
      */
      var MAX_DECRYPT_BLOCK = 128;

    /**

    • 公钥加密
    • @param data
    • @returns {string}
      */
      function publicEncrypt(data) {
      //得到公钥
      var publicPem = fs.readFileSync(path.join(__dirname, "../../properties/rsa_public_key.pem"));//替换你自己的路径
      var publicKey = publicPem.toString();
      //加密信息用buf封装
      var buf = new Buffer(data, "utf-8");
      //buf转byte数组
      var inputLen = buf.byteLength;
      //密文
      var bufs = [];
      //开始长度
      var offSet = 0;
      //结束长度
      var endOffSet = MAX_ENCRYPT_BLOCK;
      //分段加密
      while (inputLen - offSet > 0) {
      if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
      var bufTmp = buf.slice(offSet, endOffSet);
      bufs.push(crypto.publicEncrypt({key: publicKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
      } else {
      var bufTmp = buf.slice(offSet, inputLen);
      bufs.push(crypto.publicEncrypt({key: publicKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
      }
      offSet += MAX_ENCRYPT_BLOCK;
      endOffSet += MAX_ENCRYPT_BLOCK;
      }
      var result = Buffer.concat(bufs);
      //密文BASE64编码
      var base64Str = result.toString("base64");
      console.log(base64Str);
      return base64Str;
      }

    /**

    • 公钥解密

    • @param date

    • @returns {string}
      */
      function publicDecrypt(date) {

      //得到私钥
      var publicPem = fs.readFileSync(path.join(__dirname, "../../properties/rsa_public_key.pem"));//替换你自己的路径
      var publicKey = publicPem.toString();
      //经过base64编码的密文转成buf
      var buf = new Buffer(date, "base64");

      //buf转byte数组
      //var inputLen = bytes(buf, "base64");
      var inputLen = buf.byteLength;
      //密文
      var bufs = [];
      //开始长度
      var offSet = 0;
      //结束长度
      var endOffSet = MAX_DECRYPT_BLOCK;
      //分段加密
      while (inputLen - offSet > 0) {
      if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
      var bufTmp = buf.slice(offSet, endOffSet);
      bufs.push(crypto.publicDecrypt({key: publicKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
      } else {
      var bufTmp = buf.slice(offSet, inputLen);
      bufs.push(crypto.publicDecrypt({key: publicKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
      }
      offSet += MAX_DECRYPT_BLOCK;
      endOffSet += MAX_DECRYPT_BLOCK;
      }
      var result = Buffer.concat(bufs).toString();
      console.log(result);
      return result;
      }

    /**

    • 私钥加密

    • @param date

    • @returns {string}
      */
      function privateEncrypt(date) {

      //得到私钥
      var privatePem = fs.readFileSync(path.join(__dirname, "../../properties/rsa_private_key.pem"));
      var privateKey = privatePem.toString();
      //经过base64编码的密文转成buf
      var buf = new Buffer(date, "utf-8");
      //buf转byte数组
      var inputLen = buf.byteLength;
      //密文
      var bufs = [];
      //开始长度
      var offSet = 0;
      //结束长度
      var endOffSet = MAX_ENCRYPT_BLOCK;
      //分段加密
      while (inputLen - offSet > 0) {
      if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
      var bufTmp = buf.slice(offSet, endOffSet);
      bufs.push(crypto.privateEncrypt({key: privateKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
      } else {
      var bufTmp = buf.slice(offSet, inputLen);
      bufs.push(crypto.privateEncrypt({key: privateKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
      }
      offSet += MAX_ENCRYPT_BLOCK;
      endOffSet += MAX_ENCRYPT_BLOCK;
      }
      var result = Buffer.concat(bufs);
      //密文BASE64编码
      var base64Str = result.toString("base64");
      console.log(base64Str);
      return base64Str;
      }

    /**

    • 私钥解密

    • @param date

    • @returns {string}
      */
      function privateDecrypt(date) {

      //得到私钥
      var privatePem = fs.readFileSync(path.join(__dirname, "../../properties/rsa_private_key.pem"));
      var privateKey = privatePem.toString();
      //经过base64编码的密文转成buf
      var buf = new Buffer(date, "base64");

      //buf转byte数组
      //var inputLen = bytes(buf, "base64");
      var inputLen = buf.byteLength;
      //密文
      var bufs = [];
      //开始长度
      var offSet = 0;
      //结束长度
      var endOffSet = MAX_DECRYPT_BLOCK;
      //分段加密
      while (inputLen - offSet > 0) {
      if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
      var bufTmp = buf.slice(offSet, endOffSet);
      bufs.push(crypto.privateDecrypt({key: privateKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
      } else {
      var bufTmp = buf.slice(offSet, inputLen);
      bufs.push(crypto.privateDecrypt({key: privateKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
      }
      offSet += MAX_DECRYPT_BLOCK;
      endOffSet += MAX_DECRYPT_BLOCK;
      }
      var result = Buffer.concat(bufs).toString();
      console.log(result);
      //解密
      return result;
      }

    module.exports.publicEncrypt = publicEncrypt;
    module.exports.publicDecrypt = publicDecrypt;
    module.exports.privateEncrypt = privateEncrypt;
    module.exports.privateDecrypt = privateDecrypt;

    var str = cryptoUtil.publicEncrypt("123456789");//公钥加密
    var deStr = cryptoUtil.privateDecrypt(str);//私钥解密

    对称加密
    对称加密算法 加密解密同一个 1975年之前使用。
    非对称加密 使用公钥和私钥 转账信息 。
    散列算法 消息摘要的方式 对于不同长度的输入消息 输出长度成为原消息的散列 不能用来加密 因为是不可逆的。

    常用的对称加密:des 3des aes(射频设备使用)
    非对称加密:rsa dsa ecc更安全
    散列:md5 sha1 hmac
    其他算法:
    Base64
    https

  • 相关阅读:
    LightOJ
    Peter and Snow Blower
    Gena's Code
    nyoj139--我排第几个 (康拓展开)
    hdoj1394(归并排序)
    树状数组
    Poj 1113--Wall(凸集)
    hdoj1437 -- 天气情况
    hdoj1428 -- 漫步校园 (记忆化搜索)
    图像边缘检测
  • 原文地址:https://www.cnblogs.com/xiaocongcong888/p/10253908.html
Copyright © 2011-2022 走看看