Java 加密解密之对称加密算法DES
数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的。通常,自动取款机(Automated Teller Machine,ATM)都使用DEA。它出自IBM的研究工作,IBM也曾对它拥有几年的专利权,但是在1983年已到期后,处于公有范围中,允许在特定条件下可以免除专利使用费而使用。1977年被美国政府正式采纳。
1998年后实用化DES破译机的出现彻底宣告DES算法已不具备安全性,1999年NIST颁布新标准,规定DES算法只能用于遗留加密系统,但不限制使用DESede算法。当今DES算法正是推出历史舞台,AES算法称为他的替代者。(详见: Java 加密解密之对称加密算法AES )
加密原理
DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。
JDK对DES算法的支持
密钥长度:56位
工作模式:ECB/CBC/PCBC/CTR/CTS/CFB/CFB8 to CFB128/OFB/OBF8 to OFB128
填充方式:Nopadding/PKCS5Padding/ISO10126Padding/
工作模式和填充方式请参考: JAVA加密解密基础
十六进制工具类Hex.java,见: java byte数组与十六进制字符串互转
DES加密解密的java实现:
DESCoder.java
import java.security.Key; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; /** * DES Coder<br/> * secret key length: 56 bit, default: 56 bit<br/> * mode: ECB/CBC/PCBC/CTR/CTS/CFB/CFB8 to CFB128/OFB/OBF8 to OFB128<br/> * padding: Nopadding/PKCS5Padding/ISO10126Padding/ * @author Aub * */ public class DESCoder { /** * 密钥算法 */ private static final String KEY_ALGORITHM = "DES"; private static final String DEFAULT_CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding"; // private static final String DEFAULT_CIPHER_ALGORITHM = "DES/ECB/ISO10126Padding"; /** * 初始化密钥 * * @return byte[] 密钥 * @throws Exception */ public static byte[] initSecretKey() throws Exception{ //返回生成指定算法的秘密密钥的 KeyGenerator 对象 KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM); //初始化此密钥生成器,使其具有确定的密钥大小 kg.init(56); //生成一个密钥 SecretKey secretKey = kg.generateKey(); return secretKey.getEncoded(); } /** * 转换密钥 * * @param key 二进制密钥 * @return Key 密钥 * @throws Exception */ private static Key toKey(byte[] key) throws Exception{ //实例化DES密钥规则 DESKeySpec dks = new DESKeySpec(key); //实例化密钥工厂 SecretKeyFactory skf = SecretKeyFactory.getInstance(KEY_ALGORITHM); //生成密钥 SecretKey secretKey = skf.generateSecret(dks); return secretKey; } /** * 加密 * * @param data 待加密数据 * @param key 密钥 * @return byte[] 加密数据 * @throws Exception */ public static byte[] encrypt(byte[] data,Key key) throws Exception{ return encrypt(data, key,DEFAULT_CIPHER_ALGORITHM); } /** * 加密 * * @param data 待加密数据 * @param key 二进制密钥 * @return byte[] 加密数据 * @throws Exception */ public static byte[] encrypt(byte[] data,byte[] key) throws Exception{ return encrypt(data, key,DEFAULT_CIPHER_ALGORITHM); } /** * 加密 * * @param data 待加密数据 * @param key 二进制密钥 * @param cipherAlgorithm 加密算法/工作模式/填充方式 * @return byte[] 加密数据 * @throws Exception */ public static byte[] encrypt(byte[] data,byte[] key,String cipherAlgorithm) throws Exception{ //还原密钥 Key k = toKey(key); return encrypt(data, k, cipherAlgorithm); } /** * 加密 * * @param data 待加密数据 * @param key 密钥 * @param cipherAlgorithm 加密算法/工作模式/填充方式 * @return byte[] 加密数据 * @throws Exception */ public static byte[] encrypt(byte[] data,Key key,String cipherAlgorithm) throws Exception{ //实例化 Cipher cipher = Cipher.getInstance(cipherAlgorithm); //使用密钥初始化,设置为加密模式 cipher.init(Cipher.ENCRYPT_MODE, key); //执行操作 return cipher.doFinal(data); } /** * 解密 * * @param data 待解密数据 * @param key 二进制密钥 * @return byte[] 解密数据 * @throws Exception */ public static byte[] decrypt(byte[] data,byte[] key) throws Exception{ return decrypt(data, key,DEFAULT_CIPHER_ALGORITHM); } /** * 解密 * * @param data 待解密数据 * @param key 密钥 * @return byte[] 解密数据 * @throws Exception */ public static byte[] decrypt(byte[] data,Key key) throws Exception{ return decrypt(data, key,DEFAULT_CIPHER_ALGORITHM); } /** * 解密 * * @param data 待解密数据 * @param key 二进制密钥 * @param cipherAlgorithm 加密算法/工作模式/填充方式 * @return byte[] 解密数据 * @throws Exception */ public static byte[] decrypt(byte[] data,byte[] key,String cipherAlgorithm) throws Exception{ //还原密钥 Key k = toKey(key); return decrypt(data, k, cipherAlgorithm); } /** * 解密 * * @param data 待解密数据 * @param key 密钥 * @param cipherAlgorithm 加密算法/工作模式/填充方式 * @return byte[] 解密数据 * @throws Exception */ public static byte[] decrypt(byte[] data,Key key,String cipherAlgorithm) throws Exception{ //实例化 Cipher cipher = Cipher.getInstance(cipherAlgorithm); //使用密钥初始化,设置为解密模式 cipher.init(Cipher.DECRYPT_MODE, key); //执行操作 return cipher.doFinal(data); } private static String showByteArray(byte[] data){ if(null == data){ return null; } StringBuilder sb = new StringBuilder("{"); for(byte b:data){ sb.append(b).append(","); } sb.deleteCharAt(sb.length()-1); sb.append("}"); return sb.toString(); } public static void main(String[] args) throws Exception { byte[] key = initSecretKey(); // byte[] key = "12345678".getBytes(); System.out.println("key:"+ showByteArray(key)); Key k = toKey(key); String data ="DES数据"; System.out.println("加密前数据: string:"+data); System.out.println("加密前数据: byte[]:"+showByteArray(data.getBytes())); System.out.println(); byte[] encryptData = encrypt(data.getBytes(), k); System.out.println("加密后数据: byte[]:"+showByteArray(encryptData)); System.out.println("加密后数据: hexStr:"+Hex.encodeHexStr(encryptData)); System.out.println(); byte[] decryptData = decrypt(encryptData, k); System.out.println("解密后数据: byte[]:"+showByteArray(decryptData)); System.out.println("解密后数据: string:"+new String(decryptData)); } }
注:参考《java加密解密的艺术》
相关推荐
Java 加密解密之对称加密算法 DES Java 加密解密之对称加密算法 DES 是一种常用的对称加密算法,广泛应用于保护金融数据的安全中。它的全称是 Data Encryption Algorithm(DEA),最早由 IBM 开发,并曾拥有专利权...
Java中的DES(Data Encryption Standard)是对称加密算法的一种,它基于IBM的研究工作,并在1977年被美国政府采纳为标准。DES算法使用56位的密钥和额外的8位奇偶校验位来处理64位的数据块。由于其结构特性,它采用...
转 JAVA加密解密DES对称加密算法.doc
DES(Data Encryption Standard)是一种对称密钥 BLOCK 加密算法,使用 56 位密钥对 64 位数据块进行加密。下面是 DES 加密解密算法的 C 语言实现的知识点总结。 字节与二进制转换 在 DES 算法中,需要将字节转换...
### Java 加密解密之对称加密算法AES #### 高级加密标准(AES) AES是一种广泛使用的对称加密算法,被美国联邦政府采纳作为官方的加密标准来替代早期的DES算法。它由比利时密码学家Joan Daemen和Vincent Rijmen...
本文主要关注的是Java中的对称加密算法——AES(Advanced Encryption Standard),它是现代密码学中的一个关键标准,用于替换旧的DES算法。AES是由比利时密码学家Joan Daemen和Vincent Rijmen设计的Rijndael加密法,...
DES(Data Encryption Standard)是一种古老的对称加密算法,尽管它在安全性上已不被视为最佳选择,但在某些场景下仍然被广泛使用。下面将详细阐述DES加密解密的基本原理、Java和JavaScript的实现方式以及如何在两者...
本实验报告主要涉及两种加密算法:对称加密算法DES(Data Encryption Standard)和非对称加密算法RSA。实验旨在帮助学生深入理解这两种算法的基本原理,并通过Python编程实现加密和解密过程。 ### **对称加密算法...
DES是一种对称加密算法,广泛应用于各种软件和系统中,为数据提供保护,确保其在传输或存储时不被未经授权的人员访问。在这个课程设计中,你将深入理解加密和解密的概念,以及如何在Java编程环境中实现这些概念。 ...
DES 算法加密算法解密算法 DES 算法概述 DES(Data Encryption Standard)是一种对称密钥块加密算法,由美国 IBM 公司的 W. Tuchman 和 C. Meyer 于 1971-1972 年研制成功。1973 年,美国国家标准局(NBS)公开...
DES是一种对称加密算法,由IBM在1970年代开发,并在1977年被美国国家标准局采纳为标准。它基于64位的数据块和56位的密钥进行操作,通过一系列复杂的数学变换,将明文转化为密文,以确保数据的安全性。然而,由于其...
DES(Data Encryption Standard)是一种对称加密算法,广泛应用于数据安全领域。在Java中实现DES加密和解密是一项常见的任务,通常涉及到`javax.crypto`包中的类和接口。本篇文章将详细阐述DES加密解密的Java实现...
DES(Data Encryption Standard)是一种经典的对称加密算法,它在历史上被广泛使用。VB(Visual Basic)作为微软开发的一种编程语言,也提供了实现加密算法的接口。本篇文章将详细探讨如何在VB环境中实现DES加密和...
在Java中,常见的对称加密算法有DES(Data Encryption Standard)、3DES(Triple DES)、AES(Advanced Encryption Standard)等。例如,AES是一种广泛应用的块加密算法,支持128位、192位和256位的密钥长度,其加密...
DES算法为密码体制中的对称密码体制,是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。 这里以Java代码实现DES算法。
3. DES(Data Encryption Standard):老一代的对称加密算法,已被AES取代。 4. MD5(Message-Digest Algorithm 5)和SHA系列:哈希函数,用于生成消息摘要,不适用于加密,但常用于验证数据完整性。 四、Java加密...
DES(Data Encryption Standard)是一种经典的对称加密算法,由IBM在1970年代初开发,后被美国国家标准局(NIST)采纳为标准。它主要用于保护数据的安全,尤其是在网络传输中。C++是一种广泛应用的编程语言,可以...
对称加密算法包括了多种算法,本文主要介绍DES、3DES和AES这三种常见的对称加密算法,并对它们进行Java实现的总结。 首先,对称加密算法的一个关键优势在于其算法公开、计算量小、加密速度快、加密效率高,但它们也...