我已经写了两个函数来解密和加密C#和Javascript中的消息,但我也需要它在Java中,我无法让它与以前的相同。在Java中重现加密方法
JS加密方法:
this.aesEncrypt = function (encryptedMessage) {
var key = CryptoJS.enc.Utf8.parse("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
var initialVector = CryptoJS.enc.Utf8.parse("xxxxxxxxxxxxxxxx");
var encryptedText = CryptoJS.AES.encrypt(encryptedMessage, key,
{
iv: initialVector,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encryptedText.toString().hexEncode();
}
String.prototype.hexEncode = function() {
var hex, i;
var result = "";
for (i = 0; i < this.length; i++) {
hex = this.charCodeAt(i).toString(16);
result += ("0" + hex).slice(-2);
}
return result;
}
C#解密方法:
private static string AesDecrypt(string encryptedMessage)
{
try
{
var temp = FromHex(encryptedMessage);
var encryptedBytes = Convert.FromBase64String(Encoding.ASCII.GetString(temp));
var aes = new AesCryptoServiceProvider
{
BlockSize = 128,
KeySize = 256,
Mode = CipherMode.CBC,
Padding = PaddingMode.PKCS7,
Key = Encoding.UTF8.GetBytes("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"),
IV = Encoding.UTF8.GetBytes("xxxxxxxxxxxxxxxx")
};
var crypto = aes.CreateDecryptor(aes.Key, aes.IV);
var secret = crypto.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
crypto.Dispose();
return Encoding.ASCII.GetString(secret);
}
catch (Exception)
{
return null;
}
}
public static byte[] FromHex(string hex)
{
hex = hex.Replace("-", "");
var raw = new byte[hex.Length/2];
for (var i = 0; i < raw.Length; i++)
{
raw[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
}
return raw;
}
的Java加密方法:加密后
public static String toHex(String arg) {
return String.format("%x", new BigInteger(1, arg.getBytes()));
}
public static String AesEncrypt(String encryptedMessage){
try {
IvParameterSpec initialVector = new IvParameterSpec("xxxxxxxxxxxxxxxx".getBytes("UTF-8"));
SecretKeySpec secretKeySpec = new SecretKeySpec("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx".getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, initialVector);
byte[] encrypted = cipher.doFinal(encryptedMessage.getBytes());
StringBuilder encryptedSb = new StringBuilder(encrypted.length);
for (byte i : encrypted){
encryptedSb.append(i);
}
return toHex(encryptedSb.toString());
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
爪哇返回80六数字和JS返回48六-digits。 AFAIK Java PKCS5填充与C#PKCS7填充相同。
我也曾尝试使用使用
http://commons.apache.org/proper/commons-codec/download_codec.cgi
结果base64编码,但它仍然不是这个。
public static String AesEncrypt(String encryptedMessage){
try {
IvParameterSpec initialVector = new IvParameterSpec("xxxxxxxxxxxxxxxx".getBytes("UTF-8"));
SecretKeySpec secretKeySpec = new SecretKeySpec("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx".getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, initialVector);
byte[] encrypted = cipher.doFinal(encryptedMessage.getBytes());
byte[] base64 = Base64.encodeBase64(encrypted);
StringBuilder encryptedSb = new StringBuilder(base64.length);
for (byte i : base64){
encryptedSb.append(i);
}
return toHex(encryptedSb.toString());
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
这只是为了好玩吗?你基本上不想实现你自己的加密算法。 – Michael
您正在使用哪个Java提供程序? – Keith
@Michael,我没有实现我自己的算法。我正在使用AES CBC和PKCS7 Padding –