我想在C#和Java中加密相同的數據。如果數據超過7個字節,則Java和C#加密值不相同。C#和Java DES加密值不相同
輸入1:一個
java的輸出:FrOzOp/2Io8 =
C#輸出:FrOzOp/2Io8 =輸入2:ABC
Y: H9A/ahl8K7I =
c#:H9A/ahl8K7I =輸入3:AAAAAAAA(問題)
Y: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;
}
任何想法,爲什麼它如預期不工作?
聽起來像填充問題。請參閱http://msdn.microsoft.com/en-us/library/system.security.cryptography.symmetricalgorithm.padding.aspx –
重要的是兩者之間的往返應該起作用。可以? – spender
@JonSkeet是的,它是填充問題。 java的默認填充機制是什麼? 如果我在java部分中指定'DES/CBC/PKCS5Padding',那麼兩個值都變得相同。 –