下面是使用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 }
DES会对待加密数据进行分块,没8字节一块,分别对每一块进行加密。比如6字节数据,最终加密得到的密文是8字节(2个字节做填充),填充字节中的最后一个字节表示填充字节数;再比如8字节数据,最终加密得到的密文是16字节,后8字节做填充。也就是说一个完整的明文经过DES加密的密文,最后一个字节始终是填充字节数,通过该字节就可以删除填充字节还原明文。
但tcp是面向字节的,它看到的是无差别的字节序列,如果server在一个长连接中连续做出两个响应,由于tcp无差别的上传至ssl,这里存在一个问题,解密时如何判断一个完整的http响应?
猜测在ssl层会对加密数据再次封装(添加头信息),如果是最后一个加密数据包,则在该数据包的头信息会将其标识为最后一个数据包,这时client在解密时就可以轻松的判断密文是否结束,从而除去填充字节。
参考:http://kb.cnblogs.com/page/162080/