2017-12-07 12 views
0

これまで私が見てきた2つの異なるアプローチは、OpenSSLで署名:
EVP_PKEY_signとEVP_DigestSignInitの違いは? RSAへ

ctx = EVP_PKEY_CTX_new(signing_key, NULL /* no engine */); 
if (!ctx) 
    /* Error occurred */ 
if (EVP_PKEY_sign_init(ctx) <= 0) 
    /* Error */ 
if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING) <= 0) 
    /* Error */ 
if (EVP_PKEY_CTX_set_signature_md(ctx, EVP_sha256()) <= 0) 
    /* Error */ 

/* Determine buffer length */ 
if (EVP_PKEY_sign(ctx, NULL, &siglen, md, mdlen) <= 0) 

EVP_DigestSignInit でEVP_PKEY_sign で:

if(1 != EVP_DigestSignInit(mdctx, NULL, EVP_sha256(), NULL, key)) 
      goto err; 
if(1 != EVP_DigestSignUpdate(mdctx, msg, strlen(msg))) 
      goto err; 
if(1 != EVP_DigestSignFinal(mdctx, NULL, slen)) 
      goto err; 
if(!(*sig = OPENSSL_malloc(sizeof(unsigned char) * (*slen)))) 
      goto err; 
if(1 != EVP_DigestSignFinal(mdctx, *sig, slen)) 
      goto err; 

は行うには、これらのちょうど2つの異なる方法があります同じこと?

答えて

2

ああ。かなり大きな違いがあります。

EVP_PKEY_sign()は署名対象のデータをハッシュしないため、通常はダイジェストに署名するために使用されます。任意のメッセージに署名するために、EVP_DigestSignInit(3)https://wiki.openssl.org/index.php/Manual:EVP_PKEY_sign(3)

当たり

だからEVP_PKEY_signは非常に高いEVP_Digest SignInitでフード下で使用され、発信者が手動にブロックをフォーマットするアプリケーションのために意図されている参照署名する。

+0

以前のEVP_PKEY_CTX_set_signature_md呼び出しにもかかわらずですか? – olegst

+1

私は現時点ではテストすることができませんが、EVP_PKEY_signをあまりにも多くのデータ(例えば4000バイト)を渡して処理するかどうか試してみてください。もしそうなら、RSAは結果をRAWとして解読し、部品を無視していないことを確認してください。 – lockcmpxchg8b

関連する問題