• 数据加密标准——DES


      DES算法和DESede算法统称DES系列算法。DES算法是对称加密算法领域中的典型算法,为后续对称加密算法的发展奠定了坚实的基础。但是DES算法密钥偏短,仅有56位,迭代次数偏少,受到诸如查分密码分析和线性密码分析等各种攻击威胁,安全性受到严重威胁。不仅如此,由于DES算法具有半公开性质,被怀疑存在美国国家安全局安置的后门,受到各大密码学机构的强烈质疑。以后的文章中会具体描述一下AES算法。

      生产密钥,对数据加密、解密

      1 package test;
      2 
      3 import java.security.Key;
      4 
      5 import javax.crypto.Cipher;
      6 import javax.crypto.KeyGenerator;
      7 import javax.crypto.SecretKey;
      8 import javax.crypto.SecretKeyFactory;
      9 import javax.crypto.spec.DESKeySpec;
     10 
     11 /**
     12  * DES安全编码组件
     13  */
     14 public abstract class DESCoder {
     15     /**
     16      * 密钥算法
     17      * java 7只支持56位密钥
     18      * Bouncy Castle 支持64位密钥
     19      */
     20     public static final String KEY_ALGORITHM = "DES";
     21     /**
     22      * 加密/解密算法 /工作模式/填充方式
     23      */
     24     public static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";
     25     /**
     26      * 转换密钥
     27      * @param key 二进制密钥
     28      * @return key 密钥
     29      * @throws Exception
     30      */
     31     private static Key toKey(byte[] key) throws Exception{
     32         //实例化DES密钥材料
     33         DESKeySpec dks = new DESKeySpec(key);
     34         //实例化密钥工厂
     35         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
     36         //生产密钥
     37         SecretKey secretKey = keyFactory.generateSecret(dks);
     38         return secretKey;
     39     }
     40     /**
     41      * 解密
     42      * @param data 待解密数据
     43      * @param key 密钥
     44      * @return byte[] 解密数据
     45      * @throws Exception
     46      */
     47     public static byte[] decrypt(byte[] data,byte[] key) throws Exception{
     48         //还原密钥
     49         Key k = toKey(key);
     50         //实例化 
     51         Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
     52         //初始化,设置为解密模式
     53         cipher.init(Cipher.DECRYPT_MODE, k);
     54         //执行操作
     55         return cipher.doFinal(data);
     56     }
     57     /**
     58      * 加密
     59      * @param data 待加密数据
     60      * @param key 密钥
     61      * @return byte[] 加密数据
     62      * @throws Exception
     63      */
     64     public static byte[] encrypt(byte[] data,byte[] key) throws Exception{
     65         //还原密钥
     66         Key k = toKey(key);
     67         //实例化
     68         Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
     69         //初始化,设置为加密模式
     70         cipher.init(Cipher.ENCRYPT_MODE,k);
     71         //执行操作
     72         return cipher.doFinal(data);
     73     }
     74     /**
     75      * 生产密钥
     76      * java 7只支持56位 密钥
     77      * Bouncy Castle 支持64位密钥
     78      * @return byte[] 二进制密钥
     79      * @throws Exception
     80      */
     81     public static byte[] initKey() throws Exception{
     82         /*
     83          * 实例化密钥生成器
     84          * 若要使用64位密钥注意替换
     85          * 讲下述代码中的
     86          * KeyGenerator.getInstance(KEY_ALGORITHM);
     87          * 替换为
     88          * KeyGenerator.getInstance(KEY_ALGORITHM,"BC");
     89          */
     90         KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
     91         /*
     92          * 初始化密钥生成器
     93          * 若要使用64位密钥注意替换
     94          * 将下述的代码 kg.init(56);
     95          * 替换为 kg.init(64);
     96          */
     97         kg.init(56);
     98         //生成密钥
     99         SecretKey secretKey = kg.generateKey();
    100         //获得密钥的二进制编码形式
    101         return secretKey.getEncoded();
    102     }
    103 }

    单元测试:引入了三个包 commons-codec-1.9.jar    引入Base64.encodeBase64String(inputData)方法

                junit-4.11.jar  hamcrest-core-1.3.jar 进行单元测试

     1 package test;
     2 
     3 import org.apache.commons.codec.binary.Base64;
     4 import org.junit.Test;
     5 
     6 
     7 
     8 public class DESCoderTest {
     9     @Test
    10     public  void test() throws Exception{
    11         String inputStr = "DES";
    12         byte[] inputData = inputStr.getBytes();
    13         System.out.println("原文:	" + inputStr);
    14         //初始化密钥
    15         byte[] key = DESCoder.initKey();
    16         System.out.println("密钥:	" + Base64.encodeBase64String(key));
    17         //加密
    18         inputData = DESCoder.encrypt(inputData, key);
    19         System.out.println("加密后:	" + Base64.encodeBase64String(inputData));
    20         //解密
    21         byte[] outputDate = DESCoder.decrypt(inputData, key);
    22         String outoutStr = new String(outputDate);
    23         System.out.println("解密后:	" + outoutStr);
    24     }
    25 }

    输出:  

      原文: DES
      密钥: x8TN3Ku8/iM=
      加密后: lOAZ+WcFAEU=
      解密后: DES

  • 相关阅读:
    【计算机视觉】深度学习视觉领域常用数据集汇总
    【计算机视觉】常用图像数据集
    【计算机视觉】ImageNet介绍
    【神经网络与深度学习】卷积与反卷积
    【视频开发】【计算机视觉】全景视频拼接关键技术
    【计算机视觉】分辨率与超分辨率图像重建
    【计算机视觉】【神经网络与深度学习】深度学习在图像超分辨率重建中的应用
    【VS开发】【C/C++开发】关于boost库的C++11导致的undefined符号问题
    【VS开发】【C/C++开发】vs2015编译boost 64位
    【视频开发】【计算机视觉】相机标定(Camera calibration)《二》
  • 原文地址:https://www.cnblogs.com/benefitworld/p/5842954.html
Copyright © 2020-2023  润新知