c# 使用两个密钥的三重 DES 加密
c# Triple DES encryption with two keys
我必须用两个密钥加密一个十六进制字符串。我的代码如下所示:
public byte[] TripleDes(byte[] inputBuffer, byte[] key)
{
byte[] result;
using (TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider())
using (MemoryStream stream = new MemoryStream())
using (CryptoStream cryptoStream = new CryptoStream(stream, des.CreateEncryptor(), CryptoStreamMode.Write))
{
des.Key = key;
// des.KeySize = 128; <- wrong, overrides the values of the key
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.None;
cryptoStream.Write(inputBuffer, 0, inputBuffer.Length);
cryptoStream.FlushFinalBlock();
result = stream.ToArray();
}
return result;
}
设置的密钥为16字节,由两部分组成:第一部分=加密密钥,第二部分=解密密钥。 inputBuffer 是 8 个字节。当我这样做加密时,我的结果是 16 个字节而不是 8 个字节。我做错了什么?
检查 stream.Length
。
使用此函数将流更改为字节数组
public static byte[] ReadFully(Stream input)
{
if (input is MemoryStream)
{
return ((MemoryStream)input).ToArray();
}
else
{
return ReadFully(input);
}
}
代码正确,但顺序不正确。 "TripleDESCryptoServiceProvider" 实例的配置发生在 "CreateEncryptor()" 方法被实例化之后。所以正确的代码是:
public byte[] TripleDes(byte[] inputBuffer, byte[] key)
{
using (TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider())
{
des.Key = key;
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.None;
byte[] result;
using (MemoryStream stream = new MemoryStream())
using (CryptoStream cryptoStream = new CryptoStream(stream, des.CreateEncryptor(), CryptoStreamMode.Write))
{
cryptoStream.Write(inputBuffer, 0, inputBuffer.Length);
cryptoStream.Flush();
//cryptoStream.FlushFinalBlock();
result = stream.ToArray();
}
return result;
}
}
"Flush()" 和 "FlushFinalBlock()" 方法 return 的结果相同,只是 "FlushFinalBlock" 有 8 个字节的额外数据,我不需要也不需要不知道是什么。
我必须用两个密钥加密一个十六进制字符串。我的代码如下所示:
public byte[] TripleDes(byte[] inputBuffer, byte[] key)
{
byte[] result;
using (TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider())
using (MemoryStream stream = new MemoryStream())
using (CryptoStream cryptoStream = new CryptoStream(stream, des.CreateEncryptor(), CryptoStreamMode.Write))
{
des.Key = key;
// des.KeySize = 128; <- wrong, overrides the values of the key
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.None;
cryptoStream.Write(inputBuffer, 0, inputBuffer.Length);
cryptoStream.FlushFinalBlock();
result = stream.ToArray();
}
return result;
}
设置的密钥为16字节,由两部分组成:第一部分=加密密钥,第二部分=解密密钥。 inputBuffer 是 8 个字节。当我这样做加密时,我的结果是 16 个字节而不是 8 个字节。我做错了什么?
检查 stream.Length
。
使用此函数将流更改为字节数组
public static byte[] ReadFully(Stream input)
{
if (input is MemoryStream)
{
return ((MemoryStream)input).ToArray();
}
else
{
return ReadFully(input);
}
}
代码正确,但顺序不正确。 "TripleDESCryptoServiceProvider" 实例的配置发生在 "CreateEncryptor()" 方法被实例化之后。所以正确的代码是:
public byte[] TripleDes(byte[] inputBuffer, byte[] key)
{
using (TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider())
{
des.Key = key;
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.None;
byte[] result;
using (MemoryStream stream = new MemoryStream())
using (CryptoStream cryptoStream = new CryptoStream(stream, des.CreateEncryptor(), CryptoStreamMode.Write))
{
cryptoStream.Write(inputBuffer, 0, inputBuffer.Length);
cryptoStream.Flush();
//cryptoStream.FlushFinalBlock();
result = stream.ToArray();
}
return result;
}
}
"Flush()" 和 "FlushFinalBlock()" 方法 return 的结果相同,只是 "FlushFinalBlock" 有 8 个字节的额外数据,我不需要也不需要不知道是什么。