2017-11-03 22 views
3

私は現在、ファイルに署名するためにpyPkcs11を使用しています。pacs#11 apiを使用してRSAでsha256ハッシュに署名しますか?

次の呼び出し、RSAおよびSHA256と共通のファイルに署名するために働く

session.sign(privKey, toSign, Mechanism(CKM_SHA256_RSA_PKCS, None) 

しかし、私のファイルの一部がすでに(SHA256)をハッシュ化されており、署名はで与えられる同じ出力を与える必要がありますこのopensslコマンド:私は署名する前に、ファイルのハッシュを生成しません。次の呼び出しを、試してみました

openssl pkeyutl -sign -pkeyopt digest:sha256 -in <inFilePath> -inkey <keyPath> -out <outFilePath> 

session.sign(privKey, toSign, Mechanism(CKM_RSA_PKCS, None) 
一方、

しかし、結果は私が期待されるものではない、とこの記事CKM_RSA_PKCS vs CKM_RSA_X_509 mechanisms in PKCS#11の最初の答えによると、

CKM_RSA_PKCS PKCS#1標準で定義されているようにもパディングを行います。このパディングは、EMSA-PKCS1-v1_5のステップ3,4,5で定義されています。つまり、このメカニズムでは、モジュラスのサイズよりも11バイト短いメッセージのみを受け入れる必要があります。有効なRSASSA-PKCS1-v1_5署名を作成するには、EMSA-PKCS1-v1_5の手順1と2を自分で実行する必要があります。

いくつかの研究の後、私のファイルがRFC 3447で説明署名の最初のステップが含まれていることが表示されますので、不足している部分は、ASN.1値が生成された2つ目です。

pkcs11でこの操作を強制することはできますか?

PKCS#11 documentationには情報が含まれていないようです。

答えて

5

私はこれを行うには2つの方法があります。適切なトークンはトークンに依存します(すべてのトークン/ラッパーがすべてのマカニズムを行うわけではありません)。

  • としては、あなたが完全なパディングを表すメッセージにから開始32オクテットSHA-256を飾ることができ、このother answerで説明します。PKCS#1で説明したように、基本的に、RSA鍵は、私はK ≥ 51 + 11 = 62オクテットをとると(Kオクテットである場合、それは公共モジュラス少なくとも8⋅62-7= 489ビットであり、セキュリティのために必要があります)、あなた

    1. アペンド本当に
       
      DigestInfo ::= SEQUENCE { 
          digestAlgorithm DigestAlgorithm, 
          digest OCTET STRING 
      } 
      
      あたりのハッシュ型と値のためASN.1DERエンコーディングである51オクテット文字列を、降伏左19オクテット文字列
      30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20
    2. また機構CKM_RSA_X_509とK -octet列
    3. サインを得た(K -51-3がFFであるから)K -51オクテット
      00 01 FF FF FF FF..FF FF FF FF 00
      の左列に付加
      (長さkオクテット)。
  • または、代わりに[1]のように実行します。スキップ[2.]; [3]で使用メカニズムCKM_RSA_PKCS(長さ51オクテット)。

免責事項:最近、私は確認せず、PKCS#11デバイスを使用していませんでした。

注:PKCS#1 v1.5署名埋め込みの使用は、正当な実装に対する既知の攻撃はありませんが、例えばFrench authorities recommend

RecomSignAsym-1。  メセニズムの雇用主は、署名の執行のために処分することができます。

(セキュリティプルーフを備えた非対称署名メカニズムを使用することをお勧めします)。彼らはRSA-SSA-PSS(sic)について言及しています。ボーナスとして、そのPKCS#11の実装は、CKM_RSA_PKCS_PSSであり、署名するデータではなくハッシュを受け取り、些細なことをするものです。

+0

ありがとう、私はできるだけ早くそれをやります。 メモの場合、ファイルと署名メカニズムはインターンの選択肢ではなく、クライアントに決定されるため、私はそれらについて制御できません –

2

私が恐れていることは、あなたが望むことができるPKCS#11機能がないことです。私が知っ

唯一の解決策は、でしょう、あなたのハッシュに手動でPKCS#1 v1.5のパディングを適用した後、CKM_RSA_X_509(生または教科書RSA)メカニズムを使用してブロックに署名します。

+0

ありがとう、私はこれが唯一の解決策であると恐れていた –

関連する問題