zoukankan      html  css  js  c++  java
  • .net / java /安卓des加密互通

        
    一 、 C#.net
         /// <summary> 
               /// 加密数据 
               /// </summary> 
               /// <param name="Text"></param> 
               /// <param name="sKey"></param> 
               /// <returns></returns> 
               public static string Encrypt(string Text,string sKey) 
               { 
                DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
                des.Mode = System.Security.Cryptography.CipherMode.ECB;
                byte[] inputByteArray; 
                inputByteArray=Encoding.Default.GetBytes(Text); 
                des.Key = ASCIIEncoding.ASCII.GetBytes(sKey.Substring(0,8));
                des.IV = ASCIIEncoding.ASCII.GetBytes(sKey.Substring(0, 8));
                System.IO.MemoryStream ms=new System.IO.MemoryStream(); 
                CryptoStream cs=new CryptoStream(ms,des.CreateEncryptor(),CryptoStreamMode.Write); 
                cs.Write(inputByteArray,0,inputByteArray.Length); 
                cs.FlushFinalBlock(); 
                StringBuilder ret=new StringBuilder(); 
                foreach( byte b in ms.ToArray()) 
                { 
                 ret.AppendFormat("{0:X2}",b); 
                } 
                return ret.ToString(); 
               }
    
           /// <summary> 
           /// 解密数据 
           /// </summary> 
           /// <param name="Text"></param> 
           /// <param name="sKey"></param> 
           /// <returns></returns> 
           public static string Decrypt(string Text, string sKey)
           {
              
               DESCryptoServiceProvider des = new DESCryptoServiceProvider();
               des.Mode = System.Security.Cryptography.CipherMode.ECB;
               int len;
               len = Text.Length / 2;
               byte[] inputByteArray = new byte[len];
               int x, i;
               for (x = 0; x < len; x++)
               {
                   string txt = Text.Substring(x * 2, 2);
                   i = Convert.ToInt32(txt, 16);
                   inputByteArray[x] = (byte)i;
               }
               des.Key = ASCIIEncoding.ASCII.GetBytes(sKey.Substring(0, 8));
               des.IV = ASCIIEncoding.ASCII.GetBytes(sKey.Substring(0, 8));
               System.IO.MemoryStream ms = new System.IO.MemoryStream();
               CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
               cs.Write(inputByteArray, 0, inputByteArray.Length);
               cs.FlushFinalBlock();
               return Encoding.Default.GetString(ms.ToArray());
           } 
        
    
    二、安卓
    package com.autoapp.pianostave.utils;
    
    /**
     * Created by AndroidJiangJun on 2017/4/18.
     */
    
    import java.security.Key;
    
    import javax.crypto.Cipher;
    
    public class DesUtil {
    
        private static String strDefaultKey = "national";
    
        private Cipher encryptCipher = null;
    
        private Cipher decryptCipher = null;
    
        /**
         * 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[] hexStr2ByteArr(String strIn) 互为可逆的转换过程
         *
         * @param arrB 需要转换的byte数组
         * @return 转换后的字符串
         * @throws Exception 本方法不处理任何异常,所有异常全部抛出
         */
        public static String byteArr2HexStr(byte[] arrB) throws Exception {
            int iLen = arrB.length;
            // 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
            StringBuffer sb = new StringBuffer(iLen * 2);
            for (int i = 0; i < iLen; i++) {
                int intTmp = arrB[i];
                // 把负数转换为正数
                while (intTmp < 0) {
                    intTmp = intTmp + 256;
                }
                // 小于0F的数需要在前面补0
                if (intTmp < 16) {
                    sb.append("0");
                }
                sb.append(Integer.toString(intTmp, 16));
            }
            return sb.toString();
        }
    
        /**
         * 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB) 互为可逆的转换过程
         *
         * @param strIn 需要转换的字符串
         * @return 转换后的byte数组
         * @throws Exception 本方法不处理任何异常,所有异常全部抛出 @ <a href="mailto:leo841001@163.com">LiGuoQing</a>
         */
        public static byte[] hexStr2ByteArr(String strIn) throws Exception {
            byte[] arrB = strIn.getBytes();
            int iLen = arrB.length;
    
            // 两个字符表示一个字节,所以字节数组长度是字符串长度除以2
            byte[] arrOut = new byte[iLen / 2];
            for (int i = 0; i < iLen; i = i + 2) {
                String strTmp = new String(arrB, i, 2);
                arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
            }
            return arrOut;
        }
    
        /**
         * 默认构造方法,使用默认密钥
         *
         * @throws Exception
         */
        public DesUtil() throws Exception {
            this(strDefaultKey);
        }
    
        /**
         * 指定密钥构造方法
         *
         * @param strKey 指定的密钥
         * @throws Exception
         */
        public DesUtil(String strKey) throws Exception {
            Key key = getKey(strKey.getBytes());
    
            // NoPadding
            // PKCS5Padding
    
            encryptCipher = Cipher.getInstance("DES");
            encryptCipher.init(Cipher.ENCRYPT_MODE, key);
    
            decryptCipher = Cipher.getInstance("DES");
            decryptCipher.init(Cipher.DECRYPT_MODE, key);
    
        }
    
        /**
         * 加密字节数组
         *
         * @param arrB 需加密的字节数组
         * @return 加密后的字节数组
         * @throws Exception
         */
        public byte[] encrypt(byte[] arrB) throws Exception {
            return encryptCipher.doFinal(arrB);
        }
    
        /**
         * 加密字符串
         *
         * @param strIn 需加密的字符串
         * @return 加密后的字符串
         * @throws Exception
         */
        public String encrypt(String strIn, String encode) throws Exception {
            return byteArr2HexStr(encrypt(strIn.getBytes(encode)));
        }
    
        /**
         * 解密字节数组
         *
         * @param arrB 需解密的字节数组
         * @return 解密后的字节数组
         * @throws Exception
         */
        public byte[] decrypt(byte[] arrB) throws Exception {
            return decryptCipher.doFinal(arrB);
        }
    
        /**
         * 解密字符串
         *
         * @param strIn 需解密的字符串
         * @return 解密后的字符串
         * @throws Exception
         */
        public String decrypt(String strIn, String encode) throws Exception {
            return new String(decrypt(hexStr2ByteArr(strIn)), encode);
        }
    
        /**
         * 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位
         *
         * @param arrBTmp 构成该字符串的字节数组
         * @return 生成的密钥
         * @throws Exception
         */
        private Key getKey(byte[] arrBTmp) throws Exception {
            // 创建一个空的8位字节数组(默认值为0)
            byte[] arrB = new byte[8];
    
            // 将原始字节数组转换为8位
            for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
                arrB[i] = arrBTmp[i];
            }
    
            // 生成密钥
            Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
    
            return key;
        }
    
        /**
         * DES加密
         *
         * @param key
         * @param str
         * @param encode
         * @return
         */
        public static String encrypt(String key, String str, String encode) {
            try {
                byte[] strBytes = str.getBytes(encode);
                byte[] newStrBytes = new byte[strBytes.length + (8 - strBytes.length % 8)];
                for (int i = 0; i < newStrBytes.length; i++) {
                    newStrBytes[i] = i < strBytes.length ? strBytes[i] : 32;
                }//for
                return new DesUtil(key).encrypt(new String(newStrBytes, encode), encode);
            } catch (Exception e) {
                e.printStackTrace();
                //throw new MPayException(MPayException.MPAY_DES_ERROR,"加密失败",e);
                return "加密失败";
            }
        }
    
        /**
         * DES解密
         *
         * @param key
         * @param str
         * @param encode
         * @return
         */
        public static String decrypt(String key, String str, String encode) {
            try {
                return new DesUtil(key).decrypt(str, encode).replaceAll("\s*$", "");
            } catch (Exception e) {
                e.printStackTrace();
                //throw new MPayException(MPayException.MPAY_DES_ERROR,"解密失败",e);
                return "解密失败";
            }//try
        }
    
    
    
    三、Java
    
    /** *//**
        * DES加解密
        * 
        * @param plainText
        *            要处理的byte[]
        * @param key
        *            密钥
        * @param mode
        *            模式
        * @return
        * @throws InvalidKeyException
        * @throws InvalidKeySpecException
        * @throws NoSuchAlgorithmException
        * @throws NoSuchPaddingException
        * @throws BadPaddingException
        * @throws IllegalBlockSizeException
        * @throws UnsupportedEncodingException
        * @author yayagepei
        * @date 2008-10-8
        */
       private static byte[] coderByDES(byte[] plainText, String key, int mode)
               throws InvalidKeyException, InvalidKeySpecException,
               NoSuchAlgorithmException, NoSuchPaddingException,
               BadPaddingException, IllegalBlockSizeException,
               UnsupportedEncodingException {
           SecureRandom sr = new SecureRandom();
           byte[] resultKey = makeKey(key);
           DESKeySpec desSpec = new DESKeySpec(resultKey);
           SecretKey secretKey = SecretKeyFactory.getInstance("DES").generateSecret(desSpec);
           Cipher cipher = Cipher.getInstance("DES");
           cipher.init(mode, secretKey, sr);
           return cipher.doFinal(plainText);
       }
    
       /** *//**
        * 生产8位的key
        * 
        * @param key
        *            字符串形式
        * @return
        * @throws UnsupportedEncodingException
        * @author yayagepei
        * @date 2008-10-8
        */
       private static byte[] makeKey(String key)
               throws UnsupportedEncodingException {
           byte[] keyByte = new byte[8];
           byte[] keyResult = key.getBytes("UTF-8");
           for (int i = 0; i < keyResult.length && i < keyByte.length; i++) {
               keyByte[i] = keyResult[i];
           }
           return keyByte;
       }
    
       /** *//**
        * DES加密
        * 
        * @param plainText
        *            明文
        * @param key
        *            密钥
        * @return
        * @author yayagepei
        * @date 2008-10-8
        */
       public static String encoderByDES(String plainText, String key) {
           try {
               byte[] result = coderByDES(plainText.getBytes("UTF-8"), key,
                       Cipher.ENCRYPT_MODE);
               return byteArr2HexStr(result);
           } catch (Exception ex) {
               ex.printStackTrace();
               return "";
           }
       }
    
       /** *//**
        * DES解密
        * 
        * @param secretText
        *            密文
        * @param key
        *            密钥
        * @return
        * @author yayagepei
     * @throws Exception
        * @date 2008-10-8
        */
       public static String decoderByDES(String secretText, String key) throws Exception {
               byte[] result = coderByDES(hexStr2ByteArr(secretText), key,
                       Cipher.DECRYPT_MODE);
               return new String(result, "UTF-8");
       }
    
       /** *//**
        * 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[]
        * hexStr2ByteArr(String strIn) 互为可逆的转换过程
        * 
        * @param arrB
        *            需要转换的byte数组
        * @return 转换后的字符串
        */
       private static String byteArr2HexStr(byte[] arrB){
           int iLen = arrB.length;
           // 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
           StringBuffer sb = new StringBuffer(iLen * 2);
           for (int i = 0; i < iLen; i++) {
               int intTmp = arrB[i];
               // 把负数转换为正数
               while (intTmp < 0) {
                   intTmp = intTmp + 256;
               }
               // 小于0F的数需要在前面补0
               if (intTmp < 16) {
                   sb.append("0");
               }
               sb.append(Integer.toString(intTmp, 16));
           }
           return sb.toString();
       }
    
       /** *//**
        * 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB)
        * 互为可逆的转换过程
        * 
        * @param strIn
        *            需要转换的字符串
        * @return 转换后的byte数组
        * @throws NumberFormatException
        */
       private static byte[] hexStr2ByteArr(String strIn)
               throws NumberFormatException {
           byte[] arrB = strIn.getBytes();
           int iLen = arrB.length;
           // 两个字符表示一个字节,所以字节数组长度是字符串长度除以2
           byte[] arrOut = new byte[iLen / 2];
           for (int i = 0; i < iLen; i = i + 2) {
               String strTmp = new String(arrB, i, 2);
               arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
           }
           return arrOut;
       }
  • 相关阅读:
    HEW MAP文件使用
    UltraEdit 脚本 实现查找替换
    PC软件与PLC串口通信 奇偶检验问题
    Halcon的应用程序 打开后 弹出没有帮助文件错误提示
    STM32f4 ARM Bootloader
    RAM
    知识整理--内存
    CentOS 5.x 多个ISO文件 安装方法(VMware)
    Modbus总结
    【CF1253A】Single Push【模拟】
  • 原文地址:https://www.cnblogs.com/MissQing/p/6763574.html
Copyright © 2011-2022 走看看