1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 3 【java数据安全】对称加密的5种(DES/3DES AES IDEA PBE)常见算法的使用示例

3 【java数据安全】对称加密的5种(DES/3DES AES IDEA PBE)常见算法的使用示例

时间:2024-02-13 21:35:39

相关推荐

3 【java数据安全】对称加密的5种(DES/3DES AES IDEA PBE)常见算法的使用示例

java数据安全 系列文章

1、【java数据安全】数据安全之加密解密(base64、MD、SHA、DES、AES、IDEA、PBE、DH、RSA、EIGamal)、数字签名(DSA、ECDSA)和数字证书介绍、应用示例详细介绍

2、【java数据安全】base64与报文摘要MD(md5、sha、mac)简单介绍及应用场景、示例

3、【java数据安全】对称加密的5种(DES/3DES、AES、IDEA、PBE)常见算法的使用示例

4、【java数据安全】非对称加密算法(DH、RSA、EIGamal/DSA)的介绍、应用场景和示例

5、【java数据安全】数字签名的三种算法(RSA、DSA和ECDSA)使用示例

6、【java数据安全】数字信封介绍及实现流程

7、【java数据安全】国家商用密码介绍及对称加密、非对称加密使用示例(一)

8、【java数据安全】国家商用密码介绍及数字签名、密钥交换、密钥编码格式使用示例(二)

文章目录

java数据安全 系列文章一、maven依赖二、对称加密算法1、介绍2、DES1)、介绍2)、应用场景3)、DES示例1、实现源码2、testNG测试 4)、3DES示例1、实现源码2、testNG测试 3、AES1)、介绍2)、应用场景3)、示例1、实现源码2、testNG测试 4、IDEA1)、介绍2)、应用场景3)、示例1、实现源码2、testNG测试 5、PBE1)、介绍2)、应用场景3)、示例1、实现源码2、testNG测试

本文简单的介绍了对称加密的5种(DES/3DES、AES、IDEA、PBE)常见算法的使用示例,并给出推荐的应用示例。

一、maven依赖

<dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>6.9.10</version></dependency><!-- /artifact/commons-codec/commons-codec --><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.11</version></dependency><!-- /artifact/org.bouncycastle/bcprov-jdk15on --><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.60</version></dependency>

二、对称加密算法

1、介绍

对称加密就是加密与解密拥有相同的密钥,根据加密方式可分为密码和分组密码。

分组密码工作模式可分为ECB、CBC、CFB、OFB和CTR等,密钥长度决定了加密算法的安全性。

常见的加密算法有DES或3DES、AES和RC系列算法,除此之外,还有Blowfish、Twofish、Serpent、IDEA和PBE等。

2、DES

1)、介绍

DES(Data Encryption Standard)数据加密标准,其衍生算法有DESede(3DES),由于安全性的原因AES逐步替代DES。

2)、应用场景

应用于安全性要求不高的对称加密场景,基本上不用DES,3DES是其替代。

3)、DES示例

以下是jdk实现示例

1、实现源码

import java.security.Key;import java.security.SecureRandom;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESKeySpec;/*** @author alan 11月16日*/public class DESCoder {/*** 密钥算法 <br>* Java 6 只支持56bit密钥 <br>* Bouncy Castle 支持64bit密钥*/public static final String KEY_ALGORITHM = "DES";/*** 加密/解密算法 / 工作模式 / 填充方式*/public static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5PADDING";/*** 转换密钥* * @param key* 二进制密钥* @return Key 密钥* @throws Exception*/private static Key toKey(byte[] key) throws Exception {// 实例化DES密钥材料DESKeySpec dks = new DESKeySpec(key);// 实例化秘密密钥工厂SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);// 生成秘密密钥SecretKey secretKey = keyFactory.generateSecret(dks);return secretKey;}/*** 解密* * @param data* 待解密数据* @param key* 密钥* @return byte[] 解密数据* @throws Exception*/public static byte[] decrypt(byte[] data, byte[] key) throws Exception {// 还原密钥Key k = toKey(key);// 实例化Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);// 初始化,设置为解密模式cipher.init(Cipher.DECRYPT_MODE, k);// 执行操作return cipher.doFinal(data);}/*** 加密* * @param data* 待加密数据* @param key* 密钥* @return byte[] 加密数据* @throws Exception*/public static byte[] encrypt(byte[] data, byte[] key) throws Exception {// 还原密钥Key k = toKey(key);// 实例化Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);// 初始化,设置为加密模式cipher.init(Cipher.ENCRYPT_MODE, k);// 执行操作return cipher.doFinal(data);}/*** 生成密钥 <br>* Java 6 只支持56bit密钥 <br>* Bouncy Castle 支持64bit密钥 <br>* * @return byte[] 二进制密钥* @throws Exception*/public static byte[] initKey() throws Exception {/** 实例化密钥生成器* * 若要使用64bit密钥注意替换 将下述代码中的KeyGenerator.getInstance(CIPHER_ALGORITHM);* 替换为KeyGenerator.getInstance(CIPHER_ALGORITHM, "BC");*/KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);/** 初始化密钥生成器 若要使用64bit密钥注意替换 将下述代码kg.init(56); 替换为kg.init(64);*/kg.init(56, new SecureRandom());// 生成秘密密钥SecretKey secretKey = kg.generateKey();// 获得密钥的二进制编码形式return secretKey.getEncoded();}}

2、testNG测试

import static org.testng.Assert.assertEquals;import mons.codec.binary.Base64;import org.testng.annotations.Test;/*** @author alan 11月16日*/public class DESCoderTest {@Testpublic final void test() throws Exception {String inputStr = "DES";byte[] inputData = inputStr.getBytes();System.err.println("原文:\t" + inputStr);// 初始化密钥byte[] key = DESCoder.initKey();System.err.println("密钥:\t" + Base64.encodeBase64String(key));// 加密inputData = DESCoder.encrypt(inputData, key);System.err.println("加密后:\t" + Base64.encodeBase64String(inputData));// 解密byte[] outputData = DESCoder.decrypt(inputData, key);String outputStr = new String(outputData);System.err.println("解密后:\t" + outputStr);// 校验assertEquals(inputStr, outputStr);}}

4)、3DES示例

以下是jdk实现示例

1、实现源码

import java.security.Key;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESedeKeySpec;/*** @author alan 11月16日*/public class DESedeCoder {public static final String KEY_ALGORITHM = "DESede";/*** 加密/解密算法 / 工作模式 / 填充方式 Java 6支持PKCS5PADDING填充方式 Bouncy* Castle支持PKCS7Padding填充方式*/public static final String CIPHER_ALGORITHM = "DESede/ECB/PKCS5Padding";/*** 转换密钥* * @param key* 二进制密钥* @return Key 密钥* @throws Exception*/private static Key toKey(byte[] key) throws Exception {// 实例化DES密钥材料DESedeKeySpec dks = new DESedeKeySpec(key);// 实例化秘密密钥工厂SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);// 生成秘密密钥SecretKey secretKey = keyFactory.generateSecret(dks);return secretKey;}/*** 解密* * @param data* 待解密数据* @param key* 密钥* @return byte[] 解密数据* @throws Exception*/public static byte[] decrypt(byte[] data, byte[] key) throws Exception {// 还原密钥Key k = toKey(key);/** 实例化 使用PKCS7Padding填充方式 Cipher.getInstance(CIPHER_ALGORITHM, "BC");*/Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);// 初始化,设置为解密模式cipher.init(Cipher.DECRYPT_MODE, k);// 执行操作return cipher.doFinal(data);}/*** 加密* * @param data* 待加密数据* @param key* 密钥* @return byte[] 加密数据* @throws Exception*/public static byte[] encrypt(byte[] data, byte[] key) throws Exception {// 还原密钥Key k = toKey(key);/** 实例化 使用PKCS7Padding填充方式 Cipher.getInstance(CIPHER_ALGORITHM, "BC");*/Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);// 初始化,设置为加密模式cipher.init(Cipher.ENCRYPT_MODE, k);// 执行操作return cipher.doFinal(data);}/*** 生成密钥 <br>* * @return byte[] 二进制密钥* @throws Exception*/public static byte[] initKey() throws Exception {// 实例化KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);/** DESede 要求密钥长度为 112位或168位*/kg.init(168);// 生成秘密密钥SecretKey secretKey = kg.generateKey();// 获得密钥的二进制编码形式return secretKey.getEncoded();}}

2、testNG测试

import static org.testng.Assert.assertEquals;import mons.codec.binary.Base64;import org.testng.annotations.Test;/*** @author alan 11月16日*/public class DESedeCoderTest {@Testpublic final void test() throws Exception {String inputStr = "DESede";byte[] inputData = inputStr.getBytes();System.err.println("原文:\t" + inputStr);// 初始化密钥byte[] key = DESedeCoder.initKey();System.err.println("密钥:\t" + Base64.encodeBase64String(key));// 加密inputData = DESedeCoder.encrypt(inputData, key);System.err.println("加密后:\t" + Base64.encodeBase64String(inputData));// 解密byte[] outputData = DESedeCoder.decrypt(inputData, key);String outputStr = new String(outputData);System.err.println("解密后:\t" + outputStr);// 校验assertEquals(inputStr, outputStr);}}

3、AES

1)、介绍

AES(Advanced Encryption Standard)高级数据加密标准,作为DES算法的替代。AES算法具有密钥建立时间短、灵敏性好、内存需求低等优点,应用比较广泛。

2)、应用场景

作为DES的替代,在对称加密中一般场合的首选。

3)、示例

以下是jdk实现示例

1、实现源码

import java.security.Key;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;/*** @author alan 11月16日*/public class AESCoder {public static final String KEY_ALGORITHM = "AES";/*** 加密/解密算法 / 工作模式 / 填充方式 Java 6支持PKCS5Padding填充方式 Bouncy* Castle支持PKCS7Padding填充方式*/public static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";/*** 转换密钥* * @param key* 二进制密钥* @return Key 密钥* @throws Exception*/private static Key toKey(byte[] key) throws Exception {// 实例化AES密钥材料SecretKey secretKey = new SecretKeySpec(key, KEY_ALGORITHM);return secretKey;}/*** 解密* * @param data* 待解密数据* @param key* 密钥* @return byte[] 解密数据* @throws Exception*/public static byte[] decrypt(byte[] data, byte[] key) throws Exception {// 还原密钥Key k = toKey(key);/** 实例化 使用PKCS7Padding填充方式,按如下方式实现 Cipher.getInstance(CIPHER_ALGORITHM, "BC");*/Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);// 初始化,设置为解密模式cipher.init(Cipher.DECRYPT_MODE, k);// 执行操作return cipher.doFinal(data);}/*** 加密* * @param data* 待加密数据* @param key* 密钥* @return byte[] 加密数据* @throws Exception*/public static byte[] encrypt(byte[] data, byte[] key) throws Exception {// 还原密钥Key k = toKey(key);/** 实例化 使用PKCS7Padding填充方式,按如下方式实现 Cipher.getInstance(CIPHER_ALGORITHM, "BC");*/Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);// 初始化,设置为加密模式cipher.init(Cipher.ENCRYPT_MODE, k);// 执行操作return cipher.doFinal(data);}/*** 生成密钥 <br>* * @return byte[] 二进制密钥* @throws Exception*/public static byte[] initKey() throws Exception {// 实例化KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);/** AES 要求密钥长度为 128位、192位或 256位*/kg.init(256);// 生成秘密密钥SecretKey secretKey = kg.generateKey();// 获得密钥的二进制编码形式return secretKey.getEncoded();}}

2、testNG测试

import static org.testng.Assert.assertEquals;import mons.codec.binary.Base64;import org.testng.annotations.Test;/*** @author alan 11月16日*/public class AESCoderTest {@Testpublic final void test() throws Exception {String inputStr = "AES";byte[] inputData = inputStr.getBytes();System.err.println("原文:\t" + inputStr);// 初始化密钥byte[] key = AESCoder.initKey();System.err.println("密钥:\t" + Base64.encodeBase64String(key));// 加密inputData = AESCoder.encrypt(inputData, key);System.err.println("加密后:\t" + Base64.encodeBase64String(inputData));// 解密byte[] outputData = AESCoder.decrypt(inputData, key);String outputStr = new String(outputData);System.err.println("解密后:\t" + outputStr);// 校验assertEquals(inputStr, outputStr);}}

4、IDEA

1)、介绍

IDEA(International Data Encryption Algorithm)国际数据加密算法是一种对称分组密码,其密钥长度为128位,数据块大小为64位,目前常用的场景是邮件加密算法。

2)、应用场景

目前常用的场景是邮件加密算法

3)、示例

以下是bouncy castle实现示例

1、实现源码

import java.security.Key;import java.security.Security;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import org.bouncycastle.jce.provider.BouncyCastleProvider;/*** @author alan 11月16日*/public class IDEACoder {public static final String KEY_ALGORITHM = "IDEA";/*** 加密/解密算法 / 工作模式 / 填充方式*/public static final String CIPHER_ALGORITHM = "IDEA/ECB/PKCS5Padding";/*** 转换密钥* * @param key* 二进制密钥* @return Key 密钥* @throws Exception*/private static Key toKey(byte[] key) throws Exception {// 生成秘密密钥SecretKey secretKey = new SecretKeySpec(key, KEY_ALGORITHM);return secretKey;}/*** 解密* * @param data* 待解密数据* @param key* 密钥* @return byte[] 解密数据* @throws Exception*/public static byte[] decrypt(byte[] data, byte[] key) throws Exception {// 加入BouncyCastleProvider支持Security.addProvider(new BouncyCastleProvider());// 还原密钥Key k = toKey(key);// 实例化Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);// 初始化,设置为解密模式cipher.init(Cipher.DECRYPT_MODE, k);// 执行操作return cipher.doFinal(data);}/*** 加密* * @param data* 待加密数据* @param key* 密钥* @return byte[] 加密数据* @throws Exception*/public static byte[] encrypt(byte[] data, byte[] key) throws Exception {// 加入BouncyCastleProvider支持Security.addProvider(new BouncyCastleProvider());// 还原密钥Key k = toKey(key);// 实例化Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);// 初始化,设置为加密模式cipher.init(Cipher.ENCRYPT_MODE, k);// 执行操作return cipher.doFinal(data);}/*** 生成密钥 <br>* * @return byte[] 二进制密钥* @throws Exception*/public static byte[] initKey() throws Exception {// 加入BouncyCastleProvider支持Security.addProvider(new BouncyCastleProvider());// 实例化KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);// 初始化kg.init(128);// 生成秘密密钥SecretKey secretKey = kg.generateKey();// 获得密钥的二进制编码形式return secretKey.getEncoded();}}

2、testNG测试

import static org.testng.Assert.assertEquals;import mons.codec.binary.Base64;import org.testng.annotations.Test;/*** @author alan 11月16日*/public class IDEACoderTest {@Testpublic final void test() throws Exception {String inputStr = "IDEA";byte[] inputData = inputStr.getBytes();System.err.println("原文:\t" + inputStr);// 初始化密钥byte[] key = IDEACoder.initKey();System.err.println("密钥:\t" + Base64.encodeBase64String(key));// 加密inputData = IDEACoder.encrypt(inputData, key);System.err.println("加密后:\t" + Base64.encodeBase64String(inputData));// 解密byte[] outputData = IDEACoder.decrypt(inputData, key);String outputStr = new String(outputData);System.err.println("解密后:\t" + outputStr);// 校验assertEquals(inputStr, outputStr);}}

5、PBE

1)、介绍

PBE(Password Based Encryption)基于密码加密算法是一种基于密码的加密算法,其特点是密码(password)由用户自己保管,采用随机数(加盐)杂凑多重加密等方法保证数据的安全性。PBE没有密钥,其密码(password)代替了密钥,为了增加密码的安全性,采用了加盐的处理方式。PBE是对称加密算法的综合性算法,常见的算法有PBEWithMD5AndDES,该算法是使用了MD5和DES构建PBE算法。

2)、应用场景

PBE算法通常用于需要用户输入口令的场合,例如保护用户数据。

3)、示例

以下是jdk实现示例

1、实现源码

import java.security.Key;import java.security.SecureRandom;import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.PBEKeySpec;import javax.crypto.spec.PBEParameterSpec;/*** @author alan 11月16日*/public class PBECoder {/*** Java 6 支持以下任意一种算法* * <pre>* PBEWithMD5AndDES * PBEWithMD5AndTripleDES * PBEWithSHA1AndDESede* PBEWithSHA1AndRC2_40* </pre>*/public static final String ALGORITHM = "PBEWithMD5AndTripleDES";/*** 盐初始化<br>* 盐长度必须为8字节* * @return byte[] 盐* @throws Exception*/public static byte[] initSalt() throws Exception {SecureRandom random = new SecureRandom();return random.generateSeed(8);}/*** 转换密钥* * @param password 密码* @return Key 密钥* @throws Exception*/private static Key toKey(String password) throws Exception {// 密钥材料转换PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());// 实例化SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);// 生成密钥SecretKey secretKey = keyFactory.generateSecret(keySpec);return secretKey;}/*** 加密* * @param data数据* @param password 密码* @param salt盐* @return byte[] 加密数据* @throws Exception*/public static byte[] encrypt(byte[] data, String password, byte[] salt) throws Exception {// 转换密钥Key key = toKey(password);// 实例化PBE参数材料PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);// 实例化Cipher cipher = Cipher.getInstance(ALGORITHM);// 初始化cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);// 执行操作return cipher.doFinal(data);}/*** 解密* * @param data数据* @param password 密码* @param salt盐* @return byte[] 解密数据* @throws Exception*/public static byte[] decrypt(byte[] data, String password, byte[] salt) throws Exception {// 转换密钥Key key = toKey(password);// 实例化PBE参数材料PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);// 实例化Cipher cipher = Cipher.getInstance(ALGORITHM);// 初始化cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);// 执行操作return cipher.doFinal(data);}}

2、testNG测试

import static org.testng.Assert.assertEquals;import mons.codec.binary.Base64;import org.testng.annotations.Test;/*** @author alan 11月16日*/public class PBECoderTest {@Testpublic void test() throws Exception {String inputStr = "PBE";System.err.println("原文:" + inputStr);byte[] input = inputStr.getBytes();String pwd = "alanchan";System.err.println("密码:\t" + pwd);// 初始化盐byte[] salt = PBECoder.initSalt();System.err.println("盐:\t" + Base64.encodeBase64String(salt));// 加密byte[] data = PBECoder.encrypt(input, pwd, salt);System.err.println("加密后:\t" + Base64.encodeBase64String(data));// 解密byte[] output = PBECoder.decrypt(data, pwd, salt);String outputStr = new String(output);System.err.println("解密后:\t" + outputStr);// 校验assertEquals(inputStr, outputStr);}}

以上,简单的介绍了对称加密的5种常见算法的使用示例,并给出推荐的应用示例。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。