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

发布时间 - 2026-01-10 23:16:26    点击率:

前言

工作中遇到nodejs端通过aes加密,安卓客户端Java解密,同样nodejs也需要解密安卓客户端加密过来的内容,发现两个加密结果不一样,查询资料发现java端需要对密钥再MD5加密一遍,以下是Java与Node.js利用AES加密解密出相同结果的方法,需要的朋友们下面来一起学习学习吧。

JAVA代码如下:

package g.g;

import java.security.MessageDigest;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class AesECB {
 public static final String DEFAULT_CODING = "utf-8"; 
  
 /** 
  * 解密 
  * @author lmiky 
  * @date 2014-2-25 
  * @param encrypted 
  * @param seed 
  * @return 
  * @throws Exception 
  */ 
 private static String decrypt(String encrypted, String seed) throws Exception { 
  byte[] keyb = seed.getBytes(DEFAULT_CODING); 
  MessageDigest md = MessageDigest.getInstance("MD5"); 
  byte[] thedigest = md.digest(keyb); 
  SecretKeySpec skey = new SecretKeySpec(thedigest, "AES"); 
  Cipher dcipher = Cipher.getInstance("AES"); 
  dcipher.init(Cipher.DECRYPT_MODE, skey); 
 
  byte[] clearbyte = dcipher.doFinal(toByte(encrypted)); 
  return new String(clearbyte); 
 } 
 
 /** 
  * 加密 
  * @author lmiky 
  * @date 2014-2-25 
  * @param content 
  * @param key 
  * @return 
  * @throws Exception 
  */ 
 public static String encrypt(String content, String key) 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"); 
  Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
  cipher.init(Cipher.ENCRYPT_MODE, skc); 
   
  byte[] cipherText = new byte[cipher.getOutputSize(input.length)]; 
  int ctLength = cipher.update(input, 0, input.length, cipherText, 0); 
  ctLength += cipher.doFinal(cipherText, ctLength); 
    
  return parseByte2HexStr(cipherText); 
 } 
  
 /** 
  * 字符串转字节数组 
  * @author lmiky 
  * @date 2014-2-25 
  * @param hexString 
  * @return 
  */ 
 private static byte[] toByte(String hexString) { 
  int len = hexString.length() / 2; 
  byte[] result = new byte[len]; 
  for (int i = 0; i < len; i++) { 
   result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2), 16).byteValue(); 
  } 
  return result; 
 } 
  
 /** 
  * 字节转16进制数组 
  * @author lmiky 
  * @date 2014-2-25 
  * @param buf 
  * @return 
  */ 
 private static String parseByte2HexStr(byte buf[]) { 
  StringBuffer sb = new StringBuffer(); 
  for (int i = 0; i < buf.length; i++) { 
   String hex = Integer.toHexString(buf[i] & 0xFF); 
   if (hex.length() == 1) { 
    hex = '0' + hex; 
   } 
   sb.append(hex); 
  } 
  return sb.toString(); 
 } 
  
 public static void main(String[] args) throws Exception { 
  System.out.println(AesECB.encrypt("fsadfsdafsdafsdafsadfsadfsadf", "1eVRiqy7b9Uv7ZMM")); 
  System.out.println(AesECB.decrypt("b123e2d9199598c0e3f1999dc9e723387b68e29d2b3a0d59fc7d5946c750c6b4", "1eVRiqy7b9Uv7ZMM")); 
 }
}

Node.js代码如下:

var crypto = require('crypto');
exports.aes_algorithm = "aes-128-ecb";
exports.aes_secrect = "1eVRiqy7b9Uv7ZMM";

exports.encrypt = function (text) {
 var cipher = crypto.createCipher(this.aes_algorithm, this.aes_secrect)
 var crypted = cipher.update(text, 'utf8', 'hex')
 crypted += cipher.final('hex');
 return crypted;
};

exports.decrypt = function (text) {
 var decipher = crypto.createDecipher(this.aes_algorithm, this.aes_secrect)
 var dec = decipher.update(text, 'hex', 'utf8')
 dec += decipher.final('utf8');
 return dec;
};

//var hw = this.encrypt("fsadfsdafsdafsdafsadfsadfsadf");
//console.log(hw);
//console.log(this.decrypt(hw));

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# nodejs  # aes加密解密  # java  # aes加密解密算法  # Node.js 数据加密传输浅析  # Node.js实现前端后端数据传输加密解密  # 客户端  # 一遍  # 朋友们  # 这篇文章  # 谢谢大家  # 加密解密  # 有疑问  # seed  # encrypted  # Exception  # private  # return  # throws  # lmiky  # date  # author  # utf  # param  # DEFAULT_CODING  # dcipher 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在云主机上快速搭建多站点网站?  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  详解vue.js组件化开发实践  Laravel如何创建自定义中间件?(Middleware代码示例)  JavaScript如何实现类型判断_typeof和instanceof有什么区别  网站优化排名时,需要考虑哪些问题呢?  微信h5制作网站有哪些,免费微信H5页面制作工具?  iOS中将个别页面强制横屏其他页面竖屏  网易LOFTER官网链接 老福特网页版登录地址  Swift中switch语句区间和元组模式匹配  如何正确下载安装西数主机建站助手?  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  昵图网官网入口 昵图网素材平台官方入口  Firefox Developer Edition开发者版本入口  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  高防服务器:AI智能防御DDoS攻击与数据安全保障  如何在新浪SAE免费搭建个人博客?  香港服务器如何优化才能显著提升网站加载速度?  Laravel怎么清理缓存_Laravel optimize clear命令详解  百度浏览器如何管理插件 百度浏览器插件管理方法  网站制作软件有哪些,制图软件有哪些?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  独立制作一个网站多少钱,建立网站需要花多少钱?  JS弹性运动实现方法分析  网站制作价目表怎么做,珍爱网婚介费用多少?  Android GridView 滑动条设置一直显示状态(推荐)  如何用搬瓦工VPS快速搭建个人网站?  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  Mybatis 中的insertOrUpdate操作  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  Linux后台任务运行方法_nohup与&使用技巧【技巧】  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  如何快速启动建站代理加盟业务?  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  音乐网站服务器如何优化API响应速度?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  Laravel如何生成URL和重定向?(路由助手函数)  Bootstrap CSS布局之列表  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  Python数据仓库与ETL构建实战_Airflow调度流程详解  如何用IIS7快速搭建并优化网站站点?  BootStrap整体框架之基础布局组件