aes-gcm模式前端加解密(html页面 js)——使用node-forge库

node-forge

之前讲过了AES-GCM模式在vue中如何加解密,使用的是node自带的crypto模块,但是会有个问题,纯html页面中无法使用node.js中的api。

这时候我们需要用到一个库:node-forge(js, vue中都可使用)

npm地址:node-forge - npm

github地址:https://github.com/digitalbazaar/forge

官方列举的可以加解密的模式:

 使用

1:引入

  js:

<script src ="https://unpkg.com/node-forge@1.0.0/dist/forge.min.js "></script>

  vue: 

安装:npm install node-forge
在需要用的地方引入:import forge from 'node-forge'

 2:密钥

  const keyStr = '16位/24位/32位的密钥'   

  // 如果跟后端搭配加解密需要和后端约定好密钥  密钥必须一致

3:加密

  js

// 加密
    function encrypt(someBytes) {
      var iv =  forge.random.getBytesSync(12)  // 生成随机iv 12字节
      var cipher  = forge.cipher.createCipher('AES-GCM', keyStr); // 生成AES-GCM模式的cipher对象 并传入密钥
      cipher.start({
          iv: iv
      });
      cipher.update(forge.util.createBuffer(forge.util.encodeUtf8(someBytes)));
      cipher.finish();
      var encrypted = cipher.output;
      var tag = cipher.mode.tag;
      return btoa(iv+encrypted.data+tag.data)
    }

  vue

export function encrypt(word) {
  var iv = forge.random.getBytesSync(12) // 生成随机iv 12字节
  var cipher = forge.cipher.createCipher('AES-GCM', keyStr) // 生成AES-GCM模式的cipher对象 并传入密钥
  cipher.start({
    iv: iv
  })
  cipher.update(forge.util.createBuffer(forge.util.encodeUtf8(word)))
  cipher.finish()
  var encrypted = cipher.output
  var tag = cipher.mode.tag
  return window.btoa(iv + encrypted.data + tag.data)
}

4:解密

  js

function decrypt(someBytes) {
      someBytes = atob(someBytes)
      const iv = someBytes.slice(0, 12)
      const tag = someBytes.slice(-16)
      const data = someBytes.slice(12, someBytes.length - 16)
      var decipher = forge.cipher.createDecipher('AES-GCM', keyStr)
      decipher.start({
          iv: iv,
          tag: tag
      });
      decipher.update(forge.util.createBuffer(data))
      const pass = decipher.finish()
      if (pass) {
        return decipher.output.toString()
      }
    }

vue

export function decrypt(datamsg) {
  datamsg = window.atob(datamsg)
  const iv = datamsg.slice(0, 12)
  const tag = datamsg.slice(-16)
  const data = datamsg.slice(12, datamsg.length - 16)
  var decipher = forge.cipher.createDecipher('AES-GCM', keyStr)
  decipher.start({
    iv: iv,
    tag: tag
  })
  decipher.update(forge.util.createBuffer(data))
  const pass = decipher.finish()
  if (pass) {
    return decipher.output.toString()
  }
}

5:举个栗子

var str = '我是密码123.!'
var en = encrypt(str)
console.log(en)
var de = decrypt(en)
console.log(de)

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
好的,这个问题涉及到JS和Java的解密实现,我会尽力回答。首先,AES-GCM是一种高级密标准(Advanced Encryption Standard)的模式,它是一种块模式,可以提供密和认证功能。而PKCS5Padding是一种填充模式,它可以把不满足块大小的数据填充到块大小,以满足密算法的要求。 在Node.js中,可以使用node-forge提供的API实现AES-GCM密,示例代码如下: ```javascript const forge = require('node-forge'); // 密 function encrypt(plaintext, key, iv) { const cipher = forge.cipher.createCipher('AES-GCM', key); cipher.start({ iv: iv }); cipher.update(forge.util.createBuffer(plaintext)); cipher.finish(); return { ciphertext: cipher.output.toHex(), tag: cipher.mode.tag.toHex() }; } const plaintext = 'Hello, world!'; const key = forge.random.getBytesSync(32); const iv = forge.random.getBytesSync(12); const encrypted = encrypt(plaintext, key, iv); console.log(encrypted); ``` 在Java中,可以使用javax.crypto提供的API实现AES/GCM/PKCS5Padding解密,示例代码如下: ```java import javax.crypto.Cipher; import javax.crypto.spec.GCMParameterSpec; import javax.crypto.spec.SecretKeySpec; public class Decryptor { public static String decrypt(String ciphertext, String key, String iv, String tag) throws Exception { byte[] ct = hexStringToByteArray(ciphertext); byte[] k = hexStringToByteArray(key); byte[] i = hexStringToByteArray(iv); byte[] t = hexStringToByteArray(tag); Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5Padding"); SecretKeySpec keySpec = new SecretKeySpec(k, "AES"); GCMParameterSpec gcmSpec = new GCMParameterSpec(t.length * 8, i); cipher.init(Cipher.DECRYPT_MODE, keySpec, gcmSpec); cipher.update(ct); cipher.updateAAD(t); byte[] pt = cipher.doFinal(); return new String(pt); } private static byte[] hexStringToByteArray(String s) { int len = s.length(); byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16)); } return data; } } ``` 以上代码仅供参考,具体实现需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值