package com.duowan.yy.sysop.aes.decrypt;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/**
* AES 加密/解密操作
*
* 加密思想 : 将二进制数据转换为16进制保存在数据库(为防止出错) 加密算法为 AES
*
* CRM 项目使用的是 NOpadding 模式(param:content,key,iv)
* @author Administrator
*
*/
public class AEScrypt {
/**
*
* @param content 加密对象
* @param key 密钥
* @param iv IV
* @return
* @throws Exception
*/
public static byte[] encrypt(String content,String key,String iv) throws Exception {
try {
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
int len = content.getBytes("UTF-8").length;
int m = len % 16;
if (m != 0) {
for (int i = 0; i < 16 - m; i++) {
content += " ";
}
}
byte[] dataBytes = content.getBytes();
int plaintextLength = dataBytes.length;
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 encrypted;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
*
* @param content 解密内容
* @param key 解密密钥
* @param iv IV
* @return
* @throws Exception
*/
public static byte[] desEncrypt(byte[] content,String key,String iv) throws Exception {
try
{
byte[] encrypted1 = content;
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);
return original;
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**解密
* @param content 待解密内容
* @param password 解密密钥
* @return
*/
public static byte[] decrypt(byte[] content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 创建密码器
cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(content);
return result; // 加密
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}
/**
* 加密
*
* @param content 需要加密的内容
* @param password 加密密码
* @return
*/
public static byte[] encrypt(String content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 创建密码器
byte[] byteContent = content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(byteContent);
return result; // 加密
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}
/**将16进制转换为二进制
* @param hexStr
* @return
*/
public static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr.length() < 1)
return null;
byte[] result = new byte[hexStr.length()/2];
for (int i = 0;i< hexStr.length()/2; i++) {
int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
/**将二进制转换成16进制
* @param buf
* @return
*/
public static String parseByte2HexStr(byte buf[]) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}
/*
* @return true---是Windows操作系统
*/
public static boolean isWindowsOS(){
boolean isWindowsOS = false;
String osName = System.getProperty("os.name");
if(osName.toLowerCase().indexOf("windows")>-1){
isWindowsOS = true;
}
return isWindowsOS;
}
/**
* 功能:判断一个字符串是否包含特殊字符
* @param string 要判断的字符串
* @return true 只包含指定字符范围 返回true
*
* @return false 含有指定字符之外的 返回false
*/
public static boolean isConSpeCharacters(String string) {
// TODO Auto-generated method stub
if(string.replaceAll("[a-z]*[A-Z]*[0-9]", "").length()==0){
//如果不包含特殊字符
return true;
}
return false;
}
public static boolean isMobiles(String string) {
// TODO Auto-generated method stub
if(string.replaceAll("[0-9]|-|-", "").trim().length()==0){
//如果不包含特殊字符
return true;
}
return false;
}
public static boolean isCharacter(String string) {
// TODO Auto-generated method stub
if(string.replaceAll("[a-z][A-Z]", "").trim().length()==0){
//如果不包含特殊字符
return true;
}
return false;
}
}
分享到:
相关推荐
- 最后,如果需要,可以将加密后的字节数组转换回字符串,例如使用Base64编码。 2. **基于字节数组的AES加密**: - 这种方式与字符串加密类似,只是输入和输出都是字节数组,无需进行字符串编码和解码。 - 在...
java AES加密解密,使用 CBC 解密模式,EncryptByAes Aes加密 后 base64 再加 DecryptByAes Aes 解密,对 PKCS7 填充的数据进行反填充,对数据进行 PKCS7 填充 使用 CBC 解密模式, // aesDecrypt 解密 public ...
在C#中,可以使用BitConverter类将字节数组转换为十六进制字符串,反之亦然。 总结来说,C#实现的十六进制AES加解密结合了强大的加密算法和方便的数据表示方式,提供了可靠的数据安全解决方案。`ByteUtil.cs`和`...
`parseByte2HexStr`方法将字节数组转换为十六进制字符串,这允许在日志、存储或显示时以人类可读的形式表示加密数据。相反,`parseHexStr2Byte`方法将十六进制字符串转换回字节数组,以便于解密。 在实际应用中,...
AES 加密的代码网上有很多,但是90%都只能对 16位字符串进行加密,经过两天的研究,修改完善了这个 可以对任意字符长度的字符串进行加密的VC++源代码,这个是本人努力的成果,像大家收点费用,希望谅解。 OK 制作 ...
总的来说,"C/C++与Java互通AES加密解密"是一个挑战性的任务,需要对加密算法、数据类型转换、内存管理以及跨平台通信有深入的理解。通过这个实践,开发者可以提升自己的编程技巧,并对数据安全有更深刻的认识。
在这个示例中,密钥首先是以字符串形式存在,然后通过`Hex.decodeHex()`方法将其从Hex编码转换回原始的字节数组,这是因为AES算法需要字节形式的密钥。如果密钥是经过Hex编码的,那么在使用之前必须进行解码。 接...
4. 将加密后的字节数组转换回字符串,可以使用Base64编码以方便存储和传输。 ```java String encodedCipherText = Base64.getEncoder().encodeToString(cipherTextBytes); ``` 解密过程与加密类似,只是在初始化`...
- 在加密前,将字符串转换成一个无`0`终止的字节数组,这样加密过程中不会受到`0`的影响。 - 在解密后,恢复字符串时重新添加`0`结束符,确保C风格字符串的正确性。 - 使用固定长度的缓冲区进行操作,确保无论字符串...
这样,我们就可以将字符串分成多个128位的块,然后逐个进行AES加密或解密。 AES的加密过程包括几个步骤:初始轮密钥扩展、多个轮的子密钥应用、字节替换(S盒操作)、行移位、列混淆以及最后的轮密钥加法。解密过程...
5. 将解密后的字节数组转换回原始字符串。 在实际开发中,为了提高安全性,通常会使用更复杂的密钥管理策略,例如密钥派生函数(KDF),以及密钥存储或共享机制。同时,由于AES-ECB模式的安全性限制,对于大段数据...
总的来说,跨语言的AES加密解密互通需要对各种语言的加密API有深入理解,并保持一致性以确保数据安全地在不同环境中传输。这个主题对于开发跨平台应用和微服务架构的开发者来说,是一个非常实用的知识点。
总结来说,"aes.rar"中的内容提供了C语言实现的AES加密算法,支持任意长度的文件和字符串加密。通过对文件"aes.cpp"的分析和使用,开发者可以学习如何在C语言环境中高效且安全地应用AES加密技术。
2. **API接口**:可能定义了用于加密和解密字符串的函数,如`encrypt_string()`和`decrypt_string()`,这两个函数通常接受明文字符串和密钥作为输入,返回加密后的结果或解密后的明文。 3. **示例代码**:可能包含...
在QT C++中实现AES加密解密,开发者通常会使用如QCryptographicHash、QSslCipher等QT提供的安全库。类库可能包含以下关键部分: 1. 密钥和初始化向量(IV)的管理:AES加密需要一个密钥和一个可选的初始化向量。...
这个程序应当包含了上述知识点的具体应用,你可以通过阅读源代码、编译和运行来进一步理解和学习AES加密解密的实现细节。这个实战例程可以帮助开发者更好地掌握Qt环境下的加密解密操作,提高数据安全保护能力。
在提供的`AesCode`文件中,很可能包含了实现AES加密的代码示例,这可能包括了密钥的生成、加密和解密的函数,以及如何处理字符串和文件的细节。通常,这样的代码库会提供API供开发者调用,以方便在项目中集成加密...
### 知识点详解 #### 一、AES加密算法简介 **高级加密标准(Advanced Encryption Standard,AES)**是一种对称加密算法...通过以上介绍,我们可以了解到如何在Java中实现AES加密解密的基本流程,以及相关的注意事项。
这个程序是由丁健使用Crypto++库在VC6环境下编写的,用于实现16字节字符的AES加密和解密功能。 Crypto++是一个开源的C++类库,包含了各种密码学算法,包括对称加密、非对称加密、哈希函数、消息认证码等。AES在...
c# AES加密128位(16字节)CBC模式 NOPadding 网上代码好少16进制的所有贡献给大家