aes解密算法 java_AES算法实现Java和JS互通加解密
实际开发中客户端与服务端的通信内容往往需要通过密文传输,本文将介绍可以实现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互通加解密相关推荐
- 前端CryptoJS和Java后端数据互相加解密(AES)
目录 一.序言 二.关于前端CryptoJS 1.CryptoJS简单介绍 2.加密和填充模式选择 3.前端AES加解密示例 (1) cryptoutils工具类 (2) 测试用例 (3) 加解密后输 ...
- 前后端java+vue 实现rsa 加解密与摘要签名算法
RSA有两个密钥,一个是公开的,称为公开密钥:一个是私密的,称为私密密钥. 特点: 公开密钥是对大众公开的,私密密钥是服务器私有的,两者不能互推得出. 用公开密钥对数据进行加密,私密密钥可解密:私密密 ...
- java实现国密加解密
1. pom依赖 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-j ...
- 与非java语言使用RSA加解密遇到的问题:algid parse error, not a sequence
遇到的问题 在一个与Ruby语言对接的项目中,决定使用RSA算法来作为数据传输的加密与签名算法.但是,在使用Ruby生成后给我的私钥时,却发生了异常:IOException: algid parse ...
- java实现对文件加解密操作
源文件: 加密后的文件: 解密后的文件: package com.gblfy.test;import java.io.*;/*** java 实现对文件加解密的方法** @author gblfy* ...
- SM2加密解决java与iOS端加解密不配套问题
SM2加密解决java与iOS端加解密不配套问题 问题描述 问题判定 代码 声明 问题描述 使用java开发的SM2加解密,由java层生成SM2公私钥,iOS.Android(因和java层一致,暂 ...
- JAVA实现PGP/GPG加解密
注:文章皆为个人纪录,可用性请以最终结果为准,若有错还请大佬们指出,谢谢! 一.加解密的准备资料 1.1 公钥 (用于加密) 1.2 私钥(用于解密) 1.3 私钥key (用于验证私钥) 导 ...
- JS RC4加解密报文
JS RC4加解密 RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,密钥长度可变.它加解密使用相同的密钥,因此也属于对称加密算法.RC4加密算法原理 , 对明文使用同一个密钥异或两 ...
- AES-GCM算法 Java与Python互相加解密
文章目录 1. AES 2. AES的分组长度和秘钥长度 3.AES加密模式 4.AES-GCM 5. JAVA应用 5.1 生成密钥 5.2 加密 5.3 解密 6. Python应用 7. 测试一 ...
最新文章
- Java基础篇:反射
- Office365 用户同步排错思路
- 亚马逊智能语音助手Alexa大举招聘 放出400个职位
- static 变量初始化顺序的问题和解决方案
- 关于Google Storage的东西
- cocos2dx 学习笔记5 关于屏幕大小的问题
- neo4j limit
- 数据科学、机器学习和数据挖掘的差异
- CentOS 7 安装Dukto(局域网通信工具)
- TVS管的作用与原理是一样吗?
- Java使用PDFBox将一个 PDF 文档拆分为多个 PDF
- Attach机制实现完全解读
- MySQL的用户密码过期password_expired功能
- H5 图片自动适应高度
- 千亿美妆市场“野蛮生长”,悦瞳靠“假睫毛”能否“翘”动市场?
- 用大白菜装centos7_u盘安装centos 卡住大白菜怎么用u盘装win7系统
- Apache和Tomcat的整合过程(转载)
- 软件版本命名规范详解
- 基于java个人空间博客网站系统
- QT pri 文件的作用
热门文章
- httplistener java_可以使用异常HttpListener吗?
- 浅析python中的main函数_浅的意思
- Docker实践(五)docker部署MySQL5.7
- 【Unity开源项目精选】Entitas:Unity DOTS的先行者
- html和vue的区别,2018-09-16第四课 (v-html和v-text的区别,v-once和v-pre的区别,vue的生命周期,选项卡)...
- 不止命令行-自定义VS生成事件
- .NET库和向后兼容的技巧——第3部分
- IIS日志-网站运维的好帮手
- gdal mysql乱码_GDAL读取S-57海图数据中文属性值乱码问题解决(续)
- internal java compiler error_java字节码注入AOP作业心得