java安全(一)DES 的简单使用和加密过程(原理)
2016-02-26 20:08
656 查看
最近工作中用到一些加密的东西,就顺便学习一下,整理一下。今天主要整理的是对称加密,他的代表就是DES。
学习DES之前要先问几个问题?
什么是DES算法
百度百科:
DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。 明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。
DES的基本原理是什么呢
百度百科:
其入口参数有三个:key、data、mode。key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。
我们从上可以知道:
1. DES 是对称加密/解密算法,而且明文是按照64位进行分组进行加密/解密的。
2. DES加密解密的秘钥长度是64位 但实际用来参与加密解密算法的只有56位 那8位是奇偶校验位
3. 加密/解密 的过程就是把明文分割成一组一组64位的小块 来和秘钥做一些替代、交换等转换最终生成一个加密/解密的块,最终把所有的加密/解密后的64位块组合起来 最终形成的就是加密后的密文/解密后的明文。
4. DES加密 参数有3个 分别是 加密的秘钥key 被加密的数据 data 以及加密还是解密操作 mode。
DES 简单代码示例
代码总结分析:
发现没 整个代码真正实现加密的代码只有一行
byte[] result = cipher.doFinal(str.getBytes());
大部分的篇幅都在处理秘钥key和构建DES加密工厂Cipher。key前面说了要64位(56位是真正的秘钥 8位是校验位)所以种子秘钥的长度(转成2进制后)必须要达到64位 否则会报错的,种子秘钥取出前64位 经过奇偶转化,生成最终的秘钥。加密工厂主要实例化 用谁提供 的加密算法(,用哪个秘钥,是加密还是解密。最后用工厂操作就ok了。
其他
说明:
这下面的本来想删除的 有些地方整理的简陋些,但是它花了我好久时间才整理的 真的有些舍不得。就放在下面吧,以后有时间在慢慢优化补到上面。
DES加密算法DEMO
引用别人的完整的加密和解密的DEMO
/article/4706660.html
知识储备
再看原理之前大家要具备一下基础知识,免得大家看原理费劲。
java存储都是使用2进制补码形式存储的。什么是原码、反码、补码不懂得大家先自学下吧。8位2进制的补码范围为-128-127。
要了解2进制数字的与或非等一些运算。
最后要了解下DES加密的几种模式:ECB CBC CFB OFB。
!
DES加密过程(原理)
整理的的有些仓促 最后几步写的很简单,找时间再补上吧!
为了讲解方便对待加密的数据和加密数据的秘钥所如下假设。
1.要加密的数据已经转化成二进制的格式,加密的秘钥也转化成了二进制格式。
2.待加密的数据和秘钥正好都是64bit。
第一步:对数据进行处理。把需要被加密的数据分隔成为若干个以64bit为单位的数据,如果位数不够,那么补00或者FF,然后照表1进行置换操作。此表划分成上下两部分 分别命名为Li Ri。64bit的数据把位置为58的数据放到此矩阵的第一行第一列,同理50位的数据放到第一行第二列的位置,其他的同理。
表1:
第二步:对秘钥进行处理。DES的秘钥有56位密码和8位奇偶校验位共同组成了这个秘钥。首先把64位的秘钥按照表2做置换,去除秘钥中作为奇偶校验位的第 8、16、24、32、40、48、56、64位,剩下的56位作为有效输入秘钥。秘钥置换后也和数据置换后一样,要一分为二,上半部分叫C0,下半部分叫D0.
表2:
C0
D0
第三步:继续对秘钥进行处理。将上一步置换后的56位有效的秘钥按照表3左移位,总计进行16次移位操作,每一次移位结束后得到的新的56位字秘钥作为下一轮移位的有效秘钥。总计得到16个56位的子秘钥(第一次秘钥C0,D0向左移动一位,得到了C1,D1。第二次C1,D1向左移动了两位得到了C2,D2.依次类推,最后C15,D15向左移动了1位得到了C16,D16)。
表3:
第四步:还是处理秘钥。按照表4对16个子秘钥(就是第三步生成的C1,D1………C16,D16)进行置换压缩,压缩后每个子秘钥中的第9,18,22,25,35,38,43,54共8位数据会丢失。此步完成后得到16个48位的字秘钥。
表4:
第五步:处理待加密的数据。将第一步生成的有效数据的右半部分R0的32位数据按照表5进行置换,由原来的32位扩展到48位。
表5:
第六步:开始数据和秘钥计算了(数据扩展)。将扩展后的有效数据分别和第四步产生的16个48位秘钥进行异或运算,生成16个加密的块K[0],K[1]…….K[15]。
第七步:处理上一步的数据(数据压缩)。将第六步产生的48位的加密数据K[0]分为8个6位的数据(也叫S盒),排列数据*)
表6:
第八步:将第七步产生的32位数据按照表7置换,生成新的32位的K[0].
表7:
第九步:把上一步产生的K[0]和第一步产生的L0按位异或运算后的值赋给第一步产生的R[1],然后把原来的R[0]复制给L[1]得到新的L1 和 R1。
第十步:回到第五步,重运算到第九步,每轮计算由R[i],L[i],K[i]来计算,总计重复16轮结束,最终生成新的L[16]和R[16]
第十一步:合并L[16]和R[16]位64位数据,然后按照表8做置换,生成最终的加密数据。
表8:
学习DES之前要先问几个问题?
什么是DES算法
百度百科:
DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。 明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。
DES的基本原理是什么呢
百度百科:
其入口参数有三个:key、data、mode。key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。
我们从上可以知道:
1. DES 是对称加密/解密算法,而且明文是按照64位进行分组进行加密/解密的。
2. DES加密解密的秘钥长度是64位 但实际用来参与加密解密算法的只有56位 那8位是奇偶校验位
3. 加密/解密 的过程就是把明文分割成一组一组64位的小块 来和秘钥做一些替代、交换等转换最终生成一个加密/解密的块,最终把所有的加密/解密后的64位块组合起来 最终形成的就是加密后的密文/解密后的明文。
4. DES加密 参数有3个 分别是 加密的秘钥key 被加密的数据 data 以及加密还是解密操作 mode。
DES 简单代码示例
import java.security.SecureRandom; import javax.crypto.spec.DESKeySpec; import javax.crypto.SecretKeyFactory; import javax.crypto.SecretKey; import javax.crypto.Cipher; public class Test { public static void main(String[] args) { String str = "测试内容"; try{ //===========================生成秘钥开始======================= //用于生成随机数 SecureRandom random = new SecureRandom(); //2.种子秘钥 String password = "95880288432242"; //打印出种子秘钥的2进制 形式数据 for(byte key:password.getBytes()){ //key:57 53 56 56 48 50 56 56 52 51 50 50 52 50 System.out.println("key:"+key); } DESKeySpec desKey = new DESKeySpec(password.getBytes()); for(byte key:desKey.getKey()){ //真正的key:57 53 56 56 48 50 56 56 System.out.println("key1:"+key); } //创建一个密匙工厂,然后用它把DESKeySpec转换成合法的秘钥格式 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey securekey = keyFactory.generateSecret(desKey); byte [] code = securekey.getEncoded(); for(byte b : code ){ System.out.println(b); // 56 52 56 56 49 50 56 56 } //============================生成秘钥结束======================== //===================构建DES加密工厂开始====================== //Cipher对象实际完成加密操作 Cipher cipher = Cipher.getInstance("DES"); //用密匙初始化Cipher对象 cipher.init(Cipher.ENCRYPT_MODE, securekey, random); //现在,获取数据并加密 //正式执行加密操作 //===================构建DES加密工厂结束====================== //真正开始加密 byte[] result = cipher.doFinal(str.getBytes()); for(byte r:result){ //密文的2进制内容 System.out.println(r); //2 111 -33 13 -93 38 -57 109 105 60 -38 124 102 122 81 38 } System.out.println("加密后:"+new String(result)); }catch(Throwable e){ e.printStackTrace(); } } }
代码总结分析:
发现没 整个代码真正实现加密的代码只有一行
byte[] result = cipher.doFinal(str.getBytes());
大部分的篇幅都在处理秘钥key和构建DES加密工厂Cipher。key前面说了要64位(56位是真正的秘钥 8位是校验位)所以种子秘钥的长度(转成2进制后)必须要达到64位 否则会报错的,种子秘钥取出前64位 经过奇偶转化,生成最终的秘钥。加密工厂主要实例化 用谁提供 的加密算法(,用哪个秘钥,是加密还是解密。最后用工厂操作就ok了。
其他
说明:
这下面的本来想删除的 有些地方整理的简陋些,但是它花了我好久时间才整理的 真的有些舍不得。就放在下面吧,以后有时间在慢慢优化补到上面。
DES加密算法DEMO
引用别人的完整的加密和解密的DEMO
/article/4706660.html
知识储备
再看原理之前大家要具备一下基础知识,免得大家看原理费劲。
java存储都是使用2进制补码形式存储的。什么是原码、反码、补码不懂得大家先自学下吧。8位2进制的补码范围为-128-127。
要了解2进制数字的与或非等一些运算。
最后要了解下DES加密的几种模式:ECB CBC CFB OFB。
!
DES加密过程(原理)
整理的的有些仓促 最后几步写的很简单,找时间再补上吧!
为了讲解方便对待加密的数据和加密数据的秘钥所如下假设。
1.要加密的数据已经转化成二进制的格式,加密的秘钥也转化成了二进制格式。
2.待加密的数据和秘钥正好都是64bit。
第一步:对数据进行处理。把需要被加密的数据分隔成为若干个以64bit为单位的数据,如果位数不够,那么补00或者FF,然后照表1进行置换操作。此表划分成上下两部分 分别命名为Li Ri。64bit的数据把位置为58的数据放到此矩阵的第一行第一列,同理50位的数据放到第一行第二列的位置,其他的同理。
表1:
第二步:对秘钥进行处理。DES的秘钥有56位密码和8位奇偶校验位共同组成了这个秘钥。首先把64位的秘钥按照表2做置换,去除秘钥中作为奇偶校验位的第 8、16、24、32、40、48、56、64位,剩下的56位作为有效输入秘钥。秘钥置换后也和数据置换后一样,要一分为二,上半部分叫C0,下半部分叫D0.
表2:
C0
D0
第三步:继续对秘钥进行处理。将上一步置换后的56位有效的秘钥按照表3左移位,总计进行16次移位操作,每一次移位结束后得到的新的56位字秘钥作为下一轮移位的有效秘钥。总计得到16个56位的子秘钥(第一次秘钥C0,D0向左移动一位,得到了C1,D1。第二次C1,D1向左移动了两位得到了C2,D2.依次类推,最后C15,D15向左移动了1位得到了C16,D16)。
表3:
第四步:还是处理秘钥。按照表4对16个子秘钥(就是第三步生成的C1,D1………C16,D16)进行置换压缩,压缩后每个子秘钥中的第9,18,22,25,35,38,43,54共8位数据会丢失。此步完成后得到16个48位的字秘钥。
表4:
第五步:处理待加密的数据。将第一步生成的有效数据的右半部分R0的32位数据按照表5进行置换,由原来的32位扩展到48位。
表5:
第六步:开始数据和秘钥计算了(数据扩展)。将扩展后的有效数据分别和第四步产生的16个48位秘钥进行异或运算,生成16个加密的块K[0],K[1]…….K[15]。
第七步:处理上一步的数据(数据压缩)。将第六步产生的48位的加密数据K[0]分为8个6位的数据(也叫S盒),排列数据*)
表6:
第八步:将第七步产生的32位数据按照表7置换,生成新的32位的K[0].
表7:
第九步:把上一步产生的K[0]和第一步产生的L0按位异或运算后的值赋给第一步产生的R[1],然后把原来的R[0]复制给L[1]得到新的L1 和 R1。
第十步:回到第五步,重运算到第九步,每轮计算由R[i],L[i],K[i]来计算,总计重复16轮结束,最终生成新的L[16]和R[16]
第十一步:合并L[16]和R[16]位64位数据,然后按照表8做置换,生成最终的加密数据。
表8:
相关文章推荐
- 封装java mail包
- Java对象的序列化和反序列化
- Java中两种多线程的实现方式
- Eclipse 技巧
- Java中的线程同步
- 【JAVA】21、方法的重载
- Java的参数是按值传递的还是按引用?
- Java开发中的23种设计模式详解(转)
- java 小知识点HashMap
- 关于Eclipse中的File Explorer有的真机看不到数据的详细教程
- Java中会有内存泄露吗?
- 使用注解方式进行spring和hibernate整合
- 用java程序打印菱形
- MyEclipse10 Servers窗口出现“Could not create the view: An unexpected exception was thrown”解决办法
- Java多线程断点下载分析
- java学习日记——继承基础知识
- java多态
- JDK环境配置
- java.lang.IndexOutOfBoundsException: setSpan (26 ... 26) ends beyond length 10
- java对象的强引用,软引用,弱引用和虚引用