.NET 对称文件加密对象





3.00/5 (4投票s)
2002 年 8 月 13 日
4分钟阅读

91887

1025
使用 C++ 的托管扩展的文件加密对象
摘要
我曾经愿意支付一个月的薪水来获得像 .NET Framework 类库那样广泛的库。我说这句话的原因是,使用 .NET Framework 库,我可以轻松地为一个项目节省数周的开发时间。但是,就像任何其他库一样,您仍然需要开发自己的对象来抽象底层框架的复杂性。.NET Framework 也不例外。
我正在演示的 CCrypto
对象展示了如何使用 .NET Framework 加密服务类来加密和解密文件。本文档介绍了该对象,并包含实现它的代码示例。
任何新事物都有一个学习曲线。对我来说,.NET Framework 和 C++ 的托管扩展也不例外。由于加密是我非常关注的领域,我决定开始开发隐藏框架复杂性的加密对象,本文展示了这有多么容易。
本文是关于使用 C++ 托管扩展的 .NET Framework 对称加密三部分系列的第一篇。在本文之后,我将发布一个实现该对象的命令行实用程序,以及一篇涵盖对称加密概述和 .NET 加密服务中类的文章。
您需要 Visual C++.NET 才能编译和测试代码。我假设您熟悉 C++ 的托管扩展。
CCrypto 对象
CCrypto
的目的是抽象 .NET Framework 中用于加密、解密、擦除和指纹(哈希)文件的所有类。
要使用 CCrypto
对象,您需要包含该对象的定义头文件并引用命名空间。CCrypto
对象会消耗 SymmetricAlgorithm
类的任何派生加密算法。在加密或解密时,您还需要消耗一个 HashAlgorithm
派生类用于哈希。
哈希函数的选择必须具有与加密函数相似的密钥空间。因此,如果您使用的是产生 128 位密钥的 RC2,请使用具有 128 位密钥空间的 MD5CryptoServiceProvider()
对象。混合搭配密钥空间将引发异常。
CCrypto
对象不直接使用密码短语或密钥文件作为加密密钥。相反,它会创建一个密码短语或密钥文件的哈希,并使用该哈希作为密钥。
对象定义和实现代码列在该对象使用方法的代码片段之后。
问题
我不知道该对象有任何问题。我未能找到任何测试向量来测试 Microsoft 对称加密算法的实现。我也尚未测试加密随机数生成器的质量。我希望加密/解密工作能更快一些。使用我的 P4 1.6Ghz、ATA100 硬盘、XP Pro,使用 RC2 算法,我实现了 7.6 Mb/s 的加密速度,处理一个 20 Mb 的文件。构造函数
CCrypto (SymmetricAlgorithm * CryptoServiceProvider, HashAlgorithm * HashServiceProvider); |
CCrypto (HashAlgorithm * HashServiceProvider); |
CCrypto () |
公共方法
加密 | 加密文件 |
解密 | 解密文件 |
WipeFile | 安全移除文件 |
HashFile | 获取文件的指纹 |
CreateKeyFile | 创建一个包含随机数据的文件 |
属性
get_HashProvider | 设置哈希提供程序 |
set_SetKeyPhrase | 设置加密/解密的密钥短语 |
set_SetFileKey | 设置加密/解密的密钥文件 |
Protected Methods
Crypt | 执行加密/解密 |
HandleException | 异常处理程序 |
实现
bool Encrypt (String * inFilePath, String * OutfilePath)
bool Decrypt (String * inFilePath, String * OutfilePath)
bool WipeFile (String * inFilePath, int nWipes )
bool CreateKeyFile (String * outfilepath, unsigned int nBytes)
Byte HashFile (String * inFile )[]
bool Crypt (int Direction, String * inFilePath, String * OutfilePath);
virtual void HandleException (Exception * e)
__property void set_SetKeyPhrase (String * Phrase)
__property HashAlgorithm * get_HashProvider ()
__property void set_HashProvider (HashAlgorithm * myHashServiceProvider)
__property void set_SetFileKey (String * FileKeyPath)
代码示例
我已引用System::Security::Cryptography
和 MyCrypto
命名空间,以便示例更具可读性。要使用该对象,您需要包含 Crypto.h 头文件。下面是包含和命名空间引用的示例。#using <system.dll>
#include "Crypto.h"
using namespace System::Security::Cryptography ;
using namespace MyCrypto ;
此代码片段用于检索文件的指纹并将其显示到控制台。CCrypto * myCrypto = new CCrypto (new MD5CryptoServiceProvider());
Console::WriteLine( BitConverter::ToString (myCrypto->HashFile ("c:\\encnotes2.txt")) );
此代码示例创建了一个包含随机数据的文件,该文件将用作密钥。随机数据来自 .NET 加密服务中的随机数生成器。这是加密数据的首选方法。密钥文件可以驻留在磁盘、智能卡或 USB 密钥上。CCrypto * myCrypto = new CCrypto ();
// Create key file of c:\mykey.key with 512 bytes of random data
myCrypto->CreateKeyFile ("c:\\mykey.key",512);
此示例演示了如何擦除不再需要的文件。在从设备中删除文件之前,该文件将被覆盖十种模式。CCrypto * myCrypto = new CCrypto ();
// Wipe file with 10 patterns before deleting
myCrypto->WipeFile ("c:\\PersonalNotes.txt",10);
使用 256 位 Rijndael 算法和文件密钥加密文件。CCrypto * myCrypto = new CCrypto (new RijndaelManaged(),new SHA256Managed());
myCrypto->CreateKeyFile ("c:\\mykey.key",512);
myCrypto->SetFileKey = "c:\\mykey.key";
myCrypto->Encrypt ("c:\\PersonalNotes.txt","c:\\PersonalNotes.txt.enc");
要解密文件,我们需要使用相同的算法和密钥。CCrypto * myCrypto = new CCrypto (new RijndaelManaged(),new SHA256Managed());
myCrypto->SetFileKey = "c:\\mykey.key";
myCrypto->Decrypt ("c:\\PersonalNotes.txt.enc","c:\\PersonalNotes.txt");
这是使用密码短语加密文件的示例。CCrypto * myCrypto = new CCrypto (new RijndaelManaged(),new SHA256Managed());
myCrypto->SetKeyPhrase = S"You can place any valid string here.";
myCrypto->Encrypt ("c:\\PersonalNotes.txt","c:\\PersonalNotes.txt.enc");
我很想听听您对 CCrypto
对象或本文的看法。如果您有任何问题、意见或批评,请随时告知我。