2016-04-18 2 views
1

Я хочу проверить подпись на C++, которая является случайной, которую я подписал на Java.Проверка подписи на C++ с использованием OpenSSL

Вот код Java я использовал для подписания:

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 код:

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

Что Я пробовал до сих пор:

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++. Возможно, вам придется добавить еще один параметр в verifySignedRandom(), чтобы явно указать длину originalRandom.

+0

Это право. То же самое с sizeof (signedRandom) – Snowman

+1

И 'strlen' тоже не может быть прав. Функция 'strlen' предназначена только для строк C-стиля, а не для двоичных данных. –