【发布时间】:2012-10-15 11:30:29
【问题描述】:
我正在尝试使用 C# 和 Java 加密相同的数据。如果数据超过 7 个字节,则 Java 和 C# 的加密值不相同。
-
输入 1:a
java 输出:FrOzOp/2Io8=
C# 输出:FrOzOp/2Io8= -
输入 2:abc
j : H9A/ahl8K7I=
c#: H9A/ahl8K7I= -
输入 3:aaaaaaaa(问题)
j : Gxl7e0aWPd7j6l7uIEuMxA==
c#:Gxl7e0aWPd7sf1xR6hK4VQ==
这里是 C# 和 Java 方法的实现。
C#代码:
public String saltTxt = "12345678";
public String Encrypt(String txt)
{
byte[] data = Encrypt(Encoding.UTF8.GetBytes(txt));
DESCryptoServiceProvider alg = new DESCryptoServiceProvider();
alg.Key = Encoding.UTF8.GetBytes(saltTxt.ToCharArray(), 0, cprovider.KeySize / 8);
alg.IV = new byte[8];
MemoryStream ms = new MemoryStream();
CryptoStream stem = new CryptoStream( ms, cprovider.CreateEncryptor(),CryptoStreamMode.Write);
stem.Write(txt, 0, txt.Length);
stem.FlushFinalBlock();
data = ms.ToArray();
return Convert.ToBase64String(data);
}
Java 代码:
public String saltTxt = "12345678";
public String Encrypt(String str) {
try {
KeySpec myKey = new DESKeySpec(saltTxt.getBytes("UTF8"));
SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(myKey);
Cipher ecipher = Cipher.getInstance("DES");
ecipher.init(Cipher.ENCRYPT_MODE, key);
byte[] data = str.getBytes("UTF8");
byte[] crypt = ecipher.doFinal(data);
return new BASE64Encoder().encode(crypt);
} catch (Exception ex) {
}
return null;
}
知道为什么它没有按预期工作吗?
【问题讨论】:
-
听起来像是填充问题。见msdn.microsoft.com/en-us/library/…
-
重要的是两者之间的往返应该有效。是吗?
-
@JonSkeet 是的,这是填充问题。 java的默认填充机制是什么?如果我在 java 部分中指定
DES/CBC/PKCS5Padding,那么这两个值将变得相同。 -
@NiksonKantiPaul:那么这不能解决你的问题吗?
-
是的,问题解决了。谢谢
标签: c# java encryption cryptography