起因对接合作伙伴的系统,需要对数据进行AES加密
默认的使用了已经写好的帮助类中加密算法,发现结果不对,各种尝试改变加密模式改变向量等等折腾快一下午。最后网上查了下AES在JAVA里面的实现完整代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public static String AesEncrypt(String content,String encyKey) { try { KeyGenerator kgen = KeyGenerator.getInstance( "AES" ); SecureRandom secureRandom = SecureRandom.getInstance( "SHA1PRNG" ); secureRandom.setSeed(encyKey.getBytes()); kgen.init( 128 , secureRandom); Cipher cipher=Cipher.getInstance( "AES" ); cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(kgen.generateKey().getEncoded(), "AES" )); byte [] byteContent = content.getBytes( "utf-8" ); byte [] result = cipher.doFinal(byteContent); BASE64Encoder encode = new BASE64Encoder (); String strResult=encode.encode(result); return strResult; } catch (Exception e) { e.printStackTrace(); } return null ; } |
根据博主:http://www.cnblogs.com/amylis_chen/p/6107162.html#commentform 的经验有了思路
解决办法,通过JAVA代码生成AES的密钥,再通过C#代码进行AES加密
1
2
3
4
5
6
7
8
9
10
|
//JAVA代码生成密钥 String encyKey= "合作伙伴提供的密钥 " ; KeyGenerator kgen = KeyGenerator.getInstance( "AES" ); java.security.SecureRandom random = java.security.SecureRandom.getInstance( "SHA1PRNG" ); random.setSeed(encyKey.getBytes()); kgen.init( 128 , random); SecretKey secretKey = kgen.generateKey(); byte [] enCodeFormat = secretKey.getEncoded(); BASE64Encoder coder = new BASE64Encoder(); System.out.println(coder.encode(enCodeFormat)); |
C#代码进行AES加密
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
|
class Program { static void Main( string [] args) { //默认密钥向量 var result = AESEncode( "123456" , "JAVA代码输出的密钥" ); Console.WriteLine(result); Console.ReadLine(); } public static string AESEncode( string encryptString, string encryptKey) { if ( string .IsNullOrEmpty(encryptString)) return null ; Byte[] toEncryptArray = Encoding.UTF8.GetBytes(encryptString); RijndaelManaged rm = new RijndaelManaged { Key = Convert.FromBase64String(encryptKey), Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 }; ICryptoTransform cTransform = rm.CreateEncryptor(); Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return Convert.ToBase64String(resultArray, 0, resultArray.Length); } } |