我尝试使用AES Encrypt为不同的平台加密字符串。我可以成功执行PHP和Java。但是,当我在ASP .NET中尝试它时,它给出了不同的价值。 JAVA代码
String input="Text";
String key="1234567891234567";
byte[] crypted = null;
try {
SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skey);
crypted = cipher.doFinal(input.getBytes());
} catch (Exception exception) {
throw exception;
}
return new String(Base64.encodeBase64(crypted));
ASP代码:
AesManaged tdes = new AesManaged();
tdes.Key = Encoding.UTF8.GetBytes("1234567891234567");
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform crypt = tdes.CreateEncryptor();
byte[] plain = Encoding.UTF8.GetBytes(Text);
byte[] cipher = crypt.TransformFinalBlock(plain, 0,plain.Length);
encryptedText = Convert.ToBase64String(cipher);
我在第二部分做错了什么? 感谢
答案 0 :(得分:1)
您的代码示例可能存在两个问题。我目前无法测试ASP代码,所以这是一个理论:
在您的Java代码中,您有两次调用getBytes()
并且无法提供字符集。这意味着您将使用默认平台字符集。相反,在ASP代码中指定UTF-8。我强烈建议您将Java代码更改为getBytes("UTF-8")
以强制它匹配。
以类似的方式,使用以下代码返回base64结果:
return new String(Base64.encodeBase64(crypted));
我假设这是公共代码Base64
?如果是这样,encodeBase64
方法返回UTF-8字节,但在将字节解释为字符串时,您再次依赖于默认平台字符集。要么改为:
return new String(Base64.encodeBase64(crypted), "UTF-8");
或使用便捷方法:
return Base64.encodeBase64String(crypted);
如果您平台的默认编码不是UTF-8,则上述错误可能会导致您的问题。如果您的默认编码 是UTF-8,那么上述更改将确保您的代码更具可移植性(但可能无法解决您的问题)。
答案 1 :(得分:0)
您可以使用以下代码获得与JAVA
代码完全相同的结果。
Visual Basic代码:
Imports System.Security.Cryptography
Public Shared Function encrypt(data As String, key As String)
Dim tdes As AesManaged = New AesManaged()
tdes.Key = Encoding.UTF8.GetBytes(key)
tdes.Mode = CipherMode.ECB
tdes.Padding = PaddingMode.PKCS7
Dim crypt As ICryptoTransform = tdes.CreateEncryptor()
Dim plain As Byte() = Encoding.UTF8.GetBytes(data)
Dim cipher As Byte() = crypt.TransformFinalBlock(plain, 0, plain.Length)
Dim encryptedText As String = Convert.ToBase64String(cipher)
Return encryptedText
End Function