65.9K
CodeProject 正在变化。 阅读更多。
Home

.NET 对称文件加密对象

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (4投票s)

2002 年 8 月 13 日

4分钟阅读

viewsIcon

91887

downloadIcon

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::CryptographyMyCrypto 命名空间,以便示例更具可读性。要使用该对象,您需要包含 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 对象或本文的看法。如果您有任何问题、意见或批评,请随时告知我。

© . All rights reserved.