AES 加密模式
发布于: 2020 年 10 月 27 日
电码本模式(Electronic Codebook Book (ECB))
密码分组链接模式(Cipher Block Chaining (CBC))
计算器模式(Counter (CTR))
密码反馈模式(Cipher FeedBack (CFB))
输出反馈模式(Output FeedBack (OFB))
ECB 模式是将整个明文分成若干段相同的小段,然后对每一小段进行加密。
CBC 模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算,再与密钥进行加密。
CTR 模式不常见,在 CTR 模式中, 有一个自增的算子,这个算子用密钥加密之后输出和明文异或的结果得到密文,相当于一次一密。这种加密方式简单快速,安全可靠,而且可以并行加密,但是在计算器不能维持很长的情况下,密钥只能使用一次。
CFB 模式和 OFB 模式较为复杂,一般不用。
以下附上 java 加解密示例
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/**
* 加密
* @param key 秘钥
* @param initVector CBC模式中偏移量
* @param value 被加密字符串
* @return
*/
public static String encrypt(String key, String initVector, String value) {
try {
// IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec/*, iv*/);
byte[] encrypted = cipher.doFinal(value.getBytes());
/*Base64.Encoder encoder = Base64.getEncoder();*/
return parseByte2HexStr(encrypted/*encoder.encodeToString(encrypted)*/);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
* 解密
* @param key 秘钥
* @param initVector CBC模式中偏移量
* @param encrypted
* @return
*/
public static String decrypt(String key, String initVector, String encrypted) {
try {
// IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, skeySpec/*, iv*/);
// Base64.Decoder decoder = Base64.getDecoder();
byte[] original = cipher.doFinal(/*decoder.decode*/parseHexStr2Byte(encrypted));
return new String(original);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
public static String parseByte2HexStr(byte[] buf) {
StringBuffer sb = new StringBuffer();
for(int i = 0; i < buf.length; ++i) {
String hex = Integer.toHexString(buf[i] & 255);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex);
}
return sb.toString();
}
public static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr.length() < 1) {
return null;
} else {
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;
}
}
复制代码
划线
评论
复制
发布于: 2020 年 10 月 27 日阅读数: 96
Mars
关注
还未添加个人签名 2018.06.12 加入
还未添加个人简介
评论