如何在没有验证功能的情况下使用Crypto ++验证ECDSA签名?

时间:2014-01-12 19:58:05

标签: digital-signature crypto++ ecdsa

我使用Crypto ++与ECDSA建立了签名者/检查器机制。

问题是,当我想检查签名时,它不能使用验证功能。

您能否提出一种更简洁的方式来验证签名?

1 个答案:

答案 0 :(得分:1)

  

如何在没有验证功能的情况下使用Crypto ++验证ECDSA签名?

我不确定如何在没有验证功能的情况下验证代码。我可能不理解这个问题。

以防万一,这是Crypto ++如何实现其验证码。

首先,ECDSADL_Algorithm_ECDSA(来自eccrypto.h):

//! ECDSA algorithm
template <class EC>
class DL_Algorithm_ECDSA : public DL_Algorithm_GDSA<typename EC::Point>
{
public:
    static const char * CRYPTOPP_API StaticAlgorithmName() {return "ECDSA";}
};
...

template <class EC, class H>
struct ECDSA :
    public DL_SS<DL_Keys_ECDSA<EC>, DL_Algorithm_ECDSA<EC>,
               DL_SignatureMessageEncodingMethod_DSA, H>
{
};

接下来,这是来自DL_Algorithm_GDSA中的gfcrypt.h的验证功能:

bool Verify(const DL_GroupParameters<T> &params, const DL_PublicKey<T> &publicKey,
                const Integer &e, const Integer &r, const Integer &s) const
{
    const Integer &q = params.GetSubgroupOrder();
    if (r>=q || r<1 || s>=q || s<1)
        return false;

    Integer w = s.InverseMod(q);
    Integer u1 = (e * w) % q;
    Integer u2 = (r * w) % q;

    return r == params.ConvertElementToInteger(
                    publicKey.CascadeExponentiateBaseAndPublicElement(u1, u2)) % q;
}

以下代码使用VerifyMessage,以及PK_Verifier中声明的cryptolib.h部分:

virtual bool VerifyMessage(const byte *message, size_t messageLen, 
                 const byte *signature, size_t signatureLength) const;

PK_Verifier是“主”基类,ECDSANRRSASS等对象用于公开一致的界面。

ECDSANRRSASS等对象通过PK_VerifierDL_SS连接:

template <class EC, class H>
struct ECDSA :
    public DL_SS<DL_Keys_ECDSA<EC>, DL_Algorithm_ECDSA<EC>, DL_SignatureMessageEncodingMethod_DSA, H>
{
};

最后,以下是DL_SSPK_Verifier(来自pubkey.h)的关系:

//! Discrete Log Based Signature Scheme
template <class KEYS, class SA, class MEM, class H, class ALG_INFO = DL_SS<KEYS, SA, MEM, H, int> >
class DL_SS : public KEYS
{
    typedef DL_SignatureSchemeOptions<ALG_INFO, KEYS, SA, MEM, H> SchemeOptions;
    ...

    //! implements PK_Signer interface
    typedef PK_FinalTemplate<DL_SignerImpl<SchemeOptions> > Signer;
    //! implements PK_Verifier interface
    typedef PK_FinalTemplate<DL_VerifierImpl<SchemeOptions> > Verifier;
};

  

问题是当我想检查签名时,它不能与验证功能一起使用。

Crypto ++ wiki上有很多代码可用。对于ECDSA,请参阅Elliptic Curve Digital Signature Algorithm。以下是从维基上签署的验证样本。

登录

AutoSeededRandomPool prng;

ECDSA<ECP, SHA1>::PrivateKey privateKey;
privateKey.Load(...);
privateKey.Validate(prng, 3);

ECDSA<ECP, SHA1>::Signer signer(privateKey);

string message = "Do or do not. There is no try.";

// Determine maximum size, allocate a string with the maximum size
size_t siglen = signer.MaxSignatureLength();
string signature(siglen, 0x00);

// Sign, and trim signature to actual size
siglen = signer.SignMessage( prng, message.data(), message.size(), signature.data() );
signature.resize(siglen);

验证

AutoSeededRandomPool prng;

ECDSA<ECP, SHA1>::PublicKey publicKey;
publicKey.Load(...);
publicKey.Validate(prng, 3);

ECDSA<ECP, SHA1>::Verifier verifier(publicKey);

bool result = verifier.VerifyMessage( message.data(), message.size(), signature.data(), signature.size() );
if(result)
  cout << "Verified signature on message" << endl;
else
  cerr << "Failed to verify signature on message" << endl;