如何构建加密库

时间:2017-11-04 16:11:36

标签: c++ oop design-patterns cryptography

我正在尝试用C ++编写自己的Crypto库,但是我在OOP方面遇到了一些麻烦。

我正在尝试以允许最佳模块化和可重用性的方式构建我的库,同时对于那些使用库的人来说仍然易于使用。

我已经实现了AES(128,192和256),我能够正确地加密和解密数据(我写了一些使用NIST ECB测试向量的单元测试)

现在我正试图让AES在链式工作中工作。 (所以适当的ECB,CBC,CFB,OFB,......)

我对如何构建我的库的方式感到茫然,这种方式使得“最终用户”(很可能只是我在其他项目中)很容易使用。

现在,这就是我设置它的方式:

我有一个CipherFactory类,它有一个静态方法createBlockCipher,此方法将块密码的名称作为字符串,并返回一个BlockCipher对象,可用于单个块的加密和解密。

我有一个BlockCipher类,基本上是我实现的所有分组密码的超类(现在只是AES,我可能会在此过程中添加更多代码)。 BlockCipher类提供了一些getters来获取blocksize,keysize和算法的名称。它还具有虚拟加密和解密方法,在调用时抛出NotImplemented异常,以防止有人试图用这个虚构的超类加密任何东西。

然后我有一个AES类继承自BlockCipher类并实现其加密和解密方法。

我想我正在寻找的是一些UML类图,设计模式或一般建议,它允许我以优雅的方式实现链接模式。

我已经看过Crypto ++但他们的文档和代码对我来说看起来很神秘(多么讽刺!)。

(对于那些不是在加密部门知识但对OOAD很好的人来说:https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Common_modes

免责声明:我知道DIY-crypto在大多数情况下(如果不是全部的话)是一个坏主意,我不打算加密任何严重的问题,这只是一个个人项目。

1 个答案:

答案 0 :(得分:1)

这听起来像是装饰设计模式的变体。

您可以让每个cypher类的构造函数将const BlockCipher&的实例作为参数,并使构造的实例将其存储为链中的下一个密码。

CipherFactory可以有一个CreateBlockCypherChain()方法,它接受一个字符串名称数组,并返回从这些密码构造的链。