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

SpaceCrypto:一个简单的 Crypto++ 包装器。

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.57/5 (9投票s)

2010 年 6 月 26 日

GPL3

3分钟阅读

viewsIcon

81019

downloadIcon

1916

为了简单地加密/解密您的数据...

引言

这个库可以帮助您使用 Crypto++ 以非常简单的方式开发您的应用程序。它允许对 C++ 只有最基本了解的开发人员快速使用加密库!

我的想法是帮助新的 Crypto++ 程序员避免花费时间阅读 Crypto++ 手册,并将所有 Crypto++ 函数适配到 C++ 标准 string 类型。

Using the Code

SpaceCrypto 命名空间分为两个类:CryptHash。第一个类允许您使用最常用的方法(AES、Twofish、DES等)使用 C++ string 类型 (std::string) 快速执行加密/解密操作。第二个类执行哈希加密 (SHA, MD5, ...)。

Crypto 类用法

现在我们准备好使用这个封装器了。你需要声明的第一个是 SpaceCrypto 命名空间中 Crypt 类的一个实例。您可以使用预定义的 typedef 之一,其中包含大多数常用算法(AES、Blowfish、DES等),或者在类型名称中指定另一种加密算法。

注意:在后一种情况下,您需要包含该算法的库并在类型名称中指定它。

#include "cryptopp560\rc6"
...
SpaceCrypto::Crypt<CryptoPP::RC6> hi;

声明 Crypt 类的实例后,您必须设置明文、密钥,以及可选的 IV。函数参数是不言自明的。请记住,您必须指定传入的 string 格式类型(HEX 或 normal),否则它将自动转换为 normal 输入。您还可以指定输出类型(setInputMode 和 set OutputMode)。当您准备好加密(或解密)您的 string 时,您需要调用 Encrypt()(或 Decrypt())方法。这将返回您处理过的 string

错误处理

  • getStatus() 将返回一个布尔值,表示 obj 的当前状态 (true = 错误;false = 没有错误)
  • getErrorMsg() 将返回一个 string,指示当前错误消息

您一次只能执行一个加密/解密函数。要使用相同的 Crypto 对象执行另一个加密操作,您需要调用 reset() 函数。这是一个安全原因,但它还有另一个解释... 当您第一次调用 Encrypt 函数(或 Decrypt)时,obj 会加密所有数据。因此,如果您再次调用 Encrypt 函数(以检索另一个编码的 string),它不会再次调用 Crypto++ 加密函数,而只是返回已经编码的 string

安全建议:因此,我强烈建议您在转换后立即调用 reset() 函数,如果您不需要再次调用其他函数,因为纯文本 string 和纯文本密钥将保留在 RAM 中,直到您删除该对象!

Hash 类用法

哈希函数的工作方式与 crypto 类类似,但有一些例外

  • 请记住,哈希函数是单向的,因此您无法检索回 string
  • Hash 类提供了 addStr 函数,允许您向纯文本 string 添加一些文本。

类用法(示例)

#include "cryptopp_wrapper.h"

int main()
{
    ...
    cout<<"Space Wrapper TEST!"<<endl<<endl;
    SpaceCrypto::CryptBlowFish hello;
    hello.setPlainString("HelloWorld!");
    hello.setKey("mySecUreKey!!");
    std::string crypt;
    crypt = hello.Encrypt();
    cout<<"Plain Text: HelloWorld!"<<endl;
    cout<<"Crypt Text: "<<crypt<<endl;
    hello.reset();
    hello.setEncString(crypt);
    hello.setInputMode(SpaceCrypto::HEX);
    hello.setKey("mySecUreKey!!");
    hello.setOutputMode(SpaceCrypto::NORMAL);
    cout<<"Decrypted Text: "<<hello.Decrypt()<<endl;
}

链接错误

如果没有包含 cryptopp 库,SpaceCrypto 无法编译。因此,在编译之前,请阅读以下内容

  1. 这里 下载并提取 cryptopp 库。
  2. 通过打开 "cryptlib.dsp" 项目编译 cryptopp static 库,并将生成的库包含在您的项目(在链接器选项中)。
  3. 在您的项目中插入 cryptopp include 文件夹(主目录)。

重要建议

  • 必须在您的项目中包含 cryptlib.lib 才能编译您的代码。
  • 这是一个简单的类,可以帮助程序员编写简单的代码。如果您需要更复杂的东西,您不能使用该类。如果您需要高级功能......您必须学习 Crypto++。
  • Predef IV 初始化为 "0";如果您想更改它,您可以编辑 initializeIV 函数。

待办事项

  • 更好的错误-异常

历史

  • 2010/07/06 - 在 zip 文件中添加了一个示例,教程已修改
  • 2010/06/26 - SpaceCrypto v.1.0.0 发布
  • 2010/09/20 - 更新了源代码
© . All rights reserved.