关于AES用java加密后,用c#解密的函数对照

Java解密函数

public static String DecodeAES(String text, String key, String iv)
        {
            // 1.构造密钥生成器,指定为 AES 算法,不区分大小写
            KeyGenerator keygen = KeyGenerator.getInstance("AES");
            // 新增下面两行,处理 Linux 操作系统下随机数生成不一致的问题
            SecureRandom secureRandom =
                    SecureRandom.getInstance("SHA1PRNG");
            secureRandom.setSeed(key.getBytes());
            keygen.init(128, secureRandom);
            // 3.产生原始对称密钥
            SecretKey original_key = keygen.generateKey();
            // 4.获得原始对称密钥的字节数组
            byte[] raw = original_key.getEncoded();
            // 5.根据字节数组生成 AES 密钥
            SecretKey key = new SecretKeySpec(raw, "AES");
            // 6.根据指定算法 AES 自成密码器
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            // 7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密
            //            (Decrypt_mode)操作,第二个参数为使用的 KEY
            //// 指定一个初始化向量 (Initialization vector,IV), IV 必须是 16 位
            cipher.init(Cipher.DECRYPT_MODE, key, new
                    IvParameterSpec(iv.getBytes("UTF-8")));
            // 8.将加密并编码后的内容解码成字节数组
            byte[] byte_content = new
                    BASE64Decoder().decodeBuffer(text);
            /*
             * 解密
             */
            byte[] byte_decode = cipher.doFinal(byte_content);
            String AES_decode = new String(byte_decode, "utf-8");
            return AES_decode;

        }

C#对应解密函数

public static string DecodeAES(string text, string key, string iv)
        {
            //对应java的"AES"配置字符串
            var aesManaged = new AesManaged();
            //以下几行属性配置对应java的"AES/CBC/PKCS5Padding"配置字符串
            aesManaged.Mode = CipherMode.CBC;
            aesManaged.Padding = PaddingMode.PKCS7;
            aesManaged.KeySize = 128;
            aesManaged.BlockSize = 128;
            byte[] encryptedData = Convert.FromBase64String(text);
            byte[] pwdBytes = null;
            //对应java的"SHA1PRNG"配置字符串
            using (var sha1 = new SHA1CryptoServiceProvider())
            {
                byte[] hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(key));
                var rd = sha1.ComputeHash(hash);
                pwdBytes = rd.Take(16).ToArray();
            }
            byte[] keyBytes = new byte[16];
            int len = pwdBytes.Length;
            if (len > keyBytes.Length)
                len = keyBytes.Length;
            System.Array.Copy(pwdBytes, keyBytes, len);
            aesManaged.Key = keyBytes;
            aesManaged.IV = Encoding.UTF8.GetBytes(iv);
            ICryptoTransform transform = aesManaged.CreateDecryptor();
            byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
            return Encoding.UTF8.GetString(plainText);
        }

本文原创,请勿转载。如需帮助,请联系我。

posted @ 2019-07-21 15:00  fan178  阅读(712)  评论(0)    收藏  举报