Node Java相互使用AES-128-GCM对数据进行加密解密实现_宋峥清的博客-程序员宅基地

技术标签: Java  加密解密  node.js  前端(js/jsp/html/vue...)  AES-128-GCM  

在这里插入图片描述

Node代码

let crypto = require('crypto');

//偏移量 16位
const iv = "0123456789ABCDEF";
//密钥
const key = "0123456789ABCDEF";


//加密
function encodeAes(word) {
    
    if (!word) {
    
        return ''
    }
    if (typeof word != 'string') {
    
        word = JSON.stringify(word)
    }

    const md5 = crypto.createHash('md5');
    const result = md5.update(key).digest();
    const cipher = crypto.createCipheriv('aes-128-gcm', result, iv);
    const encrypted = cipher.update(word, 'utf8');
    const finalstr = cipher.final();
    const tag = cipher.getAuthTag();
    const res = Buffer.concat([encrypted, finalstr, tag]);
    return res.toString('base64');
}

//解密
function decodeAes(word) {
    
    if (!word) {
    
        return ''
    }
    const md5 = crypto.createHash('md5');
    const result = md5.update(key).digest();
    const decipher = crypto.createDecipheriv('aes-128-gcm', result, iv);
    const b = Buffer.from(word, 'base64')
    decipher.setAuthTag(b.subarray(b.length - 16));
    const str = decipher.update(Buffer.from(b.subarray(0, b.length - 16), 'hex'));
    const fin = decipher.final();
    const decryptedStr = new TextDecoder('utf8').decode(Buffer.concat([str, fin]))
    try {
    
        return JSON.parse(decryptedStr);
    } catch (e) {
    
        return decryptedStr
    }
}


let encodeStr = encodeAes('hello word');
console.log('加密后:' + encodeStr);
let decodeStr = decodeAes(encodeStr);
console.log('解密后:' + decodeStr);

Java代码

import java.security.MessageDigest;

import java.security.Security;

import java.util.Base64;

import javax.crypto.Cipher;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

/**
 * @Description 
 * @Date 13:43 2020/12/8
 **/
public class AesGcmUtil {
    

    
    /**
     * @Description  16位的密钥
     * @Date 13:43 2020/12/8
     **/
    public static final String KEY = "0123456789ABCDEF";

    private static final String IV = "0123456789ABCDEF";

    private static final String ALGORITHMSTR = "AES/GCM/NoPadding";

    private static final String DEFAULT_CODING = "utf-8";

    /**
     * 如果报错java.security.NoSuchProviderException: no such provider: BC,那么需要加上这一段,同时需要bcprov-jdk15on.jar
     */
    static {
    
        Security.addProvider(new BouncyCastleProvider());
    }

    /**
     * @Description 加密
     * @Date 14:25 2020/12/7
     **/
    public static String aesEncrypt(String content) throws Exception {
    
        byte[] input = content.getBytes(DEFAULT_CODING);
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] thedigest = md.digest(KEY.getBytes(DEFAULT_CODING));
        SecretKeySpec skc = new SecretKeySpec(thedigest, "AES");
        IvParameterSpec ivspec = new IvParameterSpec(IV.getBytes(DEFAULT_CODING));
        Cipher cipher = Cipher.getInstance(ALGORITHMSTR, "BC");
        cipher.init(Cipher.ENCRYPT_MODE, skc, ivspec);
        byte[] cipherText = new byte[cipher.getOutputSize(input.length)];
        int ctLength = cipher.update(input, 0, input.length, cipherText, 0);
        ctLength += cipher.doFinal(cipherText, ctLength);
        return Base64.getEncoder().encodeToString(cipherText);
    }


    /**
     * @Description 解密
     * @Date 14:26 2020/12/7
     **/
    public static String aesDecrypt(String tmp) throws Exception {
    
        byte[] keyb = KEY.getBytes(DEFAULT_CODING);
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] thedigest = md.digest(keyb);
        SecretKeySpec skey = new SecretKeySpec(thedigest, "AES");
        IvParameterSpec ivspec = new IvParameterSpec(IV.getBytes(DEFAULT_CODING));
        Cipher dcipher = Cipher.getInstance(ALGORITHMSTR, "BC");
        dcipher.init(Cipher.DECRYPT_MODE, skey, ivspec);
        byte[] clearbyte = dcipher.doFinal(Base64.getDecoder().decode(tmp));
        return new String(clearbyte, DEFAULT_CODING);
    }

    public static void main(String[] args) throws Exception {
    
        String origin = "这是Java端的加密解密";
        String encryptstr = aesEncrypt(origin);
        System.out.println(encryptstr);
        String decryptstr = aesDecrypt(encryptstr);
        System.out.println(decryptstr);

    }


}

就 先 说 到 这 \color{#008B8B}{ 就先说到这}
在 下 A p o l l o \color{#008B8B}{在下Apollo} Apollo
一 个 爱 分 享 J a v a 、 生 活 的 小 人 物 , \color{#008B8B}{一个爱分享Java、生活的小人物,} Java
咱 们 来 日 方 长 , 有 缘 江 湖 再 见 , 告 辞 ! \color{#008B8B}{咱们来日方长,有缘江湖再见,告辞!}

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pang_ping/article/details/110818088

智能推荐

Error:(30, 0) Could not find method implementation() for arguments [directory 'libs'] on object of t-程序员宅基地

将某Library作为一个工程依赖集成时,您的工程app中可能碰到如下报错:Error:(30, 0) Could not find method implementation() for arguments [directory ‘libs’] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.Defaul..._could not find method implementation() for arguments

e家数据挖掘_总结报告_新房 数据挖掘报告总结-程序员宅基地

总结报告一.商业理解总结在商业报告中所定义的商业目标是根据已有的铜陵地区客户数据建立关于e家客户响应规则集,通过该规则集来观察非e家客户的分布状态,预测潜在的e家客户,对针对性营销提供决策支持。通过数据挖掘我们得到了一个决策树模型和规则集,其中决策树用来展示每个字段下记录的数量以及e8客户和非e8客户占到该条件下总的客户的百分比,给人以直观清晰的展现;规则集则是用于预测潜在客户的一套规_新房 数据挖掘报告总结

谁会lobbyManager-程序员宅基地

有木有大神来分享一下怎么做啊,有木有demo可以看看的

蓝牙核心系统架构介绍_蓝牙架构-程序员宅基地

蓝牙规范有两类:一类是蓝牙核心规范,由Bluetooth CoreSpec定义,从Controller到Host的L2CAP层,以及相关的核心profile;另一类是蓝牙应用规范,包含了各种各样的profile规范,如HOGP、A2DP、HFP、OOP等。以下对蓝牙核心系统架构图中的相关层次作简单介绍:l BR/EDR Radio& LE Radio & AMP PHY蓝_蓝牙架构

百度自动驾驶apollo源码解读8:/cyber/sysmo 模块_apollo8.0代码调试-程序员宅基地

SysMo是一个用DECLARE_SINGLETON宏实现的单例类,在公开函数cyber::Init里面执行了SysMo::Instance进行实例化,SysMo构造函数执行了自己的Start函数,检测环境变量sysmo_start的值是否为1,若为1则开启一个线程不停的调用scheduler::Instance()->CheckSchedStatus,调用间隔为100毫秒,上述CheckSchedStatus函数执行逻辑是遍历所有执行器的快照状态,是否为空闲,若在干活则输出干了多长时间了以及协程的名字,线_apollo8.0代码调试

GAN入门(一):基本概念与手写数字生成实战_gan 入门-程序员宅基地

之前GAN网络是近两年深度学习领域的新秀,火的不行,本文旨在浅显理解传统GAN,分享学习心得。GAN的鼻祖之作是2014年NIPS一篇文章:Generative Adversarial Net(https://arxiv.org/abs/1406.2661),可以细细品味。本博客在研读该论文的基础上,为加深理解,使用GAN生成对抗式网络生成手写数字。GAN的基本思想我们知道GAN..._gan 入门

随便推点

数组---JavaScript学习笔记(5.15-5.16小结)-程序员宅基地

1.什么是数组?存储一堆变量 内存中连续存储多个数据的存储空间,再统一去个名字连续存储可以方便维护和查询2.何时使用数组?只要是连续存储多个数据,必须使用数组var arr4=new Array('cba',1000,true,"cba"); console.log(arr4[3])//取值 arr4[3] = 'ftp';//赋值 console.log(arr4[3...

mincs滑动取块代码-程序员宅基地

def img2col_py(Ipad, block_size): [row, col] = Ipad.shape row_block = row/block_size col_block = col/block_size block_num = int(row_block*col_block) img_col =torch.zeros([block_size**2, block_num]) count = 0 for x in range(0, ro

利用Python语言绘图_语言描述绘图项目-程序员宅基地

在Python语言中我们是通过利用turtle库来绘图的,turtle中文意思是海龟,turtle库是turtle绘图体系的Python实现,同时turtle库也是Python语言的标准库之一。绘图的过程其实就是控制海龟移动的过程,相当于我们平时用铅笔画图一样,这个铅笔就相当于海龟,我们通过控制这个铅笔来画出许多美丽的图形。绘制一个图形首先需要一个窗体,在操作系统中表现为一个窗口,在窗口中使用..._语言描述绘图项目

使用ssh远程执行命令批量导出数据库到本地(转)-程序员宅基地

前天正在跟前端的同事调试功能。服务器开好,模拟的玩家登录好,就在倒计时。这时突然运营的同事跑过来说要统计几个服务器玩家的一些情况,也就是需要从几个服的数据库导出部分玩家的数据。好吧,我看了一下时间,11:47。心想,跟前端调试完,去吃个饭再午休一下那就下午再给吧。没想对方来一句"就导个数据库而已,要这么久么?",而且还是直接跟我上司说的。我嚓,好吧,我导。可问题来了,平时的统计是由php做的..._ssh 命令结果导出

设置多行文本超出显示省略号,在手机端超出部分无法隐藏解决方法-程序员宅基地

方法一:跨浏览器兼容的方案比较靠谱简单的做法就是设置相对定位的容器高度,用包含省略号(…)的元素模拟实现;p{position:relative;line-height:1.4em;/* 3 times the line-height to show 3 lines */height:4.2em;overflow:hidden;}

机械臂抓取学习笔记四_机械臂抓取数据集_ljc_coder的博客-程序员宅基地

论文:Lightweight Convolutional Neural Network with Gaussian-based Grasping Representation forRobotic Grasping Detection摘要:在本文中,我们提出了一种高效、鲁棒的全卷积神经网络模型,用于从真实抓取场景的n通道输入图像进行机器人抓取姿态估计。所提出的网络是一种轻量级的生成架构,用于在一个阶段中抓取检测。具体地说,引入了基于Guassian核的抓取表示对训练样本进行编码,体现了最大中心点抓取_机械臂抓取数据集