public class AES {
static byte [] iv = { 0x38 , 0x37 , 0x36 , 0x35 , 0x34 , 0x33 , 0x32 , 0x31 , 0x38 ,
0x37 , 0x36 , 0x35 , 0x34 , 0x33 , 0x32 , 0x31 };
public AES() {
}
/**
*
* @param kbs
* @return
*/
private static byte[] getKeyBytes(byte[] kbs) {
if (kbs.length >= 32) {
byte[] result = new byte[32];
System.arraycopy(kbs, 0, result, 0, 32);
return result;
} else if (kbs.length >= 24) {
byte[] result = new byte[24];
System.arraycopy(kbs, 0, result, 0, 24);
return result;
} else if(kbs.length>=16){
byte[] result = new byte[16];
System.arraycopy(kbs, 0 , result, 0 , 16);
return result;
} else{
byte[] result = new byte[16];
System.arraycopy(kbs, 0 , result, 0 , kbs.length);
return result;
}
}
/**
*
* @param kbs
* @return
* @throws NoSuchAlgorithmException
*/
private static byte[] getIV(byte[] kbs) throws NoSuchAlgorithmException{
byte[] result = new byte[16];
byte[] md5 = md5(kbs);
System.arraycopy(md5, 0, result, 0, Math.min(md5.length, 16));
for(int i=15;i>-1;i--){
if(result[i]==0){result[i]=(byte) (0x38-i);}
}
return result;
}
/**
* 对字符串进行MD5加密
* @param str
* @return
* @throws NoSuchAlgorithmException
*/
public static byte[] md5(byte[] str) throws NoSuchAlgorithmException {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(str);
return md5.digest();
}
/**
* 加密
* @param content 需要加密的内容
* @param keyWord 加密密钥
* @return byte[] 加密后的字节数组
*/
public static byte[] encrypt(String content, String keyWord) {
try {
BufferedBlockCipher engine = new PaddedBufferedBlockCipher(
new CBCBlockCipher( new AESFastEngine()));
byte[] contentBytes = content.getBytes("UTF-8");
byte[] kbs = keyWord.getBytes("UTF-8");
engine.init(true , new ParametersWithIV(
new KeyParameter(getKeyBytes(kbs)),getIV(kbs)));
byte [] enc = new byte [engine.getOutputSize(contentBytes.length)];
int size1 = engine.processBytes(contentBytes, 0 , contentBytes.length, enc, 0 );
//System.out.println(size1);
int size2;
size2 = engine.doFinal(enc, size1);
//System.out.println("size2 =" +size2);
byte [] encryptedContent = new byte [size1+size2];
System.arraycopy(enc, 0 , encryptedContent, 0 , encryptedContent.length);
// System.out.println("Encrypted Content:" );
return Hex.encode(encryptedContent);
} catch (DataLengthException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (InvalidCipherTextException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
/**
* @param content 需要加密的内容
* @param password 加密密钥
* @return String 加密后的字符串
*/
public static String encrypttoStr(String content, String password){
try {
return new String(encrypt(content,password),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
/**解密
* @param content 待解密内容
* @param keyWord 解密密钥
* @return byte[]
*/
public static byte[] decrypt(byte[] content, String keyWord) {
try {
BufferedBlockCipher engine = new PaddedBufferedBlockCipher(
new CBCBlockCipher( new AESFastEngine()));
byte[] kbs = keyWord.getBytes("UTF-8");
engine.init(false , new ParametersWithIV(
new KeyParameter(getKeyBytes(kbs)),getIV(kbs)));
byte [] dec = new byte [engine.getOutputSize(content.length)];
int size1 = engine.processBytes(content, 0 , content.length, dec, 0 );
//System.out.println(size1);
int size2 = engine.doFinal(dec, size1);
//System.out.println("size2 =" +size2);
byte [] decryptedContent = new byte [size1+size2];
System.arraycopy(dec, 0 , decryptedContent, 0 , decryptedContent.length);
//System.out.println("Decrypted Content:" );
return decryptedContent;
} catch (DataLengthException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (InvalidCipherTextException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
/**
* @param content 待解密内容(字符串)
* @param keyWord 解密密钥
* @return byte[]
*/
public static byte[] decrypt(String content, String keyWord) {
try {
return decrypt(hex2byte(content),keyWord);
// return decrypt(content.getBytes("UTF-8"),keyWord);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
*
* @param strhex
* @return
*/
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;
}
/**
*
* @param b
* @return
*/
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();
}
/**
*
* @param args
*/
public static void main(String[] args) {
String content = "/app/RptQueryAction_indexRptQuery.action";
content="/app/rptDataAction_viewRptDataOnPage.action" +
"?dimList=RANGE%3a0%3a%25E5%2585%25A8%25E8%25BE%2596%7cUPINSTCODE%3a810000000012%3a%25E6" +
"%25B7%25B1%25E5%259C%25B3%25E5%25B8%2582%25E5%2588%2586%25E8%25A1%258C%7cCURRKIND%3a1%3a"+
"%25E6%259C%25AC%25E5%25B8%2581" +
"&rptDataVO.sbjcod=005" +
"&rptDataVO.rptcod=CR0116" +
"&rptDataVO.rptdte=20111031&rptDataVO.cfgbsl=20060101" +
"&rptDataVO.rptnam=%25E5%2588%2586%25E6%2594%25AF%25E6%259C%25BA%25E6%259E%2584%25E8" +
"%25B4%25B7%25E6%25AC%25BE%25E8%25B4%25A8%25E9%2587%258F%25E6%2583%2585%25E5%2586" +
"%25B5%25E8%25A1%25A8%25EF%25BC%2588%25E5%258D%2581%25E4%25BA%258C%25E7%25BA%25A7" +
"%25E5%2588%2586%25E7%25B1"+
"%25BB%25EF%25BC%2589";
String Key = "rsp";
//加密
System.err.println("加密前:" + content);
String encryptResult = encrypttoStr(content, Key);
System.err.println("加密后:" + encryptResult);
//解密
byte[] decryptResult = decrypt(encryptResult,"rsp");
System.err.println("解密后:" + new String(decryptResult));
}
}
- 浏览: 50496 次
- 性别:
- 来自: 北京
相关推荐
本资源"Delphi.rar_AES_AES加密_delphi AES加密_delphi 加解密_java delphi aes"提供的是在Delphi编程环境中实现AES加密和解密的示例代码,其目标是与Java平台上的加解密过程保持兼容。 首先,让我们深入了解一下...
### AES加密算法在Delphi中的实现 AES(Advanced Encryption Standard,高级加密标准)是一种对称加密算法,被广泛应用于数据安全领域。它采用固定的数据块大小(128位),支持128、192或256位密钥长度。在Delphi中...
在处理加密过程中,可能会遇到“非法参数”异常,这通常是因为输入数据长度不符合AES加密的要求。AES加密算法有固定的数据块大小,对于AES-128,这个大小是16个字节(或128位)。当输入数据长度不是16字节的倍数时,...
在"STM32F103程序AES加密.zip"这个压缩包中,包含了STM32F103使用AES加密的示例代码。通过分析这个例程,我们可以学习如何配置硬件AES模块,设置密钥,以及如何进行数据的加密和解密操作。以下是一些关键知识点: 1...
AES加密算法基于替换和置换的原理,它使用了固定的区块大小128位,并有三种密钥长度:128位、192位和256位。在AES加密过程中,数据被分为128位的数据块,然后经过多次的混合和轮变换,使得原始数据变得难以破解。 ...
C++实现AES加密通常涉及到几个关键概念和步骤,这些在"VS2013下调试的c++ AES加密"资源中应该都有涵盖。 1. **AES算法原理**: AES是一种分组密码,它将明文数据分割成128位的块,并使用相同的密钥对每个块进行...
AES加密算法Dll是一个用于在项目中实现AES加密功能的动态链接库(Dll)文件。AES,全称为“高级加密标准”(Advanced Encryption Standard),是一种广泛应用于数据加密的标准算法,尤其在网络安全、数据保护和隐私...
VB6-AES加密算法源码是一个用于VB6(Visual Basic 6)开发环境的加密工具,它实现了AES(Advanced Encryption Standard)加密标准。AES是一种广泛使用的对称加密算法,为数据提供高强度的安全保护。该源码经过验证,...
标题 "新建 WinRAR 压缩文件.rar_AES_AES 加密_STM32 aes加密" 指涉了一个关于使用AES(高级加密标准)加密技术的项目,特别提到了它与STM32微控制器的结合。这个压缩包包含了实现AES加密的源代码文件,如`aes.c`和...
在Qt中,我们可以利用QCryptographicHash、QByteArray和QBuffer等类来实现AES加密和解密。 1. **AES加密算法**: AES有三种不同的密钥长度,即128位(AES_128)、192位(AES_192)和256位(AES_256)。这些长度的选择直接...
3. **密钥扩展**:AES的密钥长度可以不同,但都需要通过密钥扩展转换成多个轮密钥,这是AES加密过程的关键步骤。 4. **初始化上下文**:调用库提供的函数初始化AES上下文,比如在OpenSSL中,可以使用`AES_set_...
AES加密算法,全称为Advanced Encryption Standard,是一种广泛应用的对称加密算法,因其高效性和安全性而备受推崇。在Delphi7这个古老的编程环境中,实现AES加密同样是非常重要的,特别是在保护数据安全、实现通信...
Android 使用 AES 加密和解密文件实例代码 在 Android 应用程序中,使用 AES(Advanced Encryption Standard)加密和解密文件是一种常见的安全措施。本文将详细介绍 Android 使用 AES 加密和解密文件的实例代码,并...
《AES加密解密实验报告》 AES,全称为高级加密标准(Advanced Encryption Standard),是密码学领域中的一个重要标准,由美国联邦政府采纳,用于替换原有的DES加密算法。AES由比利时密码学家Joan Daemen和Vincent ...
AES加密算法,全称为Advanced Encryption Standard,是一种广泛应用的对称加密技术,用于保护数据的机密性。在C++环境中实现AES加密算法,通常涉及到的关键概念包括密钥、明文、密文、加密过程和解密过程。源码中...
"本地图片AES加密解密"是一个针对这个问题提出的技术方案,旨在保护存储在本地设备上的图片不被未经授权的第三方访问。AES(Advanced Encryption Standard)加密是一种广泛应用的对称加密算法,因其高效和安全性而...
AES加密算法有三个主要的变种:AES-128、AES-192和AES-256,分别使用128位、192位和256位的密钥,其中AES-128已经足够安全,但对于高度敏感的数据,AES-256提供了更高的安全性。 在描述中提到的问题,即“网上很多...
本项目以Qt为开发环境,提供了一个AES加密程序的实现,对于初学者而言,这是一个很好的学习资源。 首先,我们来了解一下AES加密算法。AES是一种块密码,它将明文数据分为128位的块进行处理。它使用了固定长度的密钥...
通常,开发者会使用像cryptoJs这样的库来实现AES加密和解密功能,因为它提供了方便的API。然而,在某些情况下,我们可能需要不依赖任何特定库来实现AES,而是直接使用JavaScript原生功能或自定义代码。这个场景描述...
这个文件可能包含了实现AES加密解密功能的源代码、示例、文档或其他相关资源,帮助开发者在Qt5应用程序中集成AES加密。 **总结** AES加密算法是现代加密的标准之一,常用于保护数据的安全。在Qt5开发中,可以方便...