2

cryptoki ライブラリを使用して小さなテスト プログラムを作成しているときに、いくつかの問題に遭遇しました。RSA秘密鍵(すべてのパラメータ)を取得したい(持っている)。キーを生成してからパラメーターを抽出するか、既に生成されたパラメーターを使用してキーを手動で設定することを考えました。これまでのところ、私はこれを機能させていません。コードは記事の最後にあります。


抽出

公開指数やモジュラスなどの属性を抽出できるC_GetAttributeValue()があることは知っています。これは公開鍵オブジェクトと秘密鍵オブジェクトの両方で機能しますが、秘密鍵オブジェクトから秘密パラメーターを抽出しようとするとCKR_ATTRIBUTE_SENSITIVEエラーが発生します。これらの属性を抽出する方法はありますか? セッションへのログイン時または初期化中に特定のパラメータを設定する必要がありますか?

キーの手動設定

私の 2 番目のアプローチは、キー マテリアル (OPENSSL で生成されたもの) をファイルから読み取り、それを使用してC_CreateObject()でキー オブジェクトを生成することでした。このファイルには、すべての RSA パラメータ (n、e、d、p、q、dmp1、dmq1、iqmp) が含まれています。読み取り後、ASCII から 16 進表現に変換し、CK_BYTE[]に格納します。ここまでは順調ですね。ここで、秘密鍵を作成するためにこれらすべてをC_CreateObject()に渡すと、 CKR_ATTRIBUTE_VALUE_INVALIDエラー メッセージが表示されます。公開パラメーターを使用して同じ方法で公開鍵オブジェクトを作成すると機能します。作成した公開鍵オブジェクトに対してC_GetAttributeValue()を使用することを確認しました。これがこの方法で可能である場合、秘密鍵オブジェクトを生成するために何が欠けていますか? だと思いますC_GenerateKeyPair()は、キー マテリアルが提供されているかどうかに関係なく、常に新しいキーを生成しますよね?


C コード

これは私が秘密鍵オブジェクトを作成しようとするものです:

CK_OBJECT_HANDLE hPrivateKeys[NUMKEYS];
CK_KEY_TYPE kType= CKK_RSA;
CK_OBJECT_CLASS kClass = CKO_PRIVATE_KEY;
CK_BYTE id[] = {123};
CK_UTF8CHAR label[] = "An RSA private key object";

// sn,sd,se, etc contain the length of the respective parameter
CK_ATTRIBUTE privateKeyTemplate[] = {
            {CKA_CLASS, &kClass, sizeof(kClass)},
            {CKA_KEY_TYPE, &kType, sizeof(kType)},
            {CKA_TOKEN, &false, sizeof(false)},
            {CKA_PRIVATE, &false, sizeof(false)},
            {CKA_SENSITIVE, &false, sizeof(false)},
            {CKA_EXTRACTABLE, &true, sizeof(true)},
            {CKA_ID, id, sizeof(id)},
            {CKA_SUBJECT, NULL_PTR, 0},
            {CKA_DECRYPT, &true, sizeof(true)},
            {CKA_SIGN, &true, sizeof(true)},
            {CKA_LABEL, label, sizeof(label)-1},
            {CKA_ID, id, sizeof(id)},
            {CKA_MODULUS, modulus, sn},
            {CKA_PUBLIC_EXPONENT, publicExponent, se},
            {CKA_PRIVATE_EXPONENT, privateExponent, sd},
            {CKA_PRIME_1, prime1, sp},
            {CKA_PRIME_2, prime2, sq},
            {CKA_EXPONENT_1, exponent1, sdmp1},
            {CKA_EXPONENT_2, exponent2, sdmq1},
            {CKA_COEFFICIENT, coefficient, siqmp}
    };

    CK_ATTRIBUTE publicKeyTemplate[] = {
            {CKA_ENCRYPT, &true, sizeof(true)},
            {CKA_VERIFY, &true, sizeof(true)},
            {CKA_WRAP, &true, sizeof(true)},
            {CKA_MODULUS_BITS, &modulusBits, sizeof(modulusBits)},
            {CKA_PUBLIC_EXPONENT, publicExponent, se},
            {CKA_MODULUS, modulus, sn}
    };

rv = pFunctionList->C_CreateObject(hSession, privateKeyTemplate, NUM_ELEM(privateKeyTemplate), &hPrivateKeys[j]);
4

1 に答える 1

0

キー ペアを生成してから読み取るという考えは問題ありませんがCKA_SENSITIVE、秘密キーのテンプレートで属性を false に設定する必要があります。そのような機能がサポートされているかどうかは、常にトークン自体に依存することに注意してください。

通常、トークンから秘密鍵情報を抽出するときは、暗号化する必要があります。キーの暗号化はラッピングと呼ばれ、機密情報の抽出の可能性はCKA_EXTRACTABLE属性によって管理されます。

読み取り後、ASCII から 16 進表現に変換し、CK_BYTE[] に格納します。

PKCS#11 トークン インターフェイスは、属性をエンコード/デコードする方法を正確に指定します。でたらめにフォーマットを試すだけでは、結果は得られません。

于 2015-05-16T11:25:10.890 に答える