私は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);
}
これは正しいです。 sizeof(signedRandom)と同じです – Snowman
そして、 'strlen'は正しいかもしれません。 'strlen'関数はバイナリデータではなく、Cスタイルの文字列のためだけです。 –