`

对称加密算法DES&AES

 
阅读更多

      对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。

      对称加密算法,最常用的莫过于DES数据加密算法。 

DES 
DES-Data Encryption Standard,即数据加密算法。是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。 
  DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位。 

 

通过java代码实现如下:Coder类见 BASE64与单向加密算法MD5&SHA&MAC

Java代码  收藏代码
  1. import java.security.Key;  
  2. import java.security.SecureRandom;  
  3.   
  4. import javax.crypto.Cipher;  
  5. import javax.crypto.KeyGenerator;  
  6. import javax.crypto.SecretKey;  
  7. import javax.crypto.SecretKeyFactory;  
  8. import javax.crypto.spec.DESKeySpec;  
  9.   
  10.   
  11. /** 
  12.  * DES安全编码组件 
  13.  *  
  14.  * <pre> 
  15.  * 支持 DES、DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR) 
  16.  * DES                  key size must be equal to 56 
  17.  * DESede(TripleDES)    key size must be equal to 112 or 168 
  18.  * AES                  key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available 
  19.  * Blowfish             key size must be multiple of 8, and can only range from 32 to 448 (inclusive) 
  20.  * RC2                  key size must be between 40 and 1024 bits 
  21.  * RC4(ARCFOUR)         key size must be between 40 and 1024 bits 
  22.  * 具体内容 需要关注 JDK Document http://.../docs/technotes/guides/security/SunProviders.html 
  23.  * </pre> 
  24.  *  
  25.  * @author 梁栋 
  26.  * @version 1.0 
  27.  * @since 1.0 
  28.  */  
  29. public abstract class DESCoder extends Coder {  
  30.     /** 
  31.      * ALGORITHM 算法 <br> 
  32.      * 可替换为以下任意一种算法,同时key值的size相应改变。 
  33.      *  
  34.      * <pre> 
  35.      * DES                  key size must be equal to 56 
  36.      * DESede(TripleDES)    key size must be equal to 112 or 168 
  37.      * AES                  key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available 
  38.      * Blowfish             key size must be multiple of 8, and can only range from 32 to 448 (inclusive) 
  39.      * RC2                  key size must be between 40 and 1024 bits 
  40.      * RC4(ARCFOUR)         key size must be between 40 and 1024 bits 
  41.      * </pre> 
  42.      *  
  43.      * 在Key toKey(byte[] key)方法中使用下述代码 
  44.      * <code>SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);</code> 替换 
  45.      * <code> 
  46.      * DESKeySpec dks = new DESKeySpec(key); 
  47.      * SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); 
  48.      * SecretKey secretKey = keyFactory.generateSecret(dks); 
  49.      * </code> 
  50.      */  
  51.     public static final String ALGORITHM = "DES";  
  52.   
  53.     /** 
  54.      * 转换密钥<br> 
  55.      *  
  56.      * @param key 
  57.      * @return 
  58.      * @throws Exception 
  59.      */  
  60.     private static Key toKey(byte[] key) throws Exception {  
  61.         DESKeySpec dks = new DESKeySpec(key);  
  62.         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);  
  63.         SecretKey secretKey = keyFactory.generateSecret(dks);  
  64.   
  65.         // 当使用其他对称加密算法时,如AES、Blowfish等算法时,用下述代码替换上述三行代码  
  66.         // SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);  
  67.   
  68.         return secretKey;  
  69.     }  
  70.   
  71.     /** 
  72.      * 解密 
  73.      *  
  74.      * @param data 
  75.      * @param key 
  76.      * @return 
  77.      * @throws Exception 
  78.      */  
  79.     public static byte[] decrypt(byte[] data, String key) throws Exception {  
  80.         Key k = toKey(decryptBASE64(key));  
  81.   
  82.         Cipher cipher = Cipher.getInstance(ALGORITHM);  
  83.         cipher.init(Cipher.DECRYPT_MODE, k);  
  84.   
  85.         return cipher.doFinal(data);  
  86.     }  
  87.   
  88.     /** 
  89.      * 加密 
  90.      *  
  91.      * @param data 
  92.      * @param key 
  93.      * @return 
  94.      * @throws Exception 
  95.      */  
  96.     public static byte[] encrypt(byte[] data, String key) throws Exception {  
  97.         Key k = toKey(decryptBASE64(key));  
  98.         Cipher cipher = Cipher.getInstance(ALGORITHM);  
  99.         cipher.init(Cipher.ENCRYPT_MODE, k);  
  100.   
  101.         return cipher.doFinal(data);  
  102.     }  
  103.   
  104.     /** 
  105.      * 生成密钥 
  106.      *  
  107.      * @return 
  108.      * @throws Exception 
  109.      */  
  110.     public static String initKey() throws Exception {  
  111.         return initKey(null);  
  112.     }  
  113.   
  114.     /** 
  115.      * 生成密钥 
  116.      *  
  117.      * @param seed 
  118.      * @return 
  119.      * @throws Exception 
  120.      */  
  121.     public static String initKey(String seed) throws Exception {  
  122.         SecureRandom secureRandom = null;  
  123.   
  124.         if (seed != null) {  
  125.             secureRandom = new SecureRandom(decryptBASE64(seed));  
  126.         } else {  
  127.             secureRandom = new SecureRandom();  
  128.         }  
  129.   
  130.         KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM);  
  131.         kg.init(secureRandom);  
  132.   
  133.         SecretKey secretKey = kg.generateKey();  
  134.   
  135.         return encryptBASE64(secretKey.getEncoded());  
  136.     }  
  137. }  


延续上一个类的实现,我们通过MD5以及SHA对字符串加密生成密钥,这是比较常见的密钥生成方式。 
再给出一个测试类: 

Java代码  收藏代码
  1. import static org.junit.Assert.*;  
  2.   
  3.   
  4. import org.junit.Test;  
  5.   
  6. /** 
  7.  *  
  8.  * @author 梁栋 
  9.  * @version 1.0 
  10.  * @since 1.0 
  11.  */  
  12. public class DESCoderTest {  
  13.   
  14.     @Test  
  15.     public void test() throws Exception {  
  16.         String inputStr = "DES";  
  17.         String key = DESCoder.initKey();  
  18.         System.err.println("原文:\t" + inputStr);  
  19.   
  20.         System.err.println("密钥:\t" + key);  
  21.   
  22.         byte[] inputData = inputStr.getBytes();  
  23.         inputData = DESCoder.encrypt(inputData, key);  
  24.   
  25.         System.err.println("加密后:\t" + DESCoder.encryptBASE64(inputData));  
  26.   
  27.         byte[] outputData = DESCoder.decrypt(inputData, key);  
  28.         String outputStr = new String(outputData);  
  29.   
  30.         System.err.println("解密后:\t" + outputStr);  
  31.   
  32.         assertEquals(inputStr, outputStr);  
  33.     }  
  34. }  


得到的输出内容如下: 

Console代码  收藏代码
  1. 原文: DES  
  2. 密钥: f3wEtRrV6q0=  
  3.   
  4. 加密后:    C6qe9oNIzRY=  
  5.   
  6. 解密后:    DES  


    由控制台得到的输出,我们能够比对加密、解密后结果一致。这是一种简单的加密解密方式,只有一个密钥。 
    其实DES有很多同胞兄弟,如DESede(TripleDES)、AES、Blowfish、RC2、RC4(ARCFOUR)。这里就不过多阐述了,大同小异,只要换掉ALGORITHM换成对应的值,同时做一个代码替换SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);就可以了,此外就是密钥长度不同了。 

Java代码  收藏代码
  1. /** 
  2.  * DES          key size must be equal to 56 
  3.  * DESede(TripleDES) key size must be equal to 112 or 168 
  4.  * AES          key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available 
  5.  * Blowfish     key size must be multiple of 8, and can only range from 32 to 448 (inclusive) 
  6.  * RC2          key size must be between 40 and 1024 bits 
  7.  * RC4(ARCFOUR) key size must be between 40 and 1024 bits 
  8.  **/  
分享到:
评论

相关推荐

    php对称加密算法DES和AES类.zip

    分享一个php对称加密算法DES和AES类,支持密钥:64/128/256 bit(字节长度8/16/32),支持算法:DES/AES(根据密钥长度自动匹配使用:DES:64bit AES:128/256bit),支持模式:CBC/ECB/OFB/CFB,密文编码:base64字符...

    PHP对称加密算法DES,AES类.zip

    分享一个PHP对称加密算法DES,AES类,支持密钥:64/128/256 bit(字节长度8/16/32),支持算法:DES/AES(根据密钥长度自动匹配使用:DES:64bit AES:128/256bit)。

    常用加密算法的Java实现总结(二)——对称加密算法DES、3DES和AES.pdf

    对称加密算法包括了多种算法,本文主要介绍DES、3DES和AES这三种常见的对称加密算法,并对它们进行Java实现的总结。 首先,对称加密算法的一个关键优势在于其算法公开、计算量小、加密速度快、加密效率高,但它们也...

    对称密码体制(des&aes加密方法)

    "对称密码体制(DES&AES加密方法)" 对称密码体制是指使用同一个密钥进行加密和解密的加密算法。对称密码体制的优点是加密和解密速度快、效率高,但其缺点是密钥管理复杂、不适合广域网和公开网络传输。 在对称...

    Java实现的对称加密算法AES定义与用法详解

    "Java实现的对称加密算法AES定义与用法详解" 对称加密算法AES是当前使用最多的加密算法之一,其主要特点是高级的、安全的、快速的和灵活的。下面我们将详细介绍Java实现的对称加密算法AES的定义、特点、用法及使用...

    c#编写关于AES与DES加密算法

    AES(Advanced Encryption Standard,高级加密标准)和DES(Data Encryption Standard,数据加密标准)都是常用的对称加密算法,广泛应用于数据加密和解密领域。 AES加密算法 AES是一种对称加密算法,使用128位、...

    AES/DES 对称加密算法

    DES、AES对称加密算法,之前从网上找的,但是在MAC上运行发现每次加密出来的结果都不一样,后来查了一些博客,最后确认是SecureRandom的随机算法问题,需要设置setSeed.

    数据加解密基础之对称加密 - DES & TDES( ECB or CBC )

    总结起来,对称加密算法如DES和TDES提供了基本的加密功能,但随着技术的发展,更现代的加密标准如AES已被广泛采用。理解ECB和CBC等加密模式有助于我们在设计和实现安全系统时做出明智的选择。对于学习者来说,了解...

    java加密算法:Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法

    java关于加密的算法demo代码(Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法) JAVA安全实现三种方式: 1.JDK 2.Commons Codec 3.Bouncy Castle 一。非对称加密算法: 1.DH 2.RSA 3.ELGamal 二。...

    常见加密算法方式(对称加密和非对称加密)

    - **AES(Advanced Encryption Standard)**:高级加密标准,是目前最常用的对称加密算法之一,具有较高的安全性和较快的加密速度。 ### 非对称加密算法 非对称加密算法,又称公钥加密算法,其特点是加密和解密...

    DES算法& AES算法.ppt

    密码学历史上影响重大,应用最广的数据加密算法,是对称密码体制的。 AES算法 1、征集 1977年颁布的数据加密标准DES算法,56位长的密码空间在芯片技术和计算技术高速发展的今天,越来越不适应安全需求。 1997年9月,...

    VB6-AES加密算法源码.rar

    AES是一种广泛使用的对称加密算法,为数据提供高强度的安全保护。该源码经过验证,无错误,可以直接在VB6环境下运行,这对于开发者来说是一个宝贵的资源,可以快速集成到自己的项目中。 AES加密算法最初由比利时...

    Java_加密解密之对称加密算法DES

    Java 加密解密之对称加密算法 DES Java 加密解密之对称加密算法 DES 是一种常用的对称加密算法,广泛应用于保护金融数据的安全中。它的全称是 Data Encryption Algorithm(DEA),最早由 IBM 开发,并曾拥有专利权...

    C#开发的对称加密算法

    常见的对称加密算法包括DES(Data Encryption Standard)、3DES(Triple DES)、AES(Advanced Encryption Standard)和Blowfish等。这些算法都有不同的安全性、速度和密钥长度,开发者可以根据具体需求进行选择。 ...

    des.rar_DES加密算法C++_c++ des加密_des_des加密算法 C++_对称加密算法

    DES(Data Encryption Standard)加密算法是1970年代由IBM公司开发的一种对称加密算法,后来被美国国家标准局(NIST)采纳为标准。它使用了一种称为Feistel结构的分组密码设计,其核心是将明文数据分成64位的数据块...

    【转】C++实现AES、DES加密算法(含MFC界面)

    在 AES 出现之前,最常用的对称密钥算法是 DES 加密算法,它在 1977 年被公布成为美国政府的商用加密标准。DES 的主要问题是密钥长度较短,渐渐不适合于分布式开放网络对数据加密安全性的要求。因此,1998年美国...

    qt5AES加密,ES加密/解密算法是一种可逆的对称加密算法,这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推

    AES是一种广泛使用的对称加密算法,以其高效和安全性著称。"ES加密/解密算法"可能是描述错误,通常指的是AES算法在Elasticsearch(ES)中的应用,因为标签提到了"Elasticsearch",而且在安全领域,Elasticsearch也会...

    对称加密算法概述

    这些函数提供了一种统一的方式来处理多种对称加密算法,如AES、DES等。 EVP_Encrypt*...*函数系列主要是对EVP_Cipher*...*系列的封装,虽然它们名字不同,但实际上它们的功能相似,都是用于执行对称加密操作。EVP_...

    易语言实现RSA,ECC,DES,AES,DSA算法

    **DES(数据加密标准)** 是一个古老的对称加密算法,使用64位的密钥对数据进行加密。虽然现在已被AES所取代,但了解DES的原理有助于理解加密过程。在易语言中实现DES,你需要实现一系列的置换和混淆操作,包括初始...

Global site tag (gtag.js) - Google Analytics