我试图了解TripleDES加密的简单代码,看看它是如何工作的。我在谷歌上看到了很多代码。其中一些使用了TripleDES类,其中一些使用了TripleDESCryptoServiceProvider类。我所知道的,第二个是从第一个继承的。
TripleDES类:(仅显示加密部分)
static void Main(string[] args)
{
TripleDES TripleDESalg = TripleDES.Create("TripleDES");
string sData = "Here is some data to encrypt.";
byte[] Data = EncryptTextToMemory(sData, TripleDESalg.Key, TripleDESalg.IV);
string Final = DecryptTextFromMemory(Data, TripleDESalg.Key, TripleDESalg.IV);
Console.WriteLine(Final);
Console.ReadLine();
}
public static byte[] EncryptTextToMemory(string Data, byte[] Key, byte[] IV)
{
MemoryStream mStream = new MemoryStream();
TripleDES tripleDESalg = TripleDES.Create();
CryptoStream cStream = new CryptoStream(mStream, tripleDESalg.CreateEncryptor(Key, IV), CryptoStreamMode.Write);
byte[] toEncrypt = new ASCIIEncoding().GetBytes(Data);
cStream.Write(toEncrypt, 0, toEncrypt.Length);
cStream.FlushFinalBlock();
byte[] ret = mStream.ToArray();
cStream.Close();
mStream.Close();
return ret;
}
TripleDESCryptoServiceProvider类:(仅加密代码)
static void Main(string[] args)
{
TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();
string sData = "Here is some data to encrypt.";
byte[] Data = EncryptTextToMemory(sData, tDESalg.Key, tDESalg.IV);
string Final = DecryptTextFromMemory(Data, tDESalg.Key, tDESalg.IV);
Console.WriteLine(Final);
Console.ReadLine();
}
public static byte[] EncryptTextToMemory(string Data, byte [] key, byte[] iv)
{
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream,
new TripleDESCryptoServiceProvider().CreateEncryptor(key, iv ),
CryptoStreamMode.Write);
byte[] toEncrypt = new ASCIIEncoding().GetBytes(Data);
cStream.Write(toEncrypt, 0, toEncrypt.Length);
cStream.FlushFinalBlock();
byte[] ret = mStream.ToArray();
cStream.Close();
mStream.Close();
return ret;
}
两个代码都很好,99%相同。但我的问题是,
这两个班级有什么区别?
哪个班级更受欢迎?
TransformFinalBlock()和FlushFinalBlock()有什么区别?
有些代码没有使用MemoryStream和CryptoStream类。而且效果很好。那么使用这些流有什么好处呢?
最后,在上面的代码中,我如何知道使用了keyize,cyphermode和padding算法?
提前致谢。
答案 0 :(得分:4)
TripleDESCryptoServiceProvider
使用CSP(一种加密服务提供商),它可能是一种软件实现,但它也可以代表智能卡上的实现。
大多数情况下,您应该使用Microsoft在示例代码中所做的TripleDESCryptoServiceProvider
;这样就可以切换CSP(增加安全性或速度)。
FlushFinalBlock
是TransformFinalBlock
的流版本。它表示可以对流上已有的数据执行最后的计算。 TransformFinalBlock也执行最后的计算,但使用给定的数据并返回实际结果。
它们经常被使用。很多代码只是先将所有内容存储在一个字节数组中,然后从中创建一个流。那根本没用。流式传输对于您不希望同时存在于内存中的较大数据块非常有用。或者,如果您想直接传输到文件或从文件传输。当然,您可以创建一个方法,即使对于小数据也可以将流作为参数,因此您可以稍后进行升级。但这通常不是如何使用流。
他们可能由CSP决定,但我找不到该问题的最终答案。与所有加密实现一样,它可能是最安全的不依赖于任何默认值,特别是如果它们定义不明确或每个实现不同。清楚地指定您正在使用的密钥长度等,这使您的代码能够在未来证明并且更易于维护。