PBOC-DES-MAC 加密

  1 package com.IBus.Servlet;
  2 
  3 import java.security.spec.KeySpec;
  4 
  5 import javax.crypto.Cipher;
  6 import javax.crypto.SecretKey;
  7 import javax.crypto.SecretKeyFactory;
  8 import javax.crypto.spec.DESKeySpec;
  9 
 10 /**
 11  * DES加密、解密
 12  * @ClassName DES
 13  * @author 张月
 14  * @date 2013年8月8日
 15  */
 16 public class DES{
 17     
 18      /**
 19       * DES加密
 20       * @param HexString  字符串(16位16进制字符串)
 21       * @param keyStr     密钥16个1
 22       * @throws Exception
 23       */
 24      public static byte[] SEncrypt_DES(byte[] HexString,byte[] keyStr) throws Exception{
 25              try {
 26                  byte[] theCph = new byte[8];
 27                     try {
 28                        byte[] theKey = null;
 29                        byte[] theMsg = null;
 30                        theMsg = HexString;
 31                        theKey = keyStr;
 32                        KeySpec ks = new DESKeySpec(theKey);
 33                        SecretKeyFactory kf = SecretKeyFactory.getInstance("DES");
 34                        SecretKey ky = kf.generateSecret(ks);
 35                        Cipher cf = Cipher.getInstance("DES/ECB/NoPadding");
 36                        cf.init(Cipher.ENCRYPT_MODE,ky);
 37                        theCph = cf.doFinal(theMsg);
 38 //                       System.out.println("*************DES加密****************");
 39 //                       System.out.println("密钥    : "+bytesToHex(keyStr));
 40 //                       System.out.println("字符串: "+bytesToHex(theMsg));
 41 //                       System.out.println("加密后: "+bytesToHex(theCph));
 42                     } catch (Exception e) {
 43                        e.printStackTrace();
 44                     }
 45                     return theCph;
 46             } catch (Exception e) {
 47                 throw e;
 48             }
 49          }
 50      
 51 //     //进行ECB模式的DES加密,已验证成功
 52 //     public static void main(String[] args) throws Exception {
 53 //         byte[] s = SEncrypt_DES(PBOCDESConvertUtil.hexStringToByte("0123456789ABCDEF"),PBOCDESConvertUtil.hexStringToByte("1111111111111111"));
 54 //         System.out.println(s.length);
 55 //    }
 56      
 57         /**
 58          * DES解密
 59          * 
 60          * @param hexStr  16位十六进制字符串
 61          * @param keyStr  密钥16个1
 62          * @param modeStr 解密模式:ECB
 63          * @throws Exception
 64          */
 65          public static byte[] SDecrypt_DES(byte[] hexStr,byte[] keyStr) throws Exception{
 66                  try {
 67                       String algorithm = "DES/ECB/NoPadding";
 68                       byte[] theCph = new byte[8];
 69                        byte[] theKey = null;
 70                        byte[] theMsg = null;
 71                        theMsg = hexStr;
 72                        theKey = keyStr;
 73                        KeySpec ks = new DESKeySpec(theKey);
 74                        SecretKeyFactory kf
 75                           = SecretKeyFactory.getInstance("DES");
 76                        SecretKey ky = kf.generateSecret(ks);
 77                        Cipher cf = Cipher.getInstance(algorithm);
 78                        cf.init(Cipher.DECRYPT_MODE,ky);
 79                        theCph = cf.doFinal(theMsg);
 80 //                           System.out.println("*************DES解密****************");
 81 //                           System.out.println("密钥    : "+bytesToHex(theKey));
 82 //                           System.out.println("字符串: "+bytesToHex(theMsg));
 83 //                           System.out.println("解密后: "+bytesToHex(theCph));
 84                        
 85                     return theCph; 
 86                  
 87                 } catch (Exception e) {
 88                     throw e;
 89                 }
 90          }
 91      
 92      public static byte[] hexToBytes(String str) {
 93          try {
 94              if (str==null) {
 95                   return null;
 96                } else if (str.length() < 2) {
 97                   return null;
 98                } else {
 99                   int len = str.length() / 2;
100                   byte[] buffer = new byte[len];
101                   for (int i=0; i<len; i++) {
102                       buffer[i] = (byte) Integer.parseInt(
103                          str.substring(i*2,i*2+2),16);
104                   }
105                   return buffer;
106                }
107 
108         } catch (Exception e) {
109             throw e;
110         }
111     }
112     public static String bytesToHex(byte[] data) {
113         try {
114             if (data==null) {
115                 return null;
116                  } else {
117                   int len = data.length;
118                   String str = "";
119                   for (int i=0; i<len; i++) {
120                    if ((data[i]&0xFF)<16) str = str + "0"
121                              + java.lang.Integer.toHexString(data[i]&0xFF);
122                    else str = str
123                              + java.lang.Integer.toHexString(data[i]&0xFF);
124                       }
125                   return str.toUpperCase();
126              }
127         } catch (Exception e) {
128             throw e;
129         }
130     }  
131     
132    
133 }
  1 package com.IBus.Servlet;
  2 
  3 //PBOCDES算法
  4 public class PBOCDES {
  5 
  6     public static void main(String[] args) {
  7         //测试
  8 //        String str= "182012121102335900010000000100000";
  9         String str= "000001000200000031323320150715181901";
 10 //        String str= "303030303031303030323030303030303331333233333230313530373135313831393031";
 11         String result = Get_PBOC_DES_HEX(str,"D4A2A9F58CA33E75", "0000000000000000");
 12         System.out.println(result);
 13     }
 14     
 15     /*
 16      *  PBOCDES加密
 17      *  @param shuju:加密的数据的byte[]
 18      *  @param key:密钥 16位十六进制
 19      *  @param IV:初始向量,默认为0000000000000000
 20      */
 21     public static String Get_PBOC_DES_ASCII(byte[] shuju, String key, String IV)
 22     {
 23         String returntype = "";
 24         try
 25         {
 26              //----------------------------------------
 27              byte[] keyss = new byte[8];
 28              byte[] IVS = new byte[8];
 29              keyss = PBOCDESConvertUtil.hexStringToByte(key);
 30              IVS = PBOCDESConvertUtil.hexStringToByte(IV);
 31              //----------------------------------------
 32              byte[] keys = keyss;
 33              //数据内容字节数组
 34              String slshuju = PBOCDESConvertUtil.bytesToHexString(shuju);
 35              int TLen = 0;
 36              int DBz = 0;
 37              if (slshuju.length() % 16 != 0 || slshuju.length() % 16 == 0)
 38              {
 39                  TLen = (((int)(slshuju.length() / 16)) + 1) * 16;
 40                  DBz = (slshuju.length() / 16) + 1;
 41                  slshuju = slshuju + "8";
 42                  TLen = TLen - slshuju.length();
 43                  for (int i = 0; i < TLen; i++)
 44                  {
 45                      slshuju = slshuju + "0";
 46                  }
 47              }
 48              byte[] Zshuju = new byte[slshuju.length() / 2];
 49              Zshuju = PBOCDESConvertUtil.hexStringToByte(slshuju);
 50              
 51              byte[] D1 = new byte[8];
 52              byte[] D2 = new byte[8];
 53              byte[] I2 = new byte[8];
 54              byte[] I3 = new byte[8];
 55              byte[] bytTemp = new byte[8];
 56              byte[] bytTempX = new byte[8];
 57              //初始向量
 58              byte[] I0 = IVS;
 59              if (DBz >= 1)
 60              {
 61                  for (int i = 0; i < 8; i++)
 62                  {
 63                      D1[i] = Zshuju[i];
 64                  }
 65                  for (int i = 0; i < 8; i++)
 66                  {
 67                      bytTemp[i] = (byte)(I0[i] ^ D1[i]);
 68                  }
 69                  I2 = bytTemp;
 70                  bytTempX = DES.SEncrypt_DES(I2, keys);
 71              }
 72              if (DBz >= 2)
 73              {
 74                  for (int j = 2; j <= DBz; j++)
 75                  {
 76                      for (int i = (j - 1) * 8; i < j * 8; i++)
 77                      {
 78                          D2[i - (j - 1) * 8] = Zshuju[i];
 79                      }
 80                      for (int i = 0; i < 8; i++)
 81                      {
 82                          bytTemp[i] =  (byte)(bytTempX[i] ^ D2[i]);
 83                      }
 84                      I3 = bytTemp;
 85                      bytTempX = DES.SEncrypt_DES(I3, keys);
 86                  }
 87              }
 88              
 89              returntype = PBOCDESConvertUtil.bytesToHexString(bytTempX);
 90              
 91         }catch(Exception e)
 92         {
 93             returntype = "";
 94         }
 95         return returntype;
 96     }
 97     
 98     /*
 99      *  PBOCDES加密
100      *  @param shuju:加密的数据的byte[]
101      *  @param key:密钥 16位十六进制
102      *  @param IV:初始向量,默认为0000000000000000
103      */
104     public static String Get_PBOC_DES_HEX(String slshuju, String key, String IV)
105     {
106         String returntype = "";
107         try
108         {
109             //----------------------------------------
110             byte[] keyss = new byte[8];
111             byte[] IVS = new byte[8];
112             keyss = PBOCDESConvertUtil.hexStringToByte(key);
113             IVS = PBOCDESConvertUtil.hexStringToByte(IV);
114             //----------------------------------------
115             byte[] keys = keyss;
116             int TLen = 0;
117             int DBz = 0;
118             if (slshuju.length() % 16 != 0 || slshuju.length() % 16 == 0)
119             {
120                 TLen = (((int)(slshuju.length() / 16)) + 1) * 16;
121                 DBz = (slshuju.length() / 16) + 1;
122                 slshuju = slshuju + "8";
123                 TLen = TLen - slshuju.length();
124                 for (int i = 0; i < TLen; i++)
125                 {
126                     slshuju = slshuju + "0";
127                 }
128             }
129             byte[] Zshuju = new byte[slshuju.length() / 2];
130             Zshuju = PBOCDESConvertUtil.hexStringToByte(slshuju);
131             
132             byte[] D1 = new byte[8];
133             byte[] D2 = new byte[8];
134             byte[] I2 = new byte[8];
135             byte[] I3 = new byte[8];
136             byte[] bytTemp = new byte[8];
137             byte[] bytTempX = new byte[8];
138             //初始向量
139             byte[] I0 = IVS;
140             if (DBz >= 1)
141             {
142                 for (int i = 0; i < 8; i++)
143                 {
144                     D1[i] = Zshuju[i];
145                 }
146                 for (int i = 0; i < 8; i++)
147                 {
148                     bytTemp[i] = (byte)(I0[i] ^ D1[i]);
149                 }
150                 I2 = bytTemp;
151                 bytTempX = DES.SEncrypt_DES(I2, keys);
152             }
153             if (DBz >= 2)
154             {
155                 for (int j = 2; j <= DBz; j++)
156                 {
157                     for (int i = (j - 1) * 8; i < j * 8; i++)
158                     {
159                         D2[i - (j - 1) * 8] = Zshuju[i];
160                     }
161                     for (int i = 0; i < 8; i++)
162                     {
163                         bytTemp[i] =  (byte)(bytTempX[i] ^ D2[i]);
164                     }
165                     I3 = bytTemp;
166                     bytTempX = DES.SEncrypt_DES(I3, keys);
167                 }
168             }
169             
170             returntype = PBOCDESConvertUtil.bytesToHexString(bytTempX);
171             
172         }catch(Exception e)
173         {
174             returntype = "";
175         }
176         return returntype;
177     }
178     
179 }
  1 package com.IBus.Servlet;
  2 
  3 import java.io.ByteArrayInputStream;  
  4 import java.io.ByteArrayOutputStream;  
  5 import java.io.IOException;  
  6 import java.io.ObjectInputStream;  
  7 import java.io.ObjectOutputStream;  
  8 import java.io.Serializable;  
  9 import java.security.MessageDigest;  
 10 import java.security.NoSuchAlgorithmException;  
 11 
 12 //帮助类
 13 public class PBOCDESConvertUtil {
 14          public final static char[] BToA = "0123456789abcdef".toCharArray();  
 15       
 16         private PBOCDESConvertUtil() {  
 17       
 18         }  
 19       
 20         /** 
 21          * 把16进制字符串转换成字节数组 
 22          *  
 23          * @param hex 
 24          * @return 
 25          */  
 26         public static byte[] hexStringToByte(String hex) {  
 27             int len = (hex.length() / 2);  
 28             byte[] result = new byte[len];  
 29             char[] achar = hex.toCharArray();  
 30             for (int i = 0; i < len; i++) {  
 31                 int pos = i * 2;  
 32                 result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));  
 33             }  
 34             return result;  
 35         }  
 36       
 37         private static byte toByte(char c) {  
 38             byte b = (byte) "0123456789ABCDEF".indexOf(c);  
 39             return b;  
 40         }  
 41       
 42         /** 
 43          * 把字节数组转换成16进制字符串 
 44          *  
 45          * @param bArray 
 46          * @return 
 47          */  
 48         public static final String bytesToHexString(byte[] bArray) {  
 49             if(bArray == null )  
 50             {  
 51                 return "";  
 52             }  
 53             StringBuffer sb = new StringBuffer(bArray.length);  
 54             String sTemp;  
 55             for (int i = 0; i < bArray.length; i++) {  
 56                 sTemp = Integer.toHexString(0xFF & bArray[i]);  
 57                 if (sTemp.length() < 2)  
 58                     sb.append(0);  
 59                 sb.append(sTemp.toUpperCase());  
 60             }  
 61             return sb.toString();  
 62         }  
 63       
 64         /** 
 65          * 把字节数组转换为对象 
 66          *  
 67          * @param bytes 
 68          * @return 
 69          * @throws IOException 
 70          * @throws ClassNotFoundException 
 71          */  
 72         public static final Object bytesToObject(byte[] bytes) throws IOException,  
 73                 ClassNotFoundException {  
 74             ByteArrayInputStream in = new ByteArrayInputStream(bytes);  
 75             ObjectInputStream oi = new ObjectInputStream(in);  
 76             Object o = oi.readObject();  
 77             oi.close();  
 78             return o;  
 79         }  
 80       
 81         /** 
 82          * 把可序列化对象转换成字节数组 
 83          *  
 84          * @param s 
 85          * @return 
 86          * @throws IOException 
 87          */  
 88         public static final byte[] objectToBytes(Serializable s) throws IOException {  
 89             ByteArrayOutputStream out = new ByteArrayOutputStream();  
 90             ObjectOutputStream ot = new ObjectOutputStream(out);  
 91             ot.writeObject(s);  
 92             ot.flush();  
 93             ot.close();  
 94             return out.toByteArray();  
 95         }  
 96       
 97         public static final String objectToHexString(Serializable s)  
 98                 throws IOException {  
 99             return bytesToHexString(objectToBytes(s));  
100         }  
101       
102         public static final Object hexStringToObject(String hex)  
103                 throws IOException, ClassNotFoundException {  
104             return bytesToObject(hexStringToByte(hex));  
105         }  
106       
107         /** 
108          * @函数功能: BCD码转为10进制串(阿拉伯数据) 
109          * @输入参数: BCD码 
110          * @输出结果: 10进制串 
111          */  
112         public static String bcd2Str(byte[] bytes) {  
113             StringBuffer temp = new StringBuffer(bytes.length * 2);  
114       
115             for (int i = 0; i < bytes.length; i++) {  
116                 temp.append((byte) ((bytes[i] & 0xf0) >>> 4));  
117                 temp.append((byte) (bytes[i] & 0x0f));  
118             }  
119             return temp.toString().substring(0, 1).equalsIgnoreCase("0") ? temp  
120                     .toString().substring(1) : temp.toString();  
121         }  
122       
123         /** 
124          * @函数功能: 10进制串转为BCD码 
125          * @输入参数: 10进制串 
126          * @输出结果: BCD码 
127          */  
128         public static byte[] str2Bcd(String asc) {  
129             int len = asc.length();  
130             int mod = len % 2;  
131       
132             if (mod != 0) {  
133                 asc = "0" + asc;  
134                 len = asc.length();  
135             }  
136       
137             byte abt[] = new byte[len];  
138             if (len >= 2) {  
139                 len = len / 2;  
140             }  
141       
142             byte bbt[] = new byte[len];  
143             abt = asc.getBytes();  
144             int j, k;  
145       
146             for (int p = 0; p < asc.length() / 2; p++) {  
147                 if ((abt[2 * p] >= '0') && (abt[2 * p] <= '9')) {  
148                     j = abt[2 * p] - '0';  
149                 } else if ((abt[2 * p] >= 'a') && (abt[2 * p] <= 'z')) {  
150                     j = abt[2 * p] - 'a' + 0x0a;  
151                 } else {  
152                     j = abt[2 * p] - 'A' + 0x0a;  
153                 }  
154       
155                 if ((abt[2 * p + 1] >= '0') && (abt[2 * p + 1] <= '9')) {  
156                     k = abt[2 * p + 1] - '0';  
157                 } else if ((abt[2 * p + 1] >= 'a') && (abt[2 * p + 1] <= 'z')) {  
158                     k = abt[2 * p + 1] - 'a' + 0x0a;  
159                 } else {  
160                     k = abt[2 * p + 1] - 'A' + 0x0a;  
161                 }  
162       
163                 int a = (j << 4) + k;  
164                 byte b = (byte) a;  
165                 bbt[p] = b;  
166             }  
167             return bbt;  
168         }  
169       
170         public static String BCD2ASC(byte[] bytes) {  
171             StringBuffer temp = new StringBuffer(bytes.length * 2);  
172       
173             for (int i = 0; i < bytes.length; i++) {  
174                 int h = ((bytes[i] & 0xf0) >>> 4);  
175                 int l = (bytes[i] & 0x0f);  
176                 temp.append(BToA[h]).append(BToA[l]);  
177             }  
178             return temp.toString();  
179         }  
180       
181         /** 
182          * 两字符数组异或 
183          */  
184         public static byte[] byteArrXor(byte[] arr1, byte[] arr2, int len){  
185             byte[] dest = new byte[len];  
186               
187             if((arr1.length < len) || (arr2.length < len)){  
188                 return null;  
189             }  
190               
191             for(int i = 0;i < len;i++){  
192                 dest[i] = (byte)(arr1[i] ^ arr2[i]);  
193             }  
194               
195             return dest;  
196         }  
197           
198       
199         /** 
200          * MD5加密字符串,返回加密后的16进制字符串 
201          * @param origin 
202          * @return 
203          */  
204         public static String MD5EncodeToHex(String origin) {  
205             return bytesToHexString(MD5Encode(origin));  
206         }  
207       
208         /** 
209          * MD5加密字符串,返回加密后的字节数组 
210          *  
211          * @param origin 
212          * @return 
213          */  
214         public static byte[] MD5Encode(String origin) {  
215             return MD5Encode(origin.getBytes());  
216         }  
217       
218         /** 
219          * MD5加密字节数组,返回加密后的字节数组 
220          *  
221          * @param bytes 
222          * @return 
223          */  
224         public static byte[] MD5Encode(byte[] bytes) {  
225             MessageDigest md = null;  
226             try {  
227                 md = MessageDigest.getInstance("MD5");  
228                 return md.digest(bytes);  
229             } catch (NoSuchAlgorithmException e) {  
230                 e.printStackTrace();  
231                 return new byte[0];  
232             }  
233       
234         }  
235 }
原文地址:https://www.cnblogs.com/xianlg/p/4683221.html