起因對接合作伙伴的系統,需要對數據進行AES加密
默認的使用了已經寫好的幫助類中加密算法,發現結果不對,各種嘗試改變加密模式改變向量等等折騰快一下午。最后網上查了下AES在JAVA里面的實現完整代碼如下:
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加密
//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加密
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);
}
}
其他解決辦法:讓對方提供一個大包的dll進行調用
