123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- package learn;
- import javax.crypto.Cipher;
- import javax.crypto.SecretKeyFactory;
- import javax.crypto.spec.SecretKeySpec;
- import java.util.Base64.Encoder;
- import java.nio.charset.Charset;
- import java.security.Key;
- import java.security.SecureRandom;
- import java.util.Base64;
- import java.util.Base64.Decoder; //加解密的包
- import javax.crypto.CipherInputStream;
- import javax.crypto.CipherOutputStream;
- import javax.crypto.spec.DESKeySpec;
- import javax.crypto.spec.IvParameterSpec;
- import java.io.*;
- import java.security.spec.AlgorithmParameterSpec;
- public class HelloWorld {
-
- public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";
- public static final byte[] IV={8,3,2,0,2,3,8,0};
- public static final String DEFAULT_CHARSET="UTF-8";
-
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
-
-
- String prefixString="QN=20160801042123;MN=010000A8900016F000169DC0;";
- //原始数据段字符串
- String dataString="ST=61;CN=2061;PW=123456;CP=&&DataTime=20160731001";
- //对数据段进行二次加密(不包含数据段结束标志符&&)
- String encodeString = encode("12345600", dataString, 1);
-
- System.out.println(encodeString);
-
-
- //加上校验前缀
- encodeString=prefixString+encodeString;
- //对加密后的数据段计算crc
- String crc = "";// = Crc16.crc16(encodeString).toUpperCase();
- //附上头部与长度段与加密标志位(加密为1),尾部追加crc校验码
- String originStr="##"+String.format("%04d", encodeString.length())+"1"+encodeString+crc;
- System.out.println("加密后的数据:");
- System.out.println(originStr);
-
-
-
- }
-
-
- public static String encode(String key, String dataStr,int encodeCount) throws Exception
- {
- try {
- SecureRandom random =SecureRandom.getInstance("SHA1PRNG");
- DESKeySpec dks = new DESKeySpec(key.getBytes());
- //将字符串数据转换成字节,使用UTF-8编码
- byte[] data = dataStr.getBytes(Charset.forName("UTF-8"));
- SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
- // key的长度不能够小于8位字节,使用PW段数据后补2个0
- Key secretKey = keyFactory.generateSecret(dks);
- Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
- IvParameterSpec iv = new IvParameterSpec(IV);
- AlgorithmParameterSpec paramSpec = iv;
- cipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec,random);
- //进行多次加密操作,本文档要求为2
- byte[] temp=data;
- for(int i=0;i<encodeCount;i++){
- temp=cipher.doFinal(temp);
- }
- //将加密后的字节码使用不换行的base64编码成字符串,并去掉回车符(据RFC 822规定,每76个字符,还需要加上一个回车换行,但是我们本协议不需要)作为传输报文的数据段传输
- //return new String(Base64.encodeBase64(temp, false));
-
-
- Encoder encoder = Base64.getEncoder();
- String result = encoder.encodeToString(temp);
-
- return result;
- }
- catch (Exception e) {
- throw new Exception(e);
- }
- }
-
-
- }
|