【发布时间】:2017-05-30 15:37:47
【问题描述】:
我正在实现智能卡中间件,我需要向其中添加 RSA-PSS 签名方案。我希望我可以覆盖 Crypto++ 中负责私钥操作的代码并免费获得其他所有内容(PSS 和 PKCS 填充)。我认为rsa.cpp 中的这段代码是我想要为智能卡重写的不同代码:
Integer InvertibleRSAFunction::CalculateInverse(RandomNumberGenerator &rng, const Integer &x) const
{
DoQuickSanityCheck();
ModularArithmetic modn(m_n);
Integer r, rInv;
do { // do this in a loop for people using small numbers for testing
r.Randomize(rng, Integer::One(), m_n - Integer::One());
rInv = modn.MultiplicativeInverse(r);
} while (rInv.IsZero());
...
首先我认为这可以通过子类化RSA::PrivateKey来完成
class MyPrivKey : public RSA::PrivateKey {
public:
template<typename... Args>
MyPrivKey(Args&&... args) : RSA::PrivateKey(std::forward<Args>(args)...) {}
Integer CalculateInverse(RandomNumberGenerator &rng, const Integer &x) const override {
return ... // do some smart card magic
}
};
然后将此密钥传递给signer 对象
MyPrivateKey privateKey(params);
// Signer object
RSASS<PSS, SHA1>::Signer signer(privateKey);
但很快我发现privateKey 的所有组件(模数、私有和公共指数等)都只是复制到signer 内部。所以覆盖 RSA::PrivateKey::CalculateInverse 并没有真正的帮助。
然后我迷失在模板中并哭了。我想有人可以帮助我解决这个问题的几率为 0.0001%。我会试试运气的。
我的例子的完整代码https://pastebin.com/Nwk4jX0j
【问题讨论】:
-
Signer是否真的使用这些值,还是调用PrivateKey::CalculateInverse()?如果是后者,你可以给它一些虚假的值来复制,并在智能卡上做你的私人魔法。智能卡是否还没有提供合适的库?
标签: c++ cryptography rsa smartcard crypto++