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("0304050607080910".getBytes());//使用CBC模式,需要一个向量iv,可增加加密算法的强度
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
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("0304050607080910".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 + "毫秒");
}
}
分享到:
相关推荐
在QT中实现AES CBC加密和解密,我们需要以下步骤: 1. **导入必要的库**:首先,我们需要包含QT的加密库`#include <QtCrypto>`,这个库提供了QCA(Qt Cryptography Architecture)模块,支持多种加密算法,包括AES...
QT框架下的AES CBC加密是一种广泛应用于数据保护的技术,它结合了高效的安全算法和一种模式来确保数据的机密性。AES(Advanced Encryption Standard)是美国国家标准技术研究所(NIST)制定的一种高级加密标准,用于...
微信小程序 AES CBC加密源码js微信小程序 AES CBC加密源码js
aescbc加密 代码片段 function getScrKey(pubExponent,modulus,srcStr){ var publicKey = RSAUtils.getKeyPair(pubExponent, '', modulus); var enStr = RSAUtils.encryptedString(publicKey, srcStr); ...
本教程将详细解释C++中使用AES CBC模式进行加密的方法,并结合openssl库进行实践。 AES,即高级加密标准,是由NIST(美国国家标准与技术研究所)于2001年制定的一种块密码算法,取代了之前的DES(Data Encryption ...
java实现aes加密,采用cbc模式,PKCS5Padding填充,key ALLINPAYRISKERR0,偏移量IV 0000000000000000,hex输出 。
该项目是一款基于Java语言的密码加密器,采用AES CBC加密算法实现离线记录密码功能,源代码包含48个文件,其中包括30个Java类文件、10个Java源文件、2个Git忽略文件、2个XML配置文件以及2个Markdown文件等。...
使用`AES_set_encrypt_key()`函数来设置密钥,`AES_cbc_encrypt()`函数用于执行CBC加密。 3. **CBC模式**: 在CBC模式下,每个明文块首先与上一个密文块异或,然后用密钥加密。第一个明文块会与IV异或,因为没有前一...
接下来,我们需要创建一个实现AES-128 CBC加密的函数,使用QDataStream处理输入的QByteArray: ```cpp QByteArray encryptAES128CBC(QByteArray plaintext, QByteArray key, QByteArray iv) { // 创建加密器 ...
c# AES加密128位(16字节)CBC模式 NOPadding 网上代码好少16进制的所有贡献给大家
标题中的"AES_CBC.zip_AES_CBC.zip_cbc_cbc加密_ship5vd_基于CBC的AES"表明这个压缩包文件主要涉及的是AES(Advanced Encryption Standard)加密算法,并且使用了CBC(Cipher Block Chaining)模式。AES是一种广泛...
总之,这个资源提供了基于VC6.0的AES CBC加密解密源码,可以帮助开发者理解和实现AES加密算法,同时通过"AesTest"进行功能验证,确保代码的正确性。对于需要在C++环境中实现AES加密解密的项目,这是一个宝贵的参考...
总结来说,JS前端实现AES-CBC加密解密,主要依赖于如crypto-js这样的第三方库,通过设置密钥、初始向量和填充方式,可以有效地保护敏感数据。在实际应用中,注意密钥的管理和传递,确保安全性。同时,前端加密仅提供...
2. `aes_cbc.c`:这是另一个C语言源文件,很可能是实现AES CBC加密算法的核心代码。它可能包含了初始化密钥、执行加密和解密操作的函数。在UBI设备中使用AES CBC,可能是为了在存储或传输数据时对其进行加密,防止...
在提供的源代码中,`AesCBC.h`和`AesCBC.cpp`文件包含了AES CBC模式的实现,支持128位、192位和256位的密钥长度。这些文件可能包含以下功能: 1. 密钥扩展:AES的密钥扩展算法会根据输入的原始密钥生成一系列轮密钥...
AES,即高级加密标准(Advanced Encryption Standard),是一种广泛使用的对称加密算法,具有高安全性、高效性和灵活性。在C#编程环境中,我们可以利用.NET框架提供的System.Security.Cryptography命名空间中的类来...
在Java中实现AES-128-CBC加密解密,你需要以下关键步骤: 1. 导入必要的库:`javax.crypto.Cipher`,`java.security.SecureRandom`,`java.util.Base64`等。 2. 创建密钥:首先,你需要一个128位的密钥。可以使用`...