2017-11-30 29 views
2

Pkcs11Interopを使用して、HSMからキーの値を抽出しようとしています。 ...私は鍵がHSMに滞在している、知っているが、私はそれを必要とするので、Pkcs11Interop HSMからキー値を読み取る

私はすでにNCryptokiでそれを行うと私はこのコードを試してみました

Pkcs11Interop

でも、それを行うにはしたいと思い

// Prepare attribute template that defines search criteria 
List<ObjectAttribute> objectAttributes = new List<ObjectAttribute>(); 
objectAttributes.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_SECRET_KEY)); 
objectAttributes.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_DES)); 
objectAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, "MY_KEY")); 

// Find all objects that match provided attributes 
List<ObjectHandle> foundObjects = session.FindAllObjects(objectAttributes); 

var key = foundObjects[0]; 
byte[] plainKeyValue = null; 
List<ObjectAttribute> readAttrs = session.GetAttributeValue(key, new List<CKA>() { CKA.CKA_VALUE }); 
if (readAttrs[0].CannotBeRead) 
    throw new Exception("Key cannot be exported"); 
else 
    plainKeyValue = readAttrs[0].GetValueAsByteArray(); 

plainKeyValueはすべてゼロですが、想像できるとおり、これは当てはまりません。

だから、どうすれば目標に到達できますか?

+0

コードでそれを解決した作業が、唯一の「真= sensistive」とキーとされます。これは正しいです。しかし、私はとにかくその価値を得るために鍵を「ラップアンドラップ」できることを知っています。私はここでそれをどうやって行うことができますか? –

+1

キー値をプレーンテキストにエクスポートすると(あなたのコードはそうしています)、キーのラップ/アンラッピングは2つの非常に異なるオペレーションです。キー値としてゼロを受け取った場合、それらはHSMベンダが提供するPKCS#11ライブラリによって送信され、NCryptokiはPkcs11Interop以外のものを受け取ることはできません。翻訳しようとしているNCryptokiコードを追加できますか?今私はほとんど失われていないので、あなたが達成しようとしていることをよりよく理解するのに役立ちます。 – jariq

+0

返信jariqありがとう。私の答えを見て、私はそのように解決した。今私は別の大きな問題を抱えている、私は専用の質問を投稿し、リンクでここにコメントを書くだろう。 –

答えて

1

私はこのコード

static public byte[] findTargetKeySValue(String label, String type, string command) 
{ 
    try 
    { 
     string pkcs11LibraryPath = @"C:\Program Files\SafeNet\Protect Toolkit 5\Protect Toolkit C SDK\bin\hsm\cryptoki.dll"; 
     Utility.Logger("cryptoki dll path " + pkcs11LibraryPath, command); 
     using (Pkcs11 pkcs11 = new Pkcs11(pkcs11LibraryPath, Inter_Settings.AppType)) 
     { 
      // Find first slot with token present 
      Slot slot = Inter_Helpers.GetUsableSlot(pkcs11); 
      // Open RW session 
      using (Session session = slot.OpenSession(SessionType.ReadOnly)) 
      { 
       // Login as normal user 
       session.Login(CKU.CKU_USER, Inter_Settings.NormalUserPin); 
       // Prepare attribute template that defines search criteria 
       List<ObjectAttribute> objectAttributes = new List<ObjectAttribute>(); 
       objectAttributes.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_SECRET_KEY)); 
       if (type == "DES") 
        objectAttributes.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_DES)); 
       else if (type == "DES2") 
        objectAttributes.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_DES2)); 
       else if (type == "DES3") 
        objectAttributes.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_DES3)); 
       objectAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, label));//PROVAK 

       List<ObjectHandle> foundObjects = session.FindAllObjects(objectAttributes); 
       var key = foundObjects[0]; 
       byte[] plainKeyValue = null; 
       List<ObjectAttribute> readAttrsSensitive = session.GetAttributeValue(key, new List<CKA>() { CKA.CKA_SENSITIVE }); 
       if (!readAttrsSensitive[0].GetValueAsBool()) 
       { 
        Utility.Logger("findTargetKeySValue chiave " + label + " non senstive", command); 
        List<ObjectAttribute> readAttrs = session.GetAttributeValue(key, new List<CKA>() { CKA.CKA_VALUE }); 
        if (readAttrs[0].CannotBeRead) 
         throw new Exception("Key cannot be exported"); 
        else 
         plainKeyValue = readAttrs[0].GetValueAsByteArray(); 
        //Console.WriteLine(ByteArrayToAsciiHEX(plainKeyValue)); 
        session.Logout(); 
        return plainKeyValue; 
       } 
       else 
       { 
        Utility.Logger("findTargetKeySValue chiave " + label + " senstive", command); 
        Console.WriteLine("wrap/unwrap"); 
        objectAttributes = new List<ObjectAttribute>(); 
        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_LABEL, "WRAPPING_KEY")); //WRAPPING_KEY WRK 
        foundObjects = session.FindAllObjects(objectAttributes); 

        var wrappingKey = foundObjects[0]; 
        Mechanism m = new Mechanism(CKM.CKM_DES3_ECB); 

        var wrapped = session.WrapKey(m, wrappingKey, key); 
        //Console.WriteLine("wrapped " + ByteArrayToAsciiHEX(wrapped)); 

        //Console.WriteLine(ByteArrayToAsciiHEX(session.Decrypt(m, wrappingKey, wrapped))); 
        var k = session.Decrypt(m, wrappingKey, wrapped); 
        session.Logout(); 
        return k; 

       } 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     //Console.WriteLine(e.ToSafeString()); 
     Utility.Logger("findTargetKeySValue " + e.ToSafeString(), command); 
     return null; 
    } 
} 
関連する問題