加密-DES

下面是使用jdk提供的加密类库进行DES加密样例

 1 public class TestDES {
 2 
 3   //SecretKey 负责保存对称密钥
 4   private SecretKey deskey;
 5   //Cipher负责完成加密或解密工作
 6   private Cipher c;
 7 
 8   public TestDES() throws NoSuchAlgorithmException, NoSuchPaddingException {
 9     Security.addProvider(new com.sun.crypto.provider.SunJCE());
10     //实例化支持DES算法的密钥生成器(算法名称命名需按规定,否则抛出异常)
11     KeyGenerator keygen = KeyGenerator.getInstance("DES");
12     //生成密钥
13     deskey = keygen.generateKey();
14     //生成Cipher对象,指定其支持的DES算法
15     c = Cipher.getInstance("DES");
16   }
17 
18 
19   public byte[] encrypt(String str) throws InvalidKeyException,
20           IllegalBlockSizeException, BadPaddingException {
21     // 根据密钥,对Cipher对象进行初始化,ENCRYPT_MODE表示加密模式
22     c.init(Cipher.ENCRYPT_MODE, deskey);
23     byte[] src = str.getBytes();
24     // 加密,结果保存进cipherByte
25     byte[] cipherByte = c.doFinal(src);
26     return cipherByte;
27   }
28   public byte[] encrypt(byte[] src) throws InvalidKeyException,
29           IllegalBlockSizeException, BadPaddingException {
30     // 根据密钥,对Cipher对象进行初始化,ENCRYPT_MODE表示加密模式
31     c.init(Cipher.ENCRYPT_MODE, deskey);
32     // 加密,结果保存进cipherByte
33     byte[] cipherByte = c.doFinal(src);
34     return cipherByte;
35   }
36   public byte[] decrypt(byte[] buff) throws InvalidKeyException,
37           IllegalBlockSizeException, BadPaddingException {
38     // 根据密钥,对Cipher对象进行初始化,DECRYPT_MODE表示加密模式
39     c.init(Cipher.DECRYPT_MODE, deskey);
40     byte[] cipherByte = c.doFinal(buff);
41     return cipherByte;
42   }
43 
44   public static void main(String[] args) throws Exception {
45     TestDES de1 = new TestDES();
46     byte[] bytes = new byte[]{'z', 'h', 'a', 'n', 'g', '2', '2', '3'};
47     byte[] encontent = de1.encrypt(bytes);
48     byte[] decontent = de1.decrypt(encontent);
49     System.out.println("明文是:" + new String(decontent));
50   }
51 }
View Code

DES会对待加密数据进行分块,没8字节一块,分别对每一块进行加密。比如6字节数据,最终加密得到的密文是8字节(2个字节做填充),填充字节中的最后一个字节表示填充字节数;再比如8字节数据,最终加密得到的密文是16字节,后8字节做填充。也就是说一个完整的明文经过DES加密的密文,最后一个字节始终是填充字节数,通过该字节就可以删除填充字节还原明文。

但tcp是面向字节的,它看到的是无差别的字节序列,如果server在一个长连接中连续做出两个响应,由于tcp无差别的上传至ssl,这里存在一个问题,解密时如何判断一个完整的http响应?

猜测在ssl层会对加密数据再次封装(添加头信息),如果是最后一个加密数据包,则在该数据包的头信息会将其标识为最后一个数据包,这时client在解密时就可以轻松的判断密文是否结束,从而除去填充字节。

 

参考:http://kb.cnblogs.com/page/162080/

原文地址:https://www.cnblogs.com/holoyong/p/7615466.html