des-java.txt 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package learn;
  2. import javax.crypto.Cipher;
  3. import javax.crypto.SecretKeyFactory;
  4. import javax.crypto.spec.SecretKeySpec;
  5. import java.util.Base64.Encoder;
  6. import java.nio.charset.Charset;
  7. import java.security.Key;
  8. import java.security.SecureRandom;
  9. import java.util.Base64;
  10. import java.util.Base64.Decoder; //加解密的包
  11. import javax.crypto.CipherInputStream;
  12. import javax.crypto.CipherOutputStream;
  13. import javax.crypto.spec.DESKeySpec;
  14. import javax.crypto.spec.IvParameterSpec;
  15. import java.io.*;
  16. import java.security.spec.AlgorithmParameterSpec;
  17. public class HelloWorld {
  18. public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";
  19. public static final byte[] IV={8,3,2,0,2,3,8,0};
  20. public static final String DEFAULT_CHARSET="UTF-8";
  21. public static void main(String[] args) throws Exception {
  22. // TODO Auto-generated method stub
  23. String prefixString="QN=20160801042123;MN=010000A8900016F000169DC0;";
  24. //原始数据段字符串
  25. String dataString="ST=61;CN=2061;PW=123456;CP=&&DataTime=20160731001";
  26. //对数据段进行二次加密(不包含数据段结束标志符&&)
  27. String encodeString = encode("12345600", dataString, 1);
  28. System.out.println(encodeString);
  29. //加上校验前缀
  30. encodeString=prefixString+encodeString;
  31. //对加密后的数据段计算crc
  32. String crc = "";// = Crc16.crc16(encodeString).toUpperCase();
  33. //附上头部与长度段与加密标志位(加密为1),尾部追加crc校验码
  34. String originStr="##"+String.format("%04d", encodeString.length())+"1"+encodeString+crc;
  35. System.out.println("加密后的数据:");
  36. System.out.println(originStr);
  37. }
  38. public static String encode(String key, String dataStr,int encodeCount) throws Exception
  39. {
  40. try {
  41. SecureRandom random =SecureRandom.getInstance("SHA1PRNG");
  42. DESKeySpec dks = new DESKeySpec(key.getBytes());
  43. //将字符串数据转换成字节,使用UTF-8编码
  44. byte[] data = dataStr.getBytes(Charset.forName("UTF-8"));
  45. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
  46. // key的长度不能够小于8位字节,使用PW段数据后补2个0
  47. Key secretKey = keyFactory.generateSecret(dks);
  48. Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
  49. IvParameterSpec iv = new IvParameterSpec(IV);
  50. AlgorithmParameterSpec paramSpec = iv;
  51. cipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec,random);
  52. //进行多次加密操作,本文档要求为2
  53. byte[] temp=data;
  54. for(int i=0;i<encodeCount;i++){
  55. temp=cipher.doFinal(temp);
  56. }
  57. //将加密后的字节码使用不换行的base64编码成字符串,并去掉回车符(据RFC 822规定,每76个字符,还需要加上一个回车换行,但是我们本协议不需要)作为传输报文的数据段传输
  58. //return new String(Base64.encodeBase64(temp, false));
  59. Encoder encoder = Base64.getEncoder();
  60. String result = encoder.encodeToString(temp);
  61. return result;
  62. }
  63. catch (Exception e) {
  64. throw new Exception(e);
  65. }
  66. }
  67. }