string param = "{\"idcard\":\"332529196209241717\",\"mobile\":\"13520507685\",\"name\":\"吴神木\"}";
string key="1833ad3ad741456db435163fc5de7e76"
public static string AesEncrypt(string encryptStr, string key)
{
Byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(encryptStr); RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.Zeros; ICryptoTransform cTransform = rDel.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); //return Convert.ToBase64String(resultArray, 0, resultArray.Length);
return ByteArrayToHexString(resultArray);
}
java进行aes加密后的结果为:
AD15C6505362F5E88F92AE89854328CC097790DA1B7DD0361197A9039326239AC73E05605130A696BF99F8544B8BF8680681A29CA3E992D4122BF3ACAE51FC88BAA010AC2B5F07748637792A50D97CEE
但是用C#加密后为:
3A53B8D4FC6667602A9F4C38B047668F5CDEE2A4F65B2E34E05ACF3D99FCA5965562FB12FA9F559C2428C840E7B094A7248AA533222F19A264586ABEA531CCE5D04D0CD8BA30D17545F056300A5A3B4B
java加密代码如下: public static String encode(String key, String data) {
try {
SecretKey secretKey = new SecretKeySpec(hex2bin(key), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] bytes = cipher.doFinal(data.getBytes());
return bin2hex(bytes);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 将2进制转换成16进制
*
* @param bin
* 2进制数组
* @return 16进制字符串
*/
private static String bin2hex(byte[] bin) throws Exception {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < bin.length; i++) {
String hex = Integer.toHexString(bin[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
buf.append(hex.toUpperCase());
}
return buf.toString();
} /**
* 将16进制转换为2进制
*
* @param hex
* 16进制字符串
* @return 2进制数组
*/
private static byte[] hex2bin(String hex) throws Exception {
if (hex.length() < 1)
return null;
byte[] result = new byte[hex.length() / 2];
for (int i = 0; i < hex.length() / 2; i++) {
int high = Integer.parseInt(hex.substring(i * 2, i * 2 + 1), 16);
int low = Integer.parseInt(hex.substring(i * 2 + 1, i * 2 + 2), 16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
string key="1833ad3ad741456db435163fc5de7e76"
public static string AesEncrypt(string encryptStr, string key)
{
Byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(encryptStr); RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.Zeros; ICryptoTransform cTransform = rDel.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); //return Convert.ToBase64String(resultArray, 0, resultArray.Length);
return ByteArrayToHexString(resultArray);
}
java进行aes加密后的结果为:
AD15C6505362F5E88F92AE89854328CC097790DA1B7DD0361197A9039326239AC73E05605130A696BF99F8544B8BF8680681A29CA3E992D4122BF3ACAE51FC88BAA010AC2B5F07748637792A50D97CEE
但是用C#加密后为:
3A53B8D4FC6667602A9F4C38B047668F5CDEE2A4F65B2E34E05ACF3D99FCA5965562FB12FA9F559C2428C840E7B094A7248AA533222F19A264586ABEA531CCE5D04D0CD8BA30D17545F056300A5A3B4B
java加密代码如下: public static String encode(String key, String data) {
try {
SecretKey secretKey = new SecretKeySpec(hex2bin(key), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] bytes = cipher.doFinal(data.getBytes());
return bin2hex(bytes);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 将2进制转换成16进制
*
* @param bin
* 2进制数组
* @return 16进制字符串
*/
private static String bin2hex(byte[] bin) throws Exception {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < bin.length; i++) {
String hex = Integer.toHexString(bin[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
buf.append(hex.toUpperCase());
}
return buf.toString();
} /**
* 将16进制转换为2进制
*
* @param hex
* 16进制字符串
* @return 2进制数组
*/
private static byte[] hex2bin(String hex) throws Exception {
if (hex.length() < 1)
return null;
byte[] result = new byte[hex.length() / 2];
for (int i = 0; i < hex.length() / 2; i++) {
int high = Integer.parseInt(hex.substring(i * 2, i * 2 + 1), 16);
int low = Integer.parseInt(hex.substring(i * 2 + 1, i * 2 + 2), 16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
bin2hex
hex2bin
解密可以了,你居然还不会改加密?
{
string param = "{\"idcard\":\"332529196209241717\",\"mobile\":\"13520507685\",\"name\":\"吴神木\"}";
string key = "1833ad3ad741456db435163fc5de7e76";
Console.WriteLine(AesEncrypt(param, key));
}
public static string AesEncrypt(string encryptStr, string key)
{
Byte[] keyArray = hex2byte(key);
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(encryptStr); RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.Zeros; ICryptoTransform cTransform = rDel.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); //return Convert.ToBase64String(resultArray, 0, resultArray.Length);
return BitConverter.ToString(resultArray).Replace("-", "");
}
static byte[] hex2byte(string str)
{
byte[] byteArray = new byte[str.Length / 2];
for (int i = 0, k = 0; i < str.Length; i += 2, k++)
{
byteArray[k] = (byte)Convert.ToInt16(str.Substring(i, 2), 16);
}
return byteArray;
}
要学会举一反三
对应C#下的
System.Text.Encoding.Default
protected void Button8_Click(object sender, EventArgs e)
{
string data_aes_net = "AD15C6505362F5E88F92AE89854328CC097790DA1B7DD0361197A9039326239AC73E05605130A696BF99F8544B8BF8680681A29CA3E992D4122BF3ACAE51FC88E8DAADA268ED8C6FE1E207FC6F9578D9";
string data_aes_java= "AD15C6505362F5E88F92AE89854328CC097790DA1B7DD0361197A9039326239AC73E05605130A696BF99F8544B8BF8680681A29CA3E992D4122BF3ACAE51FC88BAA010AC2B5F07748637792A50D97CEE";
string result_aes_net = AesDecrypt(data_aes_net, "1833ad3ad741456db435163fc5de7e76");
string result_aes_java = AesDecrypt(data_aes_java, "1833ad3ad741456db435163fc5de7e76");
Response.Write(result_aes_net+"<br>"+result_aes_java);
}
我用C#解密这2个字符串,得到同样的结果,但是用java,第一个就解密不了,第二个可以正常解密;
将 AesEncrypt 方法中的
rDel.Padding = PaddingMode.Zeros;
改为
rDel.Padding = PaddingMode.PKCS7;解码可以不改,因为 C# 要宽松的多(你的 data_aes_net 和 data_aes_java 都可正常解码)
rDel.Padding = PaddingMode.Zeros;
改为
System.Text.Encoding.GetEncoding("gb2312").GetBytes(encryptStr);一点动手能力都没?
try {
if (str == null || key == null) return null;
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes("utf-8"), "AES"));
byte[] bytes = cipher.doFinal(str.getBytes("utf-8"));
return new BASE64Encoder().encode(bytes);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}