java 3DES加密解密
来源:互联网 发布:日语翻译公司知乎 编辑:程序博客网 时间:2024/04/29 00:00
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。
下面使用java实现3DES的加密解密:
import java.io.UnsupportedEncodingException;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class DESedeTest {
//算法DESede
private static final String Algorithm = "DESede";
//工作模式CBC(ECB),填充模式PKCS5Padding(NoPadding)
//eg: DESede/CBC/PKCS5Padding, DESede/ECB/PKCS5Padding
private static final String Transformation = "DESede/CBC/PKCS5Padding";
//向量iv,ECB不需要向量iv,CBC需要向量iv
//CBC工作模式下,同样的密钥,同样的明文,使用不同的向量iv加密 会生成不同的密文
private static final String Iv = "\0\0\0\0\0\0\0\0";
public static String encryptMode(byte[] keybyte, byte[] src) {
try {
// 根据给定的字节数组和算法构造一个密钥
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
// 加密
IvParameterSpec iv = new IvParameterSpec(Iv.getBytes());
Cipher c1 = Cipher.getInstance(Transformation);
c1.init(Cipher.ENCRYPT_MODE, deskey, iv);
return byte2hex(c1.doFinal(src));
} catch (java.security.NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
} catch (java.lang.Exception e3) {
e3.printStackTrace();
}
return null;
}
public static String byte2hex(byte[] b) { // 一个字节的数,
// 转成16进制字符串
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; // 转成大写
}
public static String encryptMode(String key, String src) throws UnsupportedEncodingException {
return encryptMode(getKeyByte(key), src.getBytes());
}
private static byte[] getKeyByte(String key) throws UnsupportedEncodingException {
// 加密数据必须是24位,不足补0;超出24位则只取前面的24数据
byte[] data = key.getBytes();
int len = data.length;
byte[] newdata = new byte[24];
System.arraycopy(data, 0, newdata, 0, len > 24 ? 24 : len);
return newdata;
}
public static String decryptMode(byte[] keybyte, byte[] src) {
try {
// 生成密钥
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
// 解密
IvParameterSpec iv = new IvParameterSpec(Iv.getBytes());
Cipher c1 = Cipher.getInstance(Transformation);
c1.init(Cipher.DECRYPT_MODE, deskey, iv);
byte[] data = c1.doFinal(src);
return new String(data);
} catch (java.security.NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
} catch (java.lang.Exception e3) {
e3.printStackTrace();
}
return null;
}
public static byte[] hex2byte(byte[] b) {
if ((b.length % 2) != 0)
throw new IllegalArgumentException("长度不是偶数");
byte[] b2 = new byte[b.length / 2];
for (int n = 0; n < b.length; n += 2) {
String item = new String(b, n, 2);
// 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个进制字节
b2[n / 2] = (byte) Integer.parseInt(item, 16);
}
return b2;
}
/**
* @param args
* @throws UnsupportedEncodingException
*/
public static void main(String[] args) throws UnsupportedEncodingException {
String key = "QAZWSXEDCTGFREDW@#$%";
String src = "01234567890123456789";
System.out.println("原始数据:" + src);
String encryptData = encryptMode(key, src);
System.out.println("加密数据:" + encryptData);
String decryptData = decryptMode(getKeyByte(key), hex2byte(encryptData.getBytes()));
System.out.println("解密数据:" + decryptData);
}
}
运行结果:
原始数据:01234567890123456789
加密数据:b7353c592bd46ff6515b6d11dcb2704b6e5de20986630b21
解密数据:01234567890123456789
- java 3DES加密解密
- java 3DES加密、解密
- JAVA 3DES加密解密
- JAVA 3DES加密/解密
- java--des加密解密
- java DES加密解密
- java DES加密解密
- java DES加密解密
- Java DES加密解密
- Java DES 加密解密
- java DES加密解密
- java DES加密解密
- JAVA DES加密解密
- JAVA DES加密解密
- java des加密解密
- DES/3DES加密,解密
- JAVA和C# 3DES加密解密
- java的3DES加密/解密
- oracle 序列
- 各种视频编码器的命令行格式
- logback与Log4J的区别
- unity3d 团队合作 SVN版本控制
- 字节流与字符流
- java 3DES加密解密
- 系数线性系统地加速处理
- linux用户与组
- 每天学点Linux:七
- OC对象序列化
- 等式变换,任意数字整合【编程】
- 英语词汇
- SQL语句查询数字拼接的字符串中的某个数字
- My97DatePicker日期控件用法