我正在尝试用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在大多数情况下(如果不是全部的话)是一个坏主意,我不打算加密任何严重的问题,这只是一个个人项目。
答案 0 :(得分:1)
这听起来像是装饰设计模式的变体。
您可以让每个cypher类的构造函数将const BlockCipher&
的实例作为参数,并使构造的实例将其存储为链中的下一个密码。
CipherFactory
可以有一个CreateBlockCypherChain()
方法,它接受一个字符串名称数组,并返回从这些密码构造的链。