• C#与java中的AES加解密互解算法


    一、C#版AES加解密算法

       public class AESCode 
        {
            public string Key { get; set; }
    
            public string Encrypt(string val)
            {
                if (string.IsNullOrEmpty(val))
                    return null;
    #if CSP
                using (AesCryptoServiceProvider des = new AesCryptoServiceProvider())
    #else
                using (AesManaged des = new AesManaged())
    #endif
                {
                    byte[] inputByteArray = Encoding.UTF8.GetBytes(val);
                    byte[] _key;
                    byte[] _iv;
                    GeneralKeyIV(this.Key, out _key, out _iv);
                    des.Key = _key;
                    des.IV = _iv;
                    using (MemoryStream ms = new MemoryStream())
                    {
                        using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
                        {
                            cs.Write(inputByteArray, 0, inputByteArray.Length);
                            cs.FlushFinalBlock();
                            byte[] bytes = (byte[])ms.ToArray();
                            return Convert.ToBase64String(bytes);
                        }
                    }
                }
            }
    
            public string Decrypt(string val)
            {
                if (string.IsNullOrEmpty(val))
                    return null;
    #if CSP
                using (AesCryptoServiceProvider des = new AesCryptoServiceProvider())
    #else
                using (AesManaged des = new AesManaged())
    #endif
                {
                    byte[] inputByteArray = Convert.FromBase64String(val);
                    byte[] _key;
                    byte[] _iv;
                    GeneralKeyIV(this.Key, out _key, out _iv);
                    des.Key = _key;
                    des.IV = _iv;
                    using (MemoryStream ms = new MemoryStream())
                    {
                        using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
                        {
                            cs.Write(inputByteArray, 0, inputByteArray.Length);
                            cs.FlushFinalBlock();
                            return Encoding.UTF8.GetString(ms.ToArray());
                        }
                    }
                }
            }
    
            public void GeneralKeyIV(string keyStr, out byte[] key, out byte[] iv)
            {
                byte[] bytes = Encoding.UTF8.GetBytes(keyStr);
                key = SHA256Managed.Create().ComputeHash(bytes);
                iv = MD5.Create().ComputeHash(bytes);
            }
    }

    二、Java版算法

    import java.security.MessageDigest;
    import javax.crypto.Cipher;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    
    import org.apache.commons.codec.binary.Base64;
    
    public class AESCode {
    /**
         * 提供密钥和向量进行加密
         * 
         * @param sSrc
         * @param key
         * @param iv
         * @return
         * @throws Exception
         */
        public static String Encrypt(String sSrc, byte[] key, byte[] iv) throws Exception {
            SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");// "算法/模式/补码方式"
            IvParameterSpec _iv = new IvParameterSpec(iv);// 使用CBC模式,需要一个向量iv,可增加加密算法的强度
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, _iv);
            byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
            return Base64.encodeBase64String(encrypted);
        }
    
        /**
         * 提供密钥和向量进行解密
         * 
         * @param sSrc
         * @param key
         * @param iv
         * @return
         * @throws Exception
         */
        public static String Decrypt(String sSrc, byte[] key, byte[] iv) throws Exception {
            SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            IvParameterSpec _iv = new IvParameterSpec(iv);
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, _iv);
            byte[] encrypted = Base64.decodeBase64(sSrc);
            byte[] original = cipher.doFinal(encrypted);
            return new String(original, "utf-8");
        }
    
        /**
         * 使用密钥进行加密
         * 
         * @param sSrc
         * @param keyStr
         * @return
         * @throws Exception
         */
        public static String Encrypt(String sSrc, String keyStr) throws Exception {
            byte[] key = GeneralKey(keyStr);
            byte[] iv = GeneralIv(keyStr);
            SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");// "算法/模式/补码方式"
            IvParameterSpec _iv = new IvParameterSpec(iv);
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, _iv);
            byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
            return Base64.encodeBase64String(encrypted);
        }
    
        /**
         * 使用密钥进行解密
         * 
         * @param sSrc
         * @param keyStr
         * @return
         * @throws Exception
         */
        public static String Decrypt(String sSrc, String keyStr) throws Exception {
            byte[] key = GeneralKey(keyStr);
            byte[] iv = GeneralIv(keyStr);
            SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            IvParameterSpec _iv = new IvParameterSpec(iv);
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, _iv);
            byte[] encrypted = Base64.decodeBase64(sSrc);// 先用base64解码
            byte[] original = cipher.doFinal(encrypted);
            return new String(original, "utf-8");
        }
    
        /**
         * 构建密钥字节码
         * 
         * @param keyStr
         * @return
         * @throws Exception
         */
        private static byte[] GeneralKey(String keyStr) throws Exception {
            byte[] bytes = keyStr.getBytes("utf-8");
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            md.update(bytes);
            return md.digest();
        }
    
        /**
         * 构建加解密向量字节码
         * 
         * @param keyStr
         * @return
         * @throws Exception
         */
        private static byte[] GeneralIv(String keyStr) throws Exception {
            byte[] bytes = keyStr.getBytes("utf-8");
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(bytes);
            return md.digest();
        }
    }

     java版需要commons-codec-1.10.jar,local_policy.jar,US_export_policy.jar

  • 相关阅读:
    flash模拟EEROM
    FATFS_SD卡
    AFIO
    ADC1多通道_DMA_内部温度传感器+内部VREFINT
    QmlBook--Meet Qt 5
    NRF24L01
    MWC飞控V2.3串口通信协议——new Multiwii Serial Protocol
    thread相关http://blog.csdn.net/forwayfarer/article/details/3455130
    comparable与comparator的区别http://blog.csdn.net/mageshuai/article/details/3849143
    ArrayList和LinkedList的区别http://pengcqu.iteye.com/blog/502676
  • 原文地址:https://www.cnblogs.com/zhanqun/p/4380575.html
Copyright © 2020-2023  润新知