实际开发中客户端与服务端的通信内容往往需要通过密文传输,本文将介绍可以实现Java与js的互相加解密的AES加密方式

Java语言实现

public class AESTest {

//static String data = "123456RWEQR";

static String key = "abcdef0123456789"; //16位

static String iv = "0123456789abcdef"; //16位

public static void main(String args[]) throws Exception {

System.out.println(encryptAES("123456"));

System.out.println(decryptAES(encryptAES("123456")));

}

public static String encryptAES(String data) throws Exception {

try {

Cipher cipher = Cipher.getInstance("AES/CBC/NOPadding"); //参数分别代表 算法名称/加密模式/数据填充方式

int blockSize = cipher.getBlockSize();

byte[] dataBytes = data.getBytes();

int plaintextLength = dataBytes.length;

if (plaintextLength % blockSize != 0) {

plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));

}

byte[] plaintext = new byte[plaintextLength];

System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);

SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");

IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);

byte[] encrypted = cipher.doFinal(plaintext);

return new sun.misc.BASE64Encoder().encode(encrypted);

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

public static String decryptAES(String data) throws Exception {

try {

byte[] encrypted1 = new BASE64Decoder().decodeBuffer(data);

Cipher cipher = Cipher.getInstance("AES/CBC/NOPadding");

SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");

IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

byte[] original = cipher.doFinal(encrypted1);

String originalString = new String(original);

return originalString;

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

}

js实现

需要引入 aes.js依赖包 密码:oeer

AES TEST

待加密值:123456RWEQR

$(function () {

var data = "123456RWEQR";

var key = CryptoJS.enc.Latin1.parse('abcdef0123456789');

var iv = CryptoJS.enc.Latin1.parse('0123456789abcdef');

//加密

var encrypted = CryptoJS.AES.encrypt(data, key, {

iv: iv,

mode: CryptoJS.mode.CBC,

padding: CryptoJS.pad.ZeroPadding

});

$("#p1").text("加密结果:"+encrypted.toString());

console.log(encrypted.toString())

//解密

var decrypted = CryptoJS.AES.decrypt(encrypted, key, {iv: iv, padding: CryptoJS.pad.ZeroPadding});

console.log(decrypted.toString(CryptoJS.enc.Utf8));

$("#p2").text("解密结果:"+decrypted.toString(CryptoJS.enc.Utf8));

})

AES四种常用的加密模式

对称/分组密码一般分为流加密(如OFB、CFB等)和块加密(如ECB、CBC等)。对于流加密,需要将分组密码转化为流模式工作。对于块加密(或称分组加密),如果要加密超过块大小的数据,就需要涉及填充和链加密模式。

一、 ECB(Electronic Code Book电子密码本)模式

ECB模式是最早采用和最简单的模式,它将加密的数据分成若干组,每组的大小跟加密密钥长度相同,然后每组都用相同的密钥进行加密。

优点:

1.简单; 2.有利于并行计算; 3.误差不会被传送;

缺点: 1.不能隐藏明文的模式; 2.可能对明文进行主动攻击; 因此,此模式适于加密小消息。

二、CBC(Cipher Block Chaining,加密块链)模式

优点:

1.不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。

缺点: 1.不利于并行计算; 2.误差传递; 3.需要初始化向量IV且必须是16字节

三、CFB(Cipher FeedBack Mode,加密反馈)模式

优点:

1.隐藏了明文模式; 2.分组密码转化为流模式; 3.可以及时加密传送小于分组的数据;

缺点: 1.不利于并行计算; 2.误差传送:一个明文单元损坏影响多个单元; 3.唯一的IV;

四、OFB(Output FeedBack,输出反馈)模式

优点:

1.隐藏了明文模式; 2.分组密码转化为流模式; 3.可以及时加密传送小于分组的数据;

缺点: 1.不利于并行计算; 2.对明文的主动攻击是可能的; 3.误差传送:一个明文单元损坏影响多个单元

AES三中数据填充方式

PKCS7Padding

Java不支持此方式

PKCS7Padding是缺几个字节就补几个字节的0

PKCS5Padding

JS不支持此方式

PKCS5Padding是缺几个字节就补充几个字节的几,例如缺8个字节,就补充8个字节的8

NOPadding

不补充字节

aes解密算法 java_AES算法实现Java和JS互通加解密相关推荐

  1. 前端CryptoJS和Java后端数据互相加解密(AES)

    目录 一.序言 二.关于前端CryptoJS 1.CryptoJS简单介绍 2.加密和填充模式选择 3.前端AES加解密示例 (1) cryptoutils工具类 (2) 测试用例 (3) 加解密后输 ...

  2. 前后端java+vue 实现rsa 加解密与摘要签名算法

    RSA有两个密钥,一个是公开的,称为公开密钥:一个是私密的,称为私密密钥. 特点: 公开密钥是对大众公开的,私密密钥是服务器私有的,两者不能互推得出. 用公开密钥对数据进行加密,私密密钥可解密:私密密 ...

  3. java实现国密加解密

    1. pom依赖 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-j ...

  4. 与非java语言使用RSA加解密遇到的问题:algid parse error, not a sequence

    遇到的问题 在一个与Ruby语言对接的项目中,决定使用RSA算法来作为数据传输的加密与签名算法.但是,在使用Ruby生成后给我的私钥时,却发生了异常:IOException: algid parse ...

  5. java实现对文件加解密操作

    源文件: 加密后的文件: 解密后的文件: package com.gblfy.test;import java.io.*;/*** java 实现对文件加解密的方法** @author gblfy* ...

  6. SM2加密解决java与iOS端加解密不配套问题

    SM2加密解决java与iOS端加解密不配套问题 问题描述 问题判定 代码 声明 问题描述 使用java开发的SM2加解密,由java层生成SM2公私钥,iOS.Android(因和java层一致,暂 ...

  7. JAVA实现PGP/GPG加解密

    注:文章皆为个人纪录,可用性请以最终结果为准,若有错还请大佬们指出,谢谢! 一.加解密的准备资料 1.1  公钥 (用于加密) 1.2  私钥(用于解密) 1.3   私钥key (用于验证私钥) 导 ...

  8. JS RC4加解密报文

    JS RC4加解密 RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,密钥长度可变.它加解密使用相同的密钥,因此也属于对称加密算法.RC4加密算法原理 , 对明文使用同一个密钥异或两 ...

  9. AES-GCM算法 Java与Python互相加解密

    文章目录 1. AES 2. AES的分组长度和秘钥长度 3.AES加密模式 4.AES-GCM 5. JAVA应用 5.1 生成密钥 5.2 加密 5.3 解密 6. Python应用 7. 测试一 ...

最新文章

  1. Java基础篇:反射
  2. Office365 用户同步排错思路
  3. 亚马逊智能语音助手Alexa大举招聘 放出400个职位
  4. static 变量初始化顺序的问题和解决方案
  5. 关于Google Storage的东西
  6. cocos2dx 学习笔记5 关于屏幕大小的问题
  7. neo4j limit
  8. 数据科学、机器学习和数据挖掘的差异
  9. CentOS 7 安装Dukto(局域网通信工具)
  10. TVS管的作用与原理是一样吗?
  11. Java使用PDFBox将一个 PDF 文档拆分为多个 PDF
  12. Attach机制实现完全解读
  13. MySQL的用户密码过期password_expired功能
  14. H5 图片自动适应高度
  15. 千亿美妆市场“野蛮生长”,悦瞳靠“假睫毛”能否“翘”动市场?
  16. 用大白菜装centos7_u盘安装centos 卡住大白菜怎么用u盘装win7系统
  17. Apache和Tomcat的整合过程(转载)
  18. 软件版本命名规范详解
  19. 基于java个人空间博客网站系统
  20. QT pri 文件的作用

热门文章

  1. httplistener java_可以使用异常HttpListener吗?
  2. 浅析python中的main函数_浅的意思
  3. Docker实践(五)docker部署MySQL5.7
  4. 【Unity开源项目精选】Entitas:Unity DOTS的先行者
  5. html和vue的区别,2018-09-16第四课 (v-html和v-text的区别,v-once和v-pre的区别,vue的生命周期,选项卡)...
  6. 不止命令行-自定义VS生成事件
  7. .NET库和向后兼容的技巧——第3部分
  8. IIS日志-网站运维的好帮手
  9. gdal mysql乱码_GDAL读取S-57海图数据中文属性值乱码问题解决(续)
  10. internal java compiler error_java字节码注入AOP作业心得