C# AES 加密结果与Java 不同的解决办法

修改key的处理

//AES 加密
		public string Encrypt(string encryptStr, string key)
		{


			byte[] toEncryptArray = Encoding.UTF8.GetBytes(encryptStr);
			byte[] keyArray = null; 
            using (var sha1 = new SHA1CryptoServiceProvider())
            {
                byte[] hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(key));
                var rd = sha1.ComputeHash(hash);
                keyArray = rd.Take(16).ToArray();
            }

          
			RijndaelManaged rDel = new RijndaelManaged();
			rDel.Key = keyArray;
			rDel.Mode = CipherMode.ECB;
			rDel.Padding = PaddingMode.PKCS7;
			ICryptoTransform cTransform = rDel.CreateEncryptor();
			byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
			return Convert.ToBase64String(resultArray);
		}

这样加密出来的,就与java 的相同了

AES加密差一点配置都会使结果不同,调试接口的时候注意几点,ECB,PKCS7或PKCS5 

还有就是key 的问题,跟java 方法对接的时候,需要处理一下。

解密方法

//AES 解密
		public static string AESDecryptString(string decryptStr, string key)
		{
			//仔细观察可以发现,只有这里不同
			byte[] toEncryptArray = Convert.FromBase64String(decryptStr);

			byte[] keyArray = null;
			using (var sha1 = new SHA1CryptoServiceProvider())
			{
				byte[] hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(key));
				var rd = sha1.ComputeHash(hash);
				keyArray = rd.Take(16).ToArray();
			}

			RijndaelManaged rm = new RijndaelManaged
			{
				Key = keyArray,
				Mode = CipherMode.ECB,
				Padding = PaddingMode.PKCS7
			};

			ICryptoTransform cTransform = rm.CreateDecryptor();
			Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
			string result = Encoding.UTF8.GetString(resultArray);
			return result;

			
			
        }

如果你仔细观察加密解密可以发现,他们的不同之处是 toEncryptArray  的处理

你可能感兴趣的:(java,c#,开发语言)