C#和Java DES加密值不相同
问题内容:
我正在尝试使用C#和Java加密相同的数据。如果数据超过7个字节,则Java和C#加密值不相同。
-
输入1: 一
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;
}
知道为什么它无法按预期工作吗?
问题答案:
问题出在mode
加密方面。
SunJCE提供程序
ECB
用作PKCS5Padding
DES,DES-
EDE和Blowfish密码的默认模式和默认填充方案。(JCA文件)
和
在中
.Net
,对称算法的默认操作模式为CipherMode.CBC
,默认填充为PaddingMode.PKCS7
。(msdn..SymmetricAlgorithm)
进行以下更改可以解决问题。
// in C#
DESCryptoServiceProvider alg = new DESCryptoServiceProvider();
alg.Mode = CipherMode.ECB; // specified
要么
// in java
chiper = Cipher.getInstance("DES/CBC/PKCS5Padding");
双方都不要改变。