常用加密算法及Java实现( 二 )

 
4、DESDES是对称的块加密算法 , 加解密的过程是可逆的 。
DES 加密算法是一种分组密码 , 以 64 位为 分组对数据 加密 , 它的密钥长度是56位 , 加密解密用同一算法 。
【常用加密算法及Java实现】DES 加密算法是对密钥进行保密 , 而公开算法 , 包括加密和解密算法 。这样 , 只有掌握了和发送方相同密钥的人才能解读由 DES加密算法加密的密文数据 。因此 , 破译 DES 加密算法实际上就是搜索密钥的编码 。对于56位长度的密钥来说 , 如果用穷举法来进行搜索的话 , 其运算次数为2^56次 。
java代码如下:
import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import java.util.Base64;public class DesUtils {private static final String UTF8 = "UTF-8";private static byte[] iv = {1, 2, 3, 4, 5, 6, 7, 8};/*** DES加密* @param plainText待加密内容* @param encryptKey加密key* @return* @throws Exception*/public static String encrypt(String plainText, String encryptKey) throws Exception {IvParameterSpec zeroIv = new IvParameterSpec(iv);SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES");Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);byte[] encryptedData = https://www.isolves.com/it/cxkf/sf/2023-03-02/cipher.doFinal(plainText.getBytes(UTF8));return new String(Base64.getEncoder().encode(encryptedData), UTF8);}/*** DES解密* @param encryptedText已加密内容* @param decryptKey解密key* @return* @throws Exception*/public static String decrypt(String encryptedText, String decryptKey) throws Exception {IvParameterSpec zeroIv = new IvParameterSpec(iv);SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes(UTF8), "DES");Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);byte decryptedData[] = cipher.doFinal(Base64.getDecoder().decode(encryptedText.getBytes(UTF8)));return new String(decryptedData, UTF8);} } 
5、AESAES是对称的块加密算法 , 加解密的过程是可逆的 。
AES 加密算法是密码学中的高级加密标准 , 该加密算法采用对称分组密码体制 , 密钥长度的最少支持为128位、 192位、256位 , 分组长度128位 , 算法应易于各种硬件和软件实现 。这种加密算法是美国联邦政府采用的区块加密标准 。
AES 本身就是为了取代 DES 的 , AES具有更好的安全性、效率和灵活性 。
java代码如下:
import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import java.security.SecureRandom; public class AesUtils {/*** 加密** @param content需要加密的内容* @param password 加密密码* @return*/public static String encrypt(String content, String password) throws Exception {StringBuilder sb = new StringBuilder();KeyGenerator kgen = KeyGenerator.getInstance("AES");SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");secureRandom.setSeed(password.getBytes());kgen.init(128, secureRandom);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);// 将10进制字节数组转化为16进制字符串for (int i = 0; i < result.length; i++) {String hex = Integer.toHexString(result[i] & 0xFF);if (hex.length() == 1) {hex = '0' + hex;}sb.append(hex.toUpperCase());}return sb.toString();}/*** 解密** @param content待解密内容* @param password 解密密钥* @return*/public static String decrypt(String content, String password) throws Exception {// 将16进制字符创转为10进制字节数组byte[] result = new byte[content.length() / 2];for (int i = 0; i < content.length() / 2; i++) {int high = Integer.parseInt(content.substring(i * 2, i * 2 + 1), 16);int low = Integer.parseInt(content.substring(i * 2 + 1, i * 2 + 2), 16);result[i] = (byte) (high * 16 + low);}KeyGenerator kgen = KeyGenerator.getInstance("AES");SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");secureRandom.setSeed(password.getBytes());kgen.init(128, secureRandom);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[] data = https://www.isolves.com/it/cxkf/sf/2023-03-02/cipher.doFinal(result);return new String(data);} }


推荐阅读