对称加密算法-DES
程序员文章站
2024-03-14 10:44:22
...
前言
在日常开发中,我们经常会用到各种加密算法,这里来和大家一起看看对称算法中的DES。对称加密算法的特点是算法公开,计算量小,加密速度快,加密效率高,优势在于加解密的高速度和长**时的难**性,但是,对称加密算法的安全性依赖于**,泄露**就意味着任何人都可以对加密的密文进行**。因此**的保护对于加密信息是否安全至关重要。常见的对称加密算法包括DES算法、3DES算法、AES算法。下面是一个DES的demo。
DES例子
import java.io.IOException;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class DesEncrypt {
// DES加***key
public static String key = "12345678";
// DES加密
public static String encryptDES(String plaintext) {
try {
SecureRandom random = new SecureRandom();
// 创建一个DESKeySpec对象
DESKeySpec desKey = new DESKeySpec(key.getBytes());
// 创建一个密匙工厂
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
// 将DESKeySpec对象转换成SecretKey对象
SecretKey securekey = keyFactory.generateSecret(desKey);
// Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance("DES");
// 用密匙初始化Cipher对象
cipher.init(cipher.ENCRYPT_MODE, securekey, random);
// 加密生成密文byte数组
byte[] cipherBytes = cipher.doFinal(plaintext.getBytes());
// 将密文byte数组转化为16进制密文
String ciphertext = byteToHex(cipherBytes);
return ciphertext;
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}
// DES解密
public static String decryptDES(String ciphertext) {
try {
SecureRandom random = new SecureRandom();
// 创建一个DESKeySpec对象
DESKeySpec desKey = new DESKeySpec(key.getBytes());
// 创建一个密匙工厂
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
// 将DESKeySpec对象转换成SecretKey对象
SecretKey securekey = keyFactory.generateSecret(desKey);
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance("DES");
// 用密匙初始化Cipher对象
cipher.init(cipher.DECRYPT_MODE, securekey, random);
// 将16进制密文转化为密文byte数组
byte[] cipherBytes = hexToByte(ciphertext);
// 真正开始解密操作
String plaintext = new String(cipher.doFinal(cipherBytes));
return plaintext;
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}
// 将byte转化为16进制
public static String byteToHex(byte[] bs) {
if (0 == bs.length) {
return "";
} else {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < bs.length; i++) {
String s = Integer.toHexString(bs[i] & 0xFF);
if (1 == s.length()) {
sb.append("0");
}
sb = sb.append(s.toUpperCase());
}
return sb.toString();
}
}
// 将16进制转化为byte
public static byte[] hexToByte(String ciphertext) {
byte[] cipherBytes = ciphertext.getBytes();
if ((cipherBytes.length % 2) != 0) {
throw new IllegalArgumentException("长度不为偶数");
} else {
byte[] result = new byte[cipherBytes.length / 2];
for (int i = 0; i < cipherBytes.length; i += 2) {
String item = new String(cipherBytes, i, 2);
result[i / 2] = (byte) Integer.parseInt(item, 16);
}
return result;
}
}
public static void main(String[] args) {
// 待加密内容
String str = "爱琴孩的博客";
String ciphertext = encryptDES(str);
System.out.println("加密后:" + ciphertext);
String plaintext = decryptDES(ciphertext);
System.out.println("解密后:" + plaintext);
}
}
上面的例子中对加密后的字节数组,转成16进制字符串。我们也可以对字节数组进行Base64编码处理,只需要调用下列方法
//字节数组转成base64编码
public static String byte2Base62(byte[] bytes) {
BASE64Encoder base64Encoder=new BASE64Encoder();
return base64Encoder.encode(bytes);
}
//base64字符串转成字节数组
public static byte[] base642byte(String base64Str) throws IOException {
BASE64Decoder base64Decoder =new BASE64Decoder();
return base64Decoder.decodeBuffer(base64Str);
}
演示效果如下
加密后:06B65B83FE389F9B1C095A61E3BD5D87C854D32FC0D83483
解密后:爱琴孩的博客
总结
DES加密算法在企业中使用需要注意,**长度不能过低。而且就算长度较长,随着计算机算力的提高,**也只是时间问题。如果涉及的东西安全性要求较高,最好不用DES。
上一篇: golang数据加解密
下一篇: Golang 加解密