今天在网上看到一篇不错的博客,里面讲到加密及解密的信息。其实我在公司里面用到的和这几乎一样,为了涉及保密等东西就把这篇文章分享给大家。
更多交流、更多了解:
QQ:444084929 [回钦波]
个人主面: http://www.huiqinbo.com
AES加解密算法,使用Base64做转码以及辅助加密:
package com.wintv.common;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/*******************************************************************************
* AES加解密算法
*
* @author arix04
*
*/
public class AES {
// 加密
public static String Encrypt(String sSrc, String sKey) throws Exception {
if (sKey == null) {
System.out.print("Key为空null");
return null;
}
// 判断Key是否为16位
if (sKey.length() != 16) {
System.out.print("Key长度不是16位");
return null;
}
byte[] raw = sKey.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); // 创建一个密钥
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/补码方式"
IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes());//使用CBC模式,需要一个向量iv,可增加加密算法的强度
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); //用密钥和一组算法参数初始化此 Cipher
byte[] encrypted = cipher.doFinal(sSrc.getBytes()); //按单部分操作加密或解密数据,或者结束一个多部分操作。
return new BASE64Encoder().encode(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。
}
// 解密
public static String Decrypt(String sSrc, String sKey) throws Exception {
try {
// 判断Key是否正确
if (sKey == null) {
System.out.print("Key为空null");
return null;
}
// 判断Key是否为16位
if (sKey.length() != 16) {
System.out.print("Key长度不是16位");
return null;
}
byte[] raw = sKey.getBytes("ASCII");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec("0102030405060708"
.getBytes());
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);//先用base64解密
try {
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original);
return originalString;
} catch (Exception e) {
System.out.println(e.toString());
return null;
}
} catch (Exception ex) {
System.out.println(ex.toString());
return null;
}
}
public static void main(String[] args) throws Exception {
/*
* 加密用的Key 可以用26个字母和数字组成,最好不要用保留字符,虽然不会错,至于怎么裁决,个人看情况而定
* 此处使用AES-128-CBC加密模式,key需要为16位。
*/
String cKey = "1234567890123456";
// 需要加密的字串
String cSrc = "Email : arix04@xxx.com";
System.out.println(cSrc);
// 加密
long lStart = System.currentTimeMillis();
String enString = AES.Encrypt(cSrc, cKey);
System.out.println("加密后的字串是:" + enString);
long lUseTime = System.currentTimeMillis() - lStart;
System.out.println("加密耗时:" + lUseTime + "毫秒");
// 解密
lStart = System.currentTimeMillis();
String DeString = AES.Decrypt(enString, cKey);
System.out.println("解密后的字串是:" + DeString);
lUseTime = System.currentTimeMillis() - lStart;
System.out.println("解密耗时:" + lUseTime + "毫秒");
}
}
AES加解密算法,使用byte2hex做转码:
package com.wintv.common;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/*******************************************************************************
* AES加解密算法
*
* @author arix04
*
*/
public class AES {
// 加密
public static String Encrypt(String sSrc, String sKey) throws Exception {
if (sKey == null) {
System.out.print("Key为空null");
return null;
}
// 判断Key是否为16位
if (sKey.length() != 16) {
System.out.print("Key长度不是16位");
return null;
}
byte[] raw = sKey.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes());
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(sSrc.getBytes());
return byte2hex(encrypted).toLowerCase();
}
// 解密
public static String Decrypt(String sSrc, String sKey) throws Exception {
try {
// 判断Key是否正确
if (sKey == null) {
System.out.print("Key为空null");
return null;
}
// 判断Key是否为16位
if (sKey.length() != 16) {
System.out.print("Key长度不是16位");
return null;
}
byte[] raw = sKey.getBytes("ASCII");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec("0102030405060708"
.getBytes());
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] encrypted1 = hex2byte(sSrc);
try {
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original);
return originalString;
} catch (Exception e) {
System.out.println(e.toString());
return null;
}
} catch (Exception ex) {
System.out.println(ex.toString());
return null;
}
}
public static byte[] hex2byte(String strhex) {
if (strhex == null) {
return null;
}
int l = strhex.length();
if (l % 2 == 1) {
return null;
}
byte[] b = new byte[l / 2];
for (int i = 0; i != l / 2; i++) {
b[i] = (byte) Integer.parseInt(strhex.substring(i * 2, i * 2 + 2),
16);
}
return b;
}
public static String byte2hex(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1) {
hs = hs + "0" + stmp;
} else {
hs = hs + stmp;
}
}
return hs.toUpperCase();
}
public static void main(String[] args) throws Exception {
/*
* 加密用的Key 可以用26个字母和数字组成,最好不要用保留字符,虽然不会错,至于怎么裁决,个人看情况而定
*/
String cKey = "1234567890123456";
// 需要加密的字串
String cSrc = "Email : arix04@xxx.com";
System.out.println(cSrc);
// 加密
long lStart = System.currentTimeMillis();
String enString = AES.Encrypt(cSrc, cKey);
System.out.println("加密后的字串是:" + enString);
long lUseTime = System.currentTimeMillis() - lStart;
System.out.println("加密耗时:" + lUseTime + "毫秒");
// 解密
lStart = System.currentTimeMillis();
String DeString = AES.Decrypt(enString, cKey);
System.out.println("解密后的字串是:" + DeString);
lUseTime = System.currentTimeMillis() - lStart;
System.out.println("解密耗时:" + lUseTime + "毫秒");
}
}
分享到:
相关推荐
java AES加密解密,使用 CBC 解密模式,EncryptByAes Aes加密 后 base64 再加 DecryptByAes Aes 解密,对 PKCS7 填充的数据进行反填充,对数据进行 PKCS7 填充 使用 CBC 解密模式, // aesDecrypt 解密 public ...
java代码实例 AES加密解密 Base64加密解密
Base64转码,AES加密解密,IOS,Android,Java 后台。 本工程可以直接使用,而且与IOS,Android,JAVA 已调通。 主要用于客户端进行通信,数据之间地安全性。对数据进行加密和解密。 适用于银行等较为保密的项目中。 ...
在这个压缩包中,包含的资源可以帮助我们理解并实现SHA1、SHA、MD5、AES加密与解密,以及BASE64编码和解码。下面我们将详细探讨这些加密算法和它们在Java中的实现。 1. **SHA(Secure Hash Algorithm)**: SHA是一...
在IT行业中,加密技术是确保数据安全的重要手段。...总的来说,理解并正确使用AES ECB Base64加密解密是微信小程序开发中保障数据安全的关键。通过合理的加密策略和安全实践,可以有效防止数据泄露,保护用户隐私。
总的来说,理解并正确使用Java实现AES加密和解密,需要注意秘钥的生成、工作模式的选择、填充方式以及字符编码的一致性,这样才能确保数据的安全传输和正确解密。通过实际操作和实践,你可以更深入地掌握这些知识点...
在Java中实现AES128加密解密,通常会使用Java Cryptography Extension (JCE) 提供的API。AES支持三种工作模式:ECB(Electronic Codebook)、CBC(Cipher Block Chaining)和CFB(Cipher Feedback)。其中,ECB是最...
标题中的“VB6.0 RSA/AES/Md5/Base64加密 解密 微信小程序 javascript 通用”表明这是一个关于编程的示例项目,主要涵盖了四种加密和解密技术:RSA、AES、MD5和Base64。这些技术在信息安全领域广泛应用于数据保护和...
* 编码工具类 * 1.将byte[]转为各种进制的字符串 * 2.base 64 encode * 3.base 64 decode ...结合base64实现md5加密 * 7.AES加密 * 8.AES加密为base 64 code * 9.AES解密 * 10.将base 64 code AES解密
通过这个案例,我们可以看到在Spring Boot项目中实现AES加密解密的基本步骤。然而,实际项目中还应考虑其他安全措施,例如使用HTTPS协议、密钥的动态生成和安全存储、以及对称加密与非对称加密的结合使用等,以增强...
在Java中实现AES加密解密,我们需要使用Java Cryptography Extension (JCE)库。以下是一些关键知识点: 1. 导入相关库: ```java import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import...
在这个场景中,"AES JS加密JAVA解密" 提到的是使用JavaScript进行AES加密,然后在Java环境中对加密后的数据进行解密的过程。下面我们将深入探讨这个主题。 首先,AES加密的基本原理是通过一个密钥和一系列复杂的...
总之,AES加密解密工具类在Java中实现涉及对Cipher类的熟练使用,理解加密模式和填充策略,以及正确管理和生成密钥和初始化向量。这个工具类使得开发者能够方便地在项目中集成加密功能,保障数据的安全。
本文将详细介绍如何在微信小程序中使用Base64和AES加密技术来增强数据安全性。 一、Base64编码 Base64是一种用于在网络上传输二进制数据的编码方式。它将每3个字节的数据转换为4个字符的文本字符串。在微信小程序中...
在实现AES加密解密时,要特别注意错误处理和数据完整性检查。例如,确保文件读取和写入的正确性,以及在解密过程中处理可能的异常。此外,www.willvc.com.cn 提供的资源可能是进一步学习和解决问题的途径。 总之,...
- 最后,如果需要,可以将加密后的字节数组转换回字符串,例如使用Base64编码。 2. **基于字节数组的AES加密**: - 这种方式与字符串加密类似,只是输入和输出都是字节数组,无需进行字符串编码和解码。 - 在...
通常,Java使用字节数组表示密钥,而JavaScript使用Base64编码的字符串,因此在前后端之间传递密钥时,需要进行适当的转换。 6. **安全实践**:虽然AES和MD5在很多场景下被广泛使用,但值得注意的是,MD5已经不被...
后端Java实现AES加密解密: 1. **导入依赖**:在Java中,我们需要添加Apache Commons Codec库来处理Base64编码,以及Java Cryptography Extension (JCE)来支持AES操作。确保JCE未受限制,因为默认情况下,Java对某些...
在这里,我们特别关注128位密钥长度的AES加密,使用ECB(Electronic Codebook)模式,配合PKCS5Padding填充策略,以及数据编码的BASE64和HEX转换。 首先,AES加密是一种分组密码,它将明文数据分成固定大小的块进行...
总的来说,跨语言的AES加密解密互通需要对各种语言的加密API有深入理解,并保持一致性以确保数据安全地在不同环境中传输。这个主题对于开发跨平台应用和微服务架构的开发者来说,是一个非常实用的知识点。