Java與.net 互通的AES加密


在用到AES加密的時候 。如果涉及到跨平台的問題。通知會遇到.net與java加密結果不一致的問題。現已找到解決辦法,做以記錄。

 public class AesHelper
    {

        public static string Encry(string text, string key)
        {
            string iv = key;
            if (key.Length > 16)
            {
                // IV為商戶MD5密鑰后16位
                iv = key.Substring(key.Length - 16);
                // RES的KEY 為商戶MD5密鑰的前16位
                key = key.Substring(0, 16);
            }
            return EncodeAES(text, key,iv);
        }

        /// <summary>AES加密</summary>  
        /// <param name="text">明文</param>  
        /// <param name="key">密鑰,長度為16的字符串</param>  
        /// <param name="iv">偏移量,長度為16的字符串</param>  
        /// <returns>密文</returns>  
        public static string EncodeAES(string text, string key, string iv)
        {
    
            RijndaelManaged rijndaelCipher = new RijndaelManaged();
            rijndaelCipher.Mode = CipherMode.CBC;
            rijndaelCipher.Padding = PaddingMode.PKCS7;
            rijndaelCipher.KeySize = 128;
            rijndaelCipher.BlockSize = 128;
            byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(key);
            byte[] keyBytes = new byte[16];
            int len = pwdBytes.Length;
            if (len > keyBytes.Length)
                len = keyBytes.Length;
            System.Array.Copy(pwdBytes, keyBytes, len);
            rijndaelCipher.Key = keyBytes;
            rijndaelCipher.IV = Encoding.UTF8.GetBytes(iv);
            ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
            byte[] plainText = Encoding.UTF8.GetBytes(text);
            byte[] cipherBytes = transform.TransformFinalBlock(plainText, 0, plainText.Length);
            return Convert.ToBase64String(cipherBytes);
        }

        /// <summary>AES解密</summary>  
        /// <param name="text">密文</param>  
        /// <param name="key">密鑰,長度為16的字符串</param>  
        /// <param name="iv">偏移量,長度為16的字符串</param>  
        /// <returns>明文</returns>  
        public static string DecodeAES(string text, string key, string iv)
        {
            RijndaelManaged rijndaelCipher = new RijndaelManaged();
            rijndaelCipher.Mode = CipherMode.CBC;
            rijndaelCipher.Padding = PaddingMode.PKCS7;
            rijndaelCipher.KeySize = 128;
            rijndaelCipher.BlockSize = 128;
            byte[] encryptedData = Convert.FromBase64String(text);
            byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(key);
            byte[] keyBytes = new byte[16];
            int len = pwdBytes.Length;
            if (len > keyBytes.Length)
                len = keyBytes.Length;
            System.Array.Copy(pwdBytes, keyBytes, len);
            rijndaelCipher.Key = keyBytes;
            rijndaelCipher.IV = Encoding.UTF8.GetBytes(iv);
            ICryptoTransform transform = rijndaelCipher.CreateDecryptor();
            byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
            return Encoding.UTF8.GetString(plainText);
        }
    }

  以下是java代碼

public class AesUtil {

	// 加密
	public static String encry(String content, String key) throws Exception {
		String IV = key;
		if (key.length() > 16) {
			// IV為商戶MD5密鑰后16位
			IV = key.substring(key.length() - 16);
			// RES的KEY 為商戶MD5密鑰的前16位
			key = key.substring(0, 16);
		}

		return encryptData(content, key, IV);
	}

	// 加密
	public static String desEncry(String content, String key) throws Exception {
		String IV = key;
		if (key.length() > 16) {
			// IV為商戶MD5密鑰后16位
			IV = key.substring(key.length() - 16);
			// RES的KEY 為商戶MD5密鑰的前16位
			key = key.substring(0, 16);
		}
		return decryptData(content, key, IV);
	}

	/**
	 * aes 加密
	 *
	 * @param data
	 * @return
	 */
	public static String encryptData(String data, String key, String IV) throws Exception {
		try {
			Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
			byte[] dataBytes = data.getBytes("UTF-8");
			int plaintextLength = dataBytes.length;
			// if (plaintextLength % blockSize != 0) {
			// plaintextLength = plaintextLength + (blockSize - (plaintextLength
			// % blockSize));
			// }
			byte[] plaintext = new byte[plaintextLength];
			System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
			SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
			IvParameterSpec ivspec = new IvParameterSpec(IV.getBytes());
			cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
			byte[] encrypted = cipher.doFinal(plaintext);
			return new String(Base64.encodeBase64(encrypted));
		} catch (Exception e) {
			throw e;
		}

	}

	/**
	 * aes 解密
	 *
	 * @param data
	 *            密文
	 * @return
	 */
	public static String decryptData(String data, String key, String IV) throws Exception {
		try {
			byte[] encrypted1 = Base64.decodeBase64(data.getBytes("UTF-8"));
			Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
			SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
			IvParameterSpec ivspec = new IvParameterSpec(IV.getBytes());
			cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
			byte[] original = cipher.doFinal(encrypted1);
			String originalString = new String(original, "UTF-8");
			return originalString;
		} catch (Exception e) {
			throw e;
		}
	}
	
	public static void main(String[] args) throws Exception {
		String a = encry("測試電子有限公司", "XJQ4RSY0ZCO937VK7VDRZFD7R40RQ5PG");
		System.out.println(a);
		
	}

}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM