C#与Java互通AES算法加密解密


利用AES加密算法对报文进行加密解密,实现C#与Java互通,网上查了一堆也许是因为版本的原因都用不了,于是还是静心下来自己写个:

直接上代码:

C# 需要引用System.Security.Cryptography命名空间

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 /// AES加密 /// 明文 /// 密钥,长度为16的字符串 /// 偏移量,长度为16的字符串 /// 密文 public static string EncodeAES(string text, string key,string iv) {     RijndaelManaged rijndaelCipher = new RijndaelManaged();     rijndaelCipher.Mode = CipherMode.CBC;     rijndaelCipher.Padding = PaddingMode.Zeros;     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); }   /// AES解密 /// 密文 /// 密钥,长度为16的字符串 /// 偏移量,长度为16的字符串 /// 明文 public static string DecodeAES(string text, string key,string iv) {     RijndaelManaged rijndaelCipher = new RijndaelManaged();     rijndaelCipher.Mode = CipherMode.CBC;     rijndaelCipher.Padding = PaddingMode.Zeros;     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,需要以下引用:

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

另外需要对String和byte[]相互转换的类,我自己写的Base64Helper

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 /**  * @author miracle.qu  * @see AES算法加密明文  * @param data 明文  * @param key 密钥,长度16  * @param iv 偏移量,长度16  * @return 密文  */   public static String encryptAES(String data,String key,String iv) throws Exception {         try {             Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");             int blockSize = cipher.getBlockSize();             byte[] dataBytes = data.getBytes();             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 Base64Helper.encode(encrypted).trim();           catch (Exception e) {             e.printStackTrace();             return null;         }     }       /**      * @author miracle.qu      * @see AES算法解密密文      * @param data 密文      * @param key 密钥,长度16      * @param iv 偏移量,长度16      * @return 明文      */     public static String decryptAES(String data,String key,String iv) throws Exception {         try         {             byte[] encrypted1 = Base64Helper.decode(data);                            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");             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);             return originalString.trim();         }         catch (Exception e) {             e.printStackTrace();             return null;         }     }

  其中Base64Helper类是个简单的类,引用:

import org.apache.commons.codec.binary.Base64;

其中核心代码:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /**  * 编码  * @param byteArray  * @return  */ public static String encode(byte[] byteArray) {     return new String(new Base64().encode(byteArray)); }   /**  * 解码  * @param base64EncodedString  * @return  */ public static byte[] decode(String base64EncodedString) {     return new Base64().decode(base64EncodedString); }

原文地址:  https://blog.csdn.net/mr_qu/article/details/8433370