【问题标题】:Override RSA private key operation for Smart Card?覆盖智能卡的 RSA 私钥操作?
【发布时间】: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++


【解决方案1】:

好吧,我发现我需要对更多东西进行子类化

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

【讨论】:

  • @roadmap - 是的,Crypto++ 并不总是适合子类化。像您一样创建新对象通常更容易/最有效。添加德国的数字签名方案(ECGDSA)时,我几乎遇到了确切的问题。这是有原因的,其根源在于 (1) 早期的 C++ 调度问题; (2) 速度和效率。尝试子类化时要注意的另一件事...@ 987654323@。当对象被展平时,它可能会导致 WINdows 出现问题。它在 Linux 和 Unix 上没有定义,所以它对你来说可能不是问题。
  • 您使用的是哪种测试台?我们可能应该建立一个关于该主题的 wiki 页面。我很乐意为我的测试实验室购买设备,只要它不太贵。 (很抱歉用不同的句柄给你打电话。我不确定我在想什么......)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 2014-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多