我必须像 java 一样在 c# 中加密数据。 我没有从 c# 得到相同的输出,请指导我哪里做错了
这是java代码
DESedeKeySpec keyspec
= new DESedeKeySpec(key.getBytes());
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance(EncryptionAlgorithm.DESede.name());
SecretKey deskey = keyfactory.generateSecret(keyspec);
// Create an 8-byte initialization vector
byte[] iv = new byte[]{(byte) 0x39, 0x39, 0x39, (byte) 0x39, 0x39, 0x39, 0x39, 0x39};
IvParameterSpec ivVector = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance(EncryptionAlgorithm.DESede.name() + "/" + EncryptionMode.CBC.name() + "/"
+ EncryptionPadding.PKCS5Padding.name());
byte[] ciphertext = null;
try {
cipher.init(Cipher.ENCRYPT_MODE, deskey, ivVector);
ciphertext = cipher.doFinal(pass.getBytes());
} catch (Exception e) {
}
这是我的 C# 代码..
public string Encrypt(string toEncrypt, bool useHashing,string key)
{
byte[] keyArray;
byte[] toEncryptArray = Encoding.ASCII.GetBytes(toEncrypt);
string retvalue = "";
if (useHashing)
{
MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
keyArray = hashmd5.ComputeHash(Encoding.ASCII.GetBytes(key));
//Always release the resources and flush data
// of the Cryptographic service provide. Best Practice
hashmd5.Clear();
}
else
keyArray = Encoding.ASCII.GetBytes(key);
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
tdes.IV = new byte[] { 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39 };
tdes.Mode = CipherMode.CBC;
tdes.Padding = PaddingMode.PKCS7;
using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, tdes.CreateEncryptor(keyArray, keyArray), CryptoStreamMode.Write))
{
using (StreamWriter writer = new StreamWriter(cryptoStream))
{
writer.Write(toEncrypt);
cryptoStream.FlushFinalBlock();
writer.Flush();
retvalue = BitConverter.ToString(memoryStream.GetBuffer(), 0, (int)memoryStream.Length).Replace("-","");
writer.Close();
}
cryptoStream.Close();
}
memoryStream.Close();
}
return retvalue;
}
最佳答案
您在 C# 版本中以错误的顺序刷新缓冲区。首先刷新 CryptoStream
,表示您已完成加密操作,然后刷新 StreamWriter
,表示您现在正在写入流,之后您在刷新操作期间完成了最后一个加密 block 。
如果你切换这两个操作,一切都应该有效,但你可以更明确地说明所涉及的操作,而不需要手动刷新和关闭缓冲区,将其留给使用
阻止:
using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, tdes.CreateEncryptor(keyArray, keyArray), CryptoStreamMode.Write))
{
using (StreamWriter writer = new StreamWriter(cryptoStream))
{
writer.Write(toEncrypt);
}
byte[] buffer = memoryStream.ToArray();
retvalue = BitConverter.ToString(buffer, 0, buffer.Length).Replace("-", "");
}
}
关于java - C# 中用于 Java DES 加密的等效代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38407881/