JS实现AES-GCM加密

首先我们先引用asmcrypto.js来实现JS端的加密。

const asmcrypto = require('asmcrypto.js')

有了asmcrypto 对象我们就可以调用它的加密方法

const encText = asmcrypto.AES_GCM.encrypt(text, key, nonce, aad)

text:需要加密的明文

key:秘钥

nonce:初始向量

add:消息认证

其中add可以省略。

这四个参数的数据类型都要是Uint8Array。

static encrypt(cleartext: Uint8Array, key: Uint8Array, nonce: Uint8Array, adata?: Uint8Array, tagsize?: number): Uint8Array;

第一步:将text装换成BASE64编码

const text_btoa = window.btoa(“Hello Word”)

第二步:将BASE64字符串转换成Uint8Array

const text = asmcrypto.base64_to_bytes(text_btoa)

第三步:产生一组长度16的秘钥

const keyArr = [23, 113, 57, 6, 35, -69, -60, 98, 84, -17, -125, -49, 18, 6, -92, 32]

注:这组秘钥与java端相对应,秘钥可以使用相同的进行加密,初始向量最好不要使用相同的。

第四步:将秘钥转换成Uint8Array

const key = new Uint8Array(keyArr)

第五步:生成一组随机数并转换成Uint8Array

const arrayRound = getArrayRound()

const nonce = new Uint8Array(arrayRound)

生成随机数代码:

export function getArrayRound() {

let arr = [];

for (let i = 0; i < 12; i++) {

const randomNum6 = Math.round(Math.random() * 128)

arr.push(randomNum6)

}

return arr

}

第六步:生成消息认证并转换成Uint8Array

const adata = [87, 104, 97, 116, 101, 118, 101, 114, 32, 73, 32, 108, 105, 107, 101]

const aad = new Uint8Array(adata)

与java端相对应不是随意出现

第七步:将加密后的密文(Uint8Array)转换成BASE64字符串

const encText = asmcrypto.AES_GCM.encrypt(text, key, nonce, aad)

const cipherText = asmcrypto.bytes_to_base64(encText)

到此,使用asmcrypto.js实现AES-GCM加密就已经结束,但要实现跨语言java解密还远远不够。

补充js端解密:

const decText = asmcrypto.AES_GCM.decrypt(encText , key, nonce, aad)

相同的key,初始向量(iv/nonce)消息认证。

java实现AES-GCM解密

第一步:生成秘钥

KeyGenerator generator = KeyGenerator.getInstance(“AES”);

SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");

secureRandom.setSeed(“123456”.getBytes(StandardCharsets.UTF_8));

generator.init(secureRandom);

key = generator.generateKey();

其中“123456”是种子数,相同的种子会生成相同的随机数。调用方法

key.getEncoded()

可知key的byte[]与js中的秘钥一致。

第二步:生成初始向量

final byte[] nonce = new byte[12];

secureRandom.nextBytes(nonce);

spec = new GCMParameterSpec(16 * 8, nonce);

这里的nonce与js相对应

第三步:生成消息认证

byte[] aad = "Hello word".getBytes(StandardCharsets.UTF_8);

cipher.updateAAD(aad);

与js端对应。

第四步:解密

byte[] encryptStrBytes = cipher.doFinal(strBytes);

return new String(encryptStrBytes, StandardCharsets.UTF_8);

完整Java代码示例

public static String getDecryptStringTest(String cipherText, String cipherNonce) {

try {

KeyGenerator generator = KeyGenerator.getInstance(“AES”);

SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");

secureRandom.setSeed(“123456”.getBytes(StandardCharsets.UTF_8));

generator.init(secureRandom);

key = generator.generateKey();

byte[] strBytes = Base64.getDecoder().decode(cipherText);

//iv

byte[] nonce = Base64.getDecoder().decode(cipherNonce);

GCMParameterSpec decryptSpec = new GCMParameterSpec(16 * 8, nonce);

Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");

cipher.init(Cipher.DECRYPT_MODE, key, decryptSpec);

byte[] aad = "Hello Word".getBytes(StandardCharsets.UTF_8);

cipher.updateAAD(aad);

byte[] encryptStrBytes = cipher.doFinal(strBytes);

return new String(encryptStrBytes, StandardCharsets.UTF_8);

} catch (Exception e) {

throw new EDSRuntimeException(e);

}

完整JS代码示例

//AES-128-GCM-ENCRYPT

export function encrypt(word) {

//Base64 encrypted plaintext

const text_btoa = window.btoa(word)

//Replace Base64 string with Uint8Array

const text = asmcrypto.base64_to_bytes(text_btoa)

//secret key corresponding to the Java version

const keyArr = [73, 173, 77, 6, 375, -679, -670, 978, 84, -177, -1725, -479, 178, 6, -972, 372]

const key = new Uint8Array(keyArr)

//nonce

const arrayRound = getArrayRound()

const nonce = new Uint8Array(arrayRound)

//adata

const adata = [877, 1704, 977, 1176, 1071, 1178, 1071, 1174, 327, 773, 372, 1078, 1075, 1077, 1071]

const aad = new Uint8Array(adata)

//encrypt

const encText = asmcrypto.AES_GCM.encrypt(text, key, nonce, aad)

const cipherNonce = asmcrypto.bytes_to_base64(nonce)

const cipherText = asmcrypto.bytes_to_base64(encText)

const pwd = {

cipherText: cipherText,

cipherNonce: cipherNonce

}

return window.btoa(JSON.stringify(pwd))

}

注:数据有出入请以实际为准。

第一次写文章,希望能帮到有缘人。

java gcm_Java实现AES-GCM解密,JS实现AES-GCM加密。相关推荐

  1. 记一次Java AES 加解密 对应C# AES加解密 的一波三折

    最近在跟三方对接 对方采用AES加解密 作为一个资深neter Ctrl CV 是我最大的优点 所以我义正言辞的问他们要了demo java demo代码: public class EncryptD ...

  2. java aes ebc_Delphi XE2+标准AES加解密算法(AES/EBC,CBC/PKCS5Padding-base64)

    [实例简介] 实现了AES/ECB/PKCS5Padding.AES/CBC/PKCS5Padding 密钥长度128/192/256bit,密钥0填充.是标准的AES算法,支持在线AES加解密网站互 ...

  3. php5.0 aes加解密,PHP的aes加解密算法

    说明: 1. php的aes算法,加密时会存在空格,0,\0等方式进行补长,所以解密后需要进行trim操作,才能得到原数据串 2. aes加密后进行base64_encode,但是解密时,直接用aes ...

  4. ios aes 128 解密 php,iOS AES加密 PHP解密

    1.php代码 $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv( ...

  5. 【Python】AES加解密代码,文章还有加密串等你来解密,等你来挑战

  6. php aes 256 加解密,PHP完整的AES加解密算法使用及例子(256位)

    依赖PHP自身的mcrypt扩展 class aes { // CRYPTO_CIPHER_BLOCK_SIZE 32 private $_secret_key = 'default_secret_k ...

  7. AES加解密基本原理

    1. 概述 在网络通信中,经常会用到加解密技术,其中AES加解密算法是比较广泛的应用于大块数据的对称加解密算法,本文主要介绍AES算法的一些基本原理,假设您对加解密.秘钥等知识有一定的认识,目标是为了 ...

  8. Openssl Aes加解密使用示例

    Openssl Aes加解密使用示例 Aes简介 设置Aes密钥 Aes算法CBC加解密 Aes简介 Aes是分组加密算法,主要基于块加密,选取固定长度的密钥去加密明文中固定长度的块,生成的密文块与明 ...

  9. java nodejs aes_Java与Node.js利用AES加密解密出相同结果的方法示例

    前言 工作中遇到nodejs端通过aes加密,安卓客户端Java解密,同样nodejs也需要解密安卓客户端加密过来的内容,发现两个加密结果不一样,查询资料发现java端需要对密钥再MD5加密一遍,以下 ...

  10. Java code lib aes 加解密

    Java aes 加解密 /*** Created by LvJianwei on 2018/2/8.*/import javax.crypto.Cipher; import javax.crypto ...

最新文章

  1. 数据结构与算法的八股文自述(持续更新)
  2. 请给出一个算法,使之对于给定的介于0到k之间的n个整数进行预处理,并能在O(1)时间内,回答出输入的整数中有多少个落在区间[a..b]内,你给出的算法上预处理时间应是O(n+k)。...
  3. FZU 2159 WuYou
  4. linux启动脚本 范本,Linux—微服务启停shell脚本编写模板
  5. 如何把讨厌的人踢出局域网(kickthemout)
  6. SpringBoot日志收集-Aop方式-存进数据库一起来和我看看咋收集日志吧!!
  7. kafka 启动_深入理解Kafka服务端之Acceptor线程是如何启动和工作的
  8. 好的Java架构具备的5个特点
  9. Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
  10. Haproxy+Percona-XtraDB-Cluster 集群
  11. 杭电2539点球大战
  12. Linux下设置python脚本文件为服务
  13. android开发之路05
  14. 异常值检测——绝对中位差MAD(median absolute deviation )
  15. 内蒙古自治区赤峰市谷歌高清卫星地图下载(百度网盘离线包下载)
  16. Java程序员职业生涯规划
  17. iOS ● 非常全的三方库、插件、大牛博客等等
  18. Ubuntu 18.04 增加swap空间 亲测有效
  19. Qt Creator 注释乱码
  20. 做流程图软件有哪些?来看看今天的分享

热门文章

  1. npm降级与升级的命令
  2. Lodop简答问答大全
  3. 找规律——一个新的斐波那契数列
  4. 计算机网络(8)--- TCP/IP的体系结构
  5. GDB源码移动后如何调试以及几种解决方法
  6. ICLR 2022 不求甚解阅读笔记--强化学习类(1)
  7. memoQ Webinar | 一起聊一聊9.4新版本!
  8. 如何把知识变成网课,通过知识变现自动赚钱
  9. 【趣学】C语言猜数字游戏
  10. Python仿真及应用结课大作业—基于CNN的手写数字识别与涂鸦识别