pkcs11interop を使用して 3DES キーを作成し、作成するキー値を指定するか、それともキーを作成し、生成されたキー値を出力することができるかどうか疑問に思っていました。基本的に、秘密鍵を別のデバイスにエクスポートする必要があります。
CKA_VALUE 属性を使用してキーを byte[] 配列として渡そうとしましたが、成功しませんでした。
そのようなことは可能ですか?誰か助けてくれませんか?
編集:
これまでのところ運が悪いコードは次のとおりです。
public ObjectHandle generate3DESKey(string keyLabel)
{
ObjectHandle key = null;
// Generate symetric key
// Prepare attribute template of new key
List<ObjectAttribute> objectAttributes = new List<ObjectAttribute>();
objectAttributes.Add(new ObjectAttribute(CKA.CKA_TOKEN, true));
objectAttributes.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_SECRET_KEY));
objectAttributes.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_DES3));
objectAttributes.Add(new ObjectAttribute(CKA.CKA_ENCRYPT, true));
objectAttributes.Add(new ObjectAttribute(CKA.CKA_EXTRACTABLE, true));
objectAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, keyLabel));
// Specify key generation mechanism
Mechanism mechanism = new Mechanism(CKM.CKM_DES3_KEY_GEN);
// Generate key
key = _session.GenerateKey(mechanism, objectAttributes);
List<CKA> retrieveTemplate = new List<CKA>();
retrieveTemplate.Add(CKA.CKA_VALUE);
var test = _session.GetAttributeValue(key, retrieveTemplate);
var testval = test[0].GetValueAsString();
return key;
}
このコードで私が試みているのは、3DES キーを作成し、次に示すように GetAttributeValue を使用してその値を取得することです。GetValueAsByteArray と GetValueAsString を試しましたが、すべて成功しませんでした。私が気付いたのは、作成時に抽出可能な属性を設定したにもかかわらず、取得した属性の cantread プロパティが true に設定されていることです。
これとは別に、3DES キーの生成時にキー値を渡すことも検討しましたが、私を困惑させたのは、CKA.CKA_VALUE で使用されるキー値は長さ 24 のバイト配列である必要があるとドキュメントに記載されているという事実です。作成する必要がある長さは 24 ではなく 16 です。これに似たキーを作成したいと思います。これはここで 16 進数で表されます: 1616161616161616 1010101010101010