JAVA 【AES/CBC/PKCS5Padding】提供的KEY和IV需要先转换成C#
private static final String AES_CBC = "AES/CBC/PKCS5Padding";
private static final byte[] DEFAULT_KEY = new byte[]{-97, 88, -94, 9, 70, -76, 126, 25, 0, 3, -20, 113, 108, 28, 69, 125};
private static final byte[] DEFAULT_IV = new byte[]{-93, 84, -94, 9, 71, -44, 126, 25, 0, 3, -20, 113, 108, 28, 69, 125};
C# 【AES/CBC/PKCS5Padding】
byte[] DEFAULT_KEY = new byte[] { -97 + 256, 88, -94 + 256, 9, 70, -76 + 256, 126, 25, 0, 3, -20 + 256, 113, 108, 28, 69, 125 };
byte[] DEFAULT_IV = new byte[] { -93 + 256, 84, -94 + 256, 9, 71, -44 + 256, 126, 25, 0, 3, -20 + 256, 113, 108, 28, 69, 125 };
c#的byte边界值为:0~255,
java的byte边界值为:-128~127。 当byte >=0 && byte <127时, 两边是相等的。
所以:java的byte转成C#可识别的byte时,如果byte<0, (byte+ 256) 即为C#可识别的byte。( 列个方程:java +256= C# 则 java = C#-256。 若满足条件 java<0,java>=-128 ,即 ( C#-256 < 0 && C#-256 >= -128 )
C#的byte转成java可识别的byte时,如果 byte >0 && byte<=127,可直接int转byte 。如果 byte >=128 则 javabyte = value - 256
附上C#加解密代码
public static string ToAesEncrypt(string toEncrypt, byte[] keyArray, byte[] ivArray) {
byte[] toEncryptArray = Encoding.UTF8.GetBytes(toEncrypt);
using (var rDel = new RijndaelManaged()) {
rDel.Key = keyArray;
rDel.IV = ivArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
var resultArray = rDel.CreateEncryptor().TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
}
public static string ToAesDecrypt(string toDecrypt, byte[] keyArray, byte[] ivArray) {
byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);
using (var rDel = new RijndaelManaged()) {
rDel.Key = keyArray;
rDel.IV = ivArray;
rDel.Mode = CipherMode.CBC;
rDel.Padding = PaddingMode.PKCS7;
var resultArray = rDel.CreateDecryptor().TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Encoding.UTF8.GetString(resultArray);
}
}