2016-04-18 28 views
1

私はJavaで署名したランダムなC++の署名を検証したいと思います。ここでOpenSSLを使用してC++で署名を確認する

が、私はそれに署名するために使用されるJavaコードです:

Signature signature = Signature.getInstance("SHA256withRSA"); 
signature.initVerify(publicKey); 
signature.update(originalRandom); 
signature.verify(signedRandom); 

何:

public byte[] sign(byte[] random, PrivateKey privateKey){ 
    byte[] signedRandom = null; 

    Signature signature = Signature.getInstance("SHA256withRSA"); 
    signature.initSign(privateKey); 
    signature.update(random); 
    signedRandom = signature.sign(); 

    return signedRandom; 
} 

は、今私はC++で署名を検証したい、私はC++のコードは次のJavaコードに等しい必要があります私はこれまでに試したことがあります:

int verifySignedRandom(unsigned char *signedRandom, unsigned char * originalRandom){ 
     EVP_MD_CTX c; 

     EVP_MD_CTX_init(&c); 
     EVP_VerifyInit(&c, EVP_sha256()); 
     EVP_VerifyUpdate(&c, originalRandom, (unsigned int)sizeof(originalRandom)); 
     return EVP_VerifyFinal(&c, signedRandom, (unsigned int)strlen((char *)signedRandom), savedPublicKey); 
     //savedPublicKey was set somewhere else... 
    } 

このメソッドは0を返しますが、私はランダムが正しいキーで署名されていると確信していますメソッドは1を返す必要がある...私は検証するために私のC++コードに何か問題があると思う。たぶんあなたの誰かが正しいことをする方法を知っています。

--Solution--

int verifySignedRandom(unsigned char *signedRandom, int signedRandomSize, unsigned char * originalRandom, int originalSize){ 
    EVP_MD_CTX *ctx = EVP_MD_CTX_create(); 
    const EVP_MD *md = EVP_get_digestbyname("SHA256"); 

    if(!md){ 
     printf("Error creating md"); 
    } 

    EVP_VerifyInit_ex(ctx, md, NULL); 
    EVP_VerifyUpdate(ctx, originalRandom, originalSize); 
    return EVP_VerifyFinal(ctx, signedRandom, signedRandomSize, savedUserPkey); 
} 

答えて

1
EVP_VerifyUpdate(&c, originalRandom, (unsigned int)sizeof(originalRandom)); 

この行は、バギーに見えます。 sizeof(originalRandom)は常にsizeof(unsigned char*)です。通常は4または8です。代わりに正しい長さを渡す必要があります。

Java配列の長さは埋め込まれていますが、C++ポインタではそうではありません。 originalRandomの長さを明示的に指定するには、別のパラメータをverifySignedRandom()に追加する必要があります。

+0

これは正しいです。 sizeof(signedRandom)と同じです – Snowman

+1

そして、 'strlen'は正しいかもしれません。 'strlen'関数はバイナリデータではなく、Cスタイルの文字列のためだけです。 –

関連する問題