覆盖智能卡的RSA私钥操作?

时间:2017-05-30 15:37:47

标签: c++ cryptography rsa smartcard crypto++

我正在实施智能卡中间件,我需要添加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

的完整代码

1 个答案:

答案 0 :(得分:2)

好吧,我想我需要继承更多东西

class SmartCardPrivateKey : public InvertibleRSAFunction {
public:
  Integer CalculateInverse(RandomNumberGenerator &rng, const Integer &x) const override {
    return ... // do smart card magic here
  }
};

struct SmartCardRSA : public RSA {
  typedef SmartCardPrivateKey PrivateKey;
};

template <class STANDARD, class H>
struct SmartCardRSASS : public TF_SS<SmartCardRSA, STANDARD, H> {
};

然后可以构造自定义签名者对象

SmartCardRSASS<PSS, SHA1>::Signer signer
相关问题