टीपीएम (विश्वसनीय प्लेटफॉर्म मॉड्यूल) का उपयोग करके बाइट्स को कैसे एन्क्रिप्ट करें


110

मैं मशीन के टीपीएम मॉड्यूल का उपयोग करके बाइट्स को कैसे एन्क्रिप्ट कर सकता हूं?

CryptProtectData

विंडोज एपीआई का उपयोग करके एक बूँद को एन्क्रिप्ट करने के लिए एक (अपेक्षाकृत) सरल एपीआई प्रदान करता है CryptProtectData, जिसे हम फ़ंक्शन का उपयोग करने के लिए आसान लपेट सकते हैं:

public Byte[] ProtectBytes(Byte[] plaintext)
{
   //...
}

इस ProtectBytesविचार से कम महत्वपूर्ण नहीं हैं कि आप इसे आसानी से उपयोग कर सकते हैं:

  • यहाँ बाइट्स हैं जिन्हें मैं गुप्त कुंजी द्वारा एन्क्रिप्ट किया गया हूं System
  • मुझे वापस एन्क्रिप्टेड बूँद दे

दिया गया बूँद एक अनिर्दिष्ट है प्रलेखन संरचना है जिसमें मूल डेटा को डिक्रिप्ट और वापस करने के लिए आवश्यक सब कुछ शामिल है (हैश एल्गोरिथ्म, सिफर एल्गोरिथ्म, नमक, एचएमएसी हस्ताक्षर, आदि)।

पूर्णता के लिए, यहाँ बाइट को सुरक्षित रखने के लिए नमूना स्यूडोडकोड कार्यान्वयन का ProtectBytesउपयोग किया Crypt APIगया है:

public Byte[] ProtectBytes(Byte[] plaintext)
{
   //Setup our n-byte plaintext blob
   DATA_BLOB dataIn;
   dataIn.cbData = plaintext.Length;
   dataIn.pbData = Addr(plaintext[0]);

   DATA_BLOB dataOut;

   //dataOut = EncryptedFormOf(dataIn)
   BOOL bRes = CryptProtectData(
         dataIn,
         null,     //data description (optional PWideChar)
         null,     //optional entropy (PDATA_BLOB)
         null,     //reserved
         null,     //prompt struct
         CRYPTPROTECT_UI_FORBIDDEN || CRYPTPROTECT_LOCAL_MACHINE,
         ref dataOut);
   if (!bRes) then
   {
      DWORD le = GetLastError();
      throw new Win32Error(le, "Error calling CryptProtectData");
   }

   //Copy ciphertext from dataOut blob into an actual array
   bytes[] result;
   SetLength(result, dataOut.cbData);
   CopyMemory(dataOut.pbData, Addr(result[0]), dataOut.cbData);

   //When you have finished using the DATA_BLOB structure, free its pbData member by calling the LocalFree function
   LocalFree(HANDLE(dataOut.pbData)); //LocalFree takes a handle, not a pointer. But that's what the SDK says.
}

टीपीएम के साथ कैसे करें?

उपरोक्त कोड केवल स्थानीय मशीन के लिए डेटा एन्क्रिप्ट करने के लिए उपयोगी है। डेटा को Systemकुंजी जनरेटर के रूप में खाते का उपयोग करके एन्क्रिप्ट किया गया है ( विवरण, जबकि दिलचस्प है, महत्वहीन हैं )। अंतिम परिणाम यह है कि मैं डेटा एन्क्रिप्ट कर सकता हूं (जैसे एक हार्ड ड्राइव एन्क्रिप्शन मास्टर कुंजी) जिसे केवल स्थानीय मशीन द्वारा डिक्रिप्ट किया जा सकता है।

अब इस एक कदम को आगे बढ़ाने का समय आ गया है। मैं कुछ डेटा (जैसे एक हार्ड ड्राइव एन्क्रिप्शन मास्टर कुंजी) को एन्क्रिप्ट करना चाहता हूं जिसे केवल स्थानीय टीपीएम द्वारा डिक्रिप्ट किया जा सकता है। दूसरे शब्दों में, मैं विंडोज में टीपीएम के साथ, एंड्रॉइड के लिए नीचे ब्लॉक आरेख में क्वालकॉम ट्रस्टेड एक्ज़ीक्यूशन एनवायरनमेंट ( टीईई ) को बदलना चाहता हूं :

यहां छवि विवरण दर्ज करें

नोट : मुझे एहसास है कि टीपीएम डेटा-हस्ताक्षर नहीं करता है (या यदि यह करता है, तो यह गारंटी नहीं देता है कि हर बार एक ही डेटा पर हस्ताक्षर करना एक ही बाइनरी आउटपुट देगा)। यही कारण है कि मैं "RSA हस्ताक्षर" को बदलने के लिए तैयार हूँ " एक हार्डवेयर बाउंड कुंजी के साथ 256-बिट बूँद को एन्क्रिप्ट करने के साथ "

तो कोड कहां है?

समस्या यह है कि टीपीएम प्रोग्रामिंग MSDN पर पूरी तरह से अनिर्दिष्ट है । कोई भी ऑपरेशन करने के लिए कोई एपीआई उपलब्ध नहीं है। इसके बजाय आपको अपने आप को विश्वसनीय कम्प्यूटिंग ग्रुप के सॉफ्टवेयर स्टैक (उर्फ टीएसएस) की एक प्रति ढूंढनी होगी , यह पता लगाना होगा कि किस क्रम में टीपीएम को भेजना है, पेलोड के साथ, किस क्रम में, और सीधे आदेश भेजने के लिए विंडो के Tbsip_Subb_Command फ़ंक्शन को कॉल करें :

TBS_RESULT Tbsip_Submit_Command(
  _In_     TBS_HCONTEXT hContext,
  _In_     TBS_COMMAND_LOCALITY Locality,
  _In_     TBS_COMMAND_PRIORITY Priority,
  _In_     const PCBYTE *pabCommand,
  _In_     UINT32 cbCommand,
  _Out_    PBYTE *pabResult,
  _Inout_  UINT32 *pcbOutput
);

Windows के पास क्रिया करने के लिए कोई उच्च स्तरीय API नहीं है।

यह SATA I / O आदेशों को आपकी हार्ड ड्राइव पर जारी करके एक पाठ फ़ाइल बनाने की कोशिश करने के नैतिक समकक्ष है

सिर्फ ट्राउजर का इस्तेमाल क्यों न करें

विश्वसनीय कम्प्यूटिंग समूह (टीसीजी) ने अपने स्वयं के एपीआई को परिभाषित किया: टीसीबी सॉफ्टवेयर स्टैक (टीएसएस) । इस एपीआई का कार्यान्वयन कुछ लोगों द्वारा बनाया गया था, और इसे ट्राउजर कहा जाता है । एक व्यक्ति ने उस प्रोजेक्ट को विंडोज पर पोर्ट कर दिया

उस कोड के साथ समस्या यह है कि यह विंडोज की दुनिया में पोर्टेबल नहीं है। उदाहरण के लिए, आप इसे डेल्फी से उपयोग नहीं कर सकते, आप इसे C # से उपयोग नहीं कर सकते। इसकी जरूरत है:

  • OpenSSL
  • pThread

मैं सिर्फ यह चाहता हूं कि कोड मेरे टीपीएम के साथ कुछ एन्क्रिप्ट करे।

उपरोक्त के CryptProtectDataलिए फ़ंक्शन बॉडी में इसके अलावा और कुछ नहीं होना चाहिए।

TPM का उपयोग कर डेटा एन्क्रिप्ट करने के लिए समान कोड क्या है? जैसा कि दूसरों ने उल्लेख किया है, आपको संभवतः तीन टीपीएम मैनुअल से परामर्श करना होगा, और खुद को ब्लब्स का निर्माण करना होगा । इसमें संभवतः TPM_sealकमांड शामिल है । हालांकि मुझे लगता है कि मैं डेटा को सील नहीं करना चाहता , मुझे लगता है कि मैं इसे बांधना चाहता हूं :

बाइंडिंग - TPM बाइंड कुंजी का उपयोग कर डेटा को एन्क्रिप्ट करता है, एक स्टोरेज कुंजी से आरएसए एक अद्वितीय कुंजी है। सीलिंग - डेटा को बाइंडिंग के समान तरीके से एन्क्रिप्ट करता है, लेकिन इसके अलावा एक स्थिति भी निर्दिष्ट करता है जिसमें टीपीएम को डिक्रिप्टेड (अनसेल्ड) किए जाने के लिए होना चाहिए

कोड की 20 पंक्तियों को खोजने के लिए मुझे तीन आवश्यक वॉल्यूम पढ़ने की कोशिश करनी चाहिए:

लेकिन मुझे नहीं पता कि मैं क्या पढ़ रहा हूं। यदि किसी प्रकार का ट्यूटोरियल या उदाहरण था, तो मेरे पास एक शॉट हो सकता है। लेकिन मैं पूरी तरह से खो गया हूं।

तो हम Stackoverflow से पूछते हैं

उसी तरह मैं प्रदान करने में सक्षम था:

Byte[] ProtectBytes_Crypt(Byte[] plaintext)
{
   //...
   CryptProtectData(...); 
   //...
}

क्या कोई इसके समकक्ष प्रदान कर सकता है:

Byte[] ProtectBytes_TPM(Byte[] plaintext)
{
   //...
   Tbsip_Submit_Command(...);
   Tbsip_Submit_Command(...);
   Tbsip_Submit_Command(...);
   //...snip...
   Tbsip_Submit_Command(...);
   //...
}

यह वही काम करता है, जो Systemएलएसए में बंद एक कुंजी के बजाय टीपीएम में बंद है?

अनुसंधान की शुरुआत

मुझे ठीक से पता नहीं है कि बाइंड का क्या मतलब है। लेकिन टीपीएम मेन - पार्ट 3 कमांड्स - स्पेसिफिकेशन वर्जन 1.2 को देखते हुए, इसमें बाइंड का उल्लेख है :

10.3 TPM_UnBind

TPM_UnBind डेटा ब्लॉब लेता है जो Tspi_Data_Bind कमांड का परिणाम है और इसे उपयोगकर्ता को निर्यात करने के लिए कम करता है। कॉल करने वाले को कुंजी के उपयोग को अधिकृत करना चाहिए जो आने वाली बूँद को डिक्रिप्ट करेगा। TPM_UnBind ब्लॉक-बाय-ब्लॉक आधार पर संचालित होता है, और एक ब्लॉक और दूसरे के बीच किसी भी संबंध की कोई धारणा नहीं है।

क्या भ्रम है कोई Tspi_Data_Bindआदेश नहीं है ।

अनुसंधान प्रयास

यह भयावह है कि कैसे किसी ने कभी भी टीपीएम या इसके संचालन के दस्तावेज को परेशान नहीं किया है। ऐसा लगता है जैसे वे अपना सारा समय इस शांत चीज़ के साथ खेलने में बिता रहे थे, लेकिन किसी चीज़ के लिए इसे उपयोगी बनाने के दर्दनाक कदम से निपटना नहीं चाहते थे ।

टीपीएम 2.0 के लिए अब (अब) मुफ्त पुस्तक ए प्रैक्टिकल गाइड के साथ शुरू : सुरक्षा के नए युग में विश्वसनीय प्लेटफॉर्म मॉड्यूल का उपयोग करना :

अध्याय 3 - टीपीएम 2.0 पर त्वरित ट्यूटोरियल

टीपीएम की स्व-निर्मित निजी कुंजी तक पहुंच है, इसलिए यह सार्वजनिक कुंजी के साथ कुंजियों को एन्क्रिप्ट कर सकता है और फिर परिणामी बूँद को हार्ड डिस्क पर संग्रहीत कर सकता है। इस तरह, टीपीएम उपयोग के लिए उपलब्ध लगभग असीमित संख्या में चाबियों को रख सकता है लेकिन मूल्यवान आंतरिक भंडारण को बर्बाद नहीं कर सकता। हार्ड डिस्क पर संग्रहीत कीज़ को मिटाया जा सकता है, लेकिन उन्हें बैकअप भी दिया जा सकता है, जो डिजाइनरों को स्वीकार्य ट्रेड-ऑफ की तरह लग रहा था।

मैं टीपीएम की सार्वजनिक कुंजी के साथ एक कुंजी को कैसे एन्क्रिप्ट कर सकता हूं?

अध्याय 4 - मौजूदा अनुप्रयोग जो TPM का उपयोग करते हैं

टीपीएम का उपयोग करना चाहिए कि आवेदन लेकिन नहीं

पिछले कुछ वर्षों में, वेब-आधारित अनुप्रयोगों की संख्या में वृद्धि हुई है। इनमें वेब-आधारित बैकअप और स्टोरेज हैं। बड़ी संख्या में कंपनियां अब ऐसी सेवाओं की पेशकश करती हैं, लेकिन जहां तक ​​हम जानते हैं, इन सेवाओं के लिए कोई भी ग्राहक उपयोगकर्ता को टीपीएम के लिए बैकअप सेवा की कुंजी को लॉक नहीं करने देता है। यदि ऐसा किया जाता है, तो यह निश्चित रूप से अच्छा होगा यदि टीपीएम कुंजी खुद ही कई मशीनों पर डुप्लिकेट करके समर्थित हो। यह डेवलपर्स के लिए एक अवसर प्रतीत होता है।

एक डेवलपर TPM की कुंजी को कैसे लॉक करता है?

अध्याय 9 - उत्तराधिकारिणी

उपयोग मामले: लॉगिंग पासवर्डों का भंडारण

एक विशिष्ट पासवर्ड फ़ाइल पासवर्ड की नमकीन राख को संग्रहीत करती है। सत्यापन में नमकीन बनाना शामिल है और एक आपूर्ति किए गए पासवर्ड को हैशिंग और संग्रहीत मूल्य से तुलना करना है। क्योंकि गणना में कोई रहस्य शामिल नहीं है, यह पासवर्ड फ़ाइल पर एक ऑफ़लाइन हमले के अधीन है।

यह उपयोग मामला TPM- जनरेटेड HMAC कुंजी का उपयोग करता है। पासवर्ड फ़ाइल नमकीन पासवर्ड के HMAC को संग्रहीत करता है। सत्यापन में आपूर्ति किए गए पासवर्ड को नमन और HMAC करना और संग्रहीत मूल्य से उसकी तुलना करना शामिल है। क्योंकि एक ऑफ़लाइन हमलावर के पास HMAC कुंजी नहीं है, हमलावर गणना करके प्रदर्शन पर हमला नहीं कर सकता।

यह काम कर सकता है । यदि टीपीएम में एक गुप्त एचएमएसी कुंजी है, और केवल मेरे टीपीएम को एचएमएसी कुंजी पता है, तो मैं "एचएमएसी" के साथ "साइन (उर्फ टीपीएम एन्क्रिप्ट के साथ निजी कुंजी)" को बदल सकता हूं। लेकिन फिर अगली पंक्ति में वह खुद को पूरी तरह से उलट देता है:

TPM2_Create, HMAC कुंजी निर्दिष्ट कर रहा है

अगर मैं HMAC कुंजी निर्दिष्ट करने के लिए है यह एक TPM रहस्य नहीं है। तथ्य यह है कि एचएमएसी कुंजी गुप्त नहीं है, यह समझ में आता है जब आपको एहसास होता है कि यह क्रिप्टोग्राफिक उपयोगिताओं के बारे में अध्याय है जो टीपीएम प्रदान करता है। अपने आप को SHA2, AES, HMAC, या RSA लिखने के बजाय, आप टीपीएम का पहले से ही उपयोग कर रहे हैं।

अध्याय 10 - कुंजी

एक सुरक्षा उपकरण के रूप में, हार्डवेयर डिवाइस में उन्हें सुरक्षित रखते हुए कुंजियों का उपयोग करने के लिए एक एप्लिकेशन की क्षमता TPM की सबसे बड़ी ताकत है। टीपीएम बाह्य उत्पन्न कीज़ को उत्पन्न और आयात दोनों कर सकता है। यह असममित और सममित कुंजी दोनों का समर्थन करता है।

अति उत्कृष्ट! आप इसे कैसे करते हो!?

कुंजी जेनरेटर

तर्क से, टीपीएम की सबसे बड़ी ताकत एक क्रिप्टोग्राफिक कुंजी उत्पन्न करने और एक हार्डवेयर सीमा के भीतर अपने रहस्य की रक्षा करने की क्षमता है। प्रमुख जनरेटर टीपीएम के अपने यादृच्छिक संख्या जनरेटर पर आधारित है और यादृच्छिकता के बाहरी स्रोतों पर भरोसा नहीं करता है। इस प्रकार यह एंट्रॉपी के अपर्याप्त स्रोत के साथ कमजोर सॉफ्टवेयर्स पर आधारित कमजोरियों को समाप्त करता है।

क्या TPM में क्रिप्टोग्राफ़िक कुंजियाँ उत्पन्न करने और एक हार्डवेयर सीमा के भीतर अपने रहस्यों की रक्षा करने की क्षमता है? है तो, कैसे?

अध्याय 12 - प्लेटफ़ॉर्म कॉन्फ़िगरेशन रजिस्टर

प्राधिकरण के लिए पीसीआर

उपयोग मामले: प्लेटफॉर्म राज्य के लिए एक हार्ड डिस्क की गणना की कुंजी है

पूर्ण-डिस्क एन्क्रिप्शन अनुप्रयोग कहीं अधिक सुरक्षित हैं यदि कोई TPM एन्क्रिप्शन कुंजी की सुरक्षा करता है यदि वह उसी डिस्क पर संग्रहीत है, केवल पासवर्ड द्वारा संरक्षित है। सबसे पहले, टीपीएम हार्डवेयर में एंटी-हैमरिंग प्रोटेक्शन होता है (टीपीएम डिक्शनरी प्रोटेक्शन प्रोटेक्शन के विस्तृत विवरण के लिए चैप्टर 8 देखें), जो पासवर्ड को अव्यवहारिक बनाने के लिए क्रूरतापूर्ण हमला करता है। केवल एक सॉफ्टवेयर द्वारा संरक्षित कुंजी एक कमजोर पासवर्ड से कहीं अधिक कमजोर है। दूसरा, डिस्क पर संग्रहीत एक सॉफ्टवेयर कुंजी चोरी करना कहीं अधिक आसान है। डिस्क (या डिस्क का बैकअप) लें, और आपको कुंजी मिलती है। जब टीपीएम कुंजी रखता है, तो पूरा प्लेटफॉर्म, या कम से कम डिस्क और मदरबोर्ड, चोरी होना चाहिए।

सीलिंग कुंजी को न केवल पासवर्ड से बल्कि एक नीति द्वारा संरक्षित करने की अनुमति देती है। एक विशिष्ट नीति सीलिंग के समय पीसीआर मूल्यों (सॉफ्टवेयर स्थिति) की कुंजी को बंद कर देती है। यह मानता है कि पहले बूट में स्थिति समझौता नहीं है। पहले बूट पर मौजूद किसी भी प्रीइंस्टॉल्ड मैलवेयर को पीसीआर में मापा जाएगा, और इस तरह कुंजी को एक समझौता किए गए सॉफ़्टवेयर स्टेट में सील कर दिया जाएगा। एक कम भरोसेमंद उद्यम में मानक डिस्क छवि और उस छवि का प्रतिनिधित्व करने वाले पीसीआर के लिए सील हो सकती है। इन पीसीआर मूल्यों को संभवतः अधिक विश्वसनीय प्लेटफॉर्म पर प्राथमिकता दी जाएगी। एक और भी अधिक परिष्कृत उद्यम TPM2_PolicyAuthorize का उपयोग करेगा, और विश्वसनीय पीसीआर मूल्यों के एक सेट को अधिकृत करते हुए कई टिकट प्रदान करेगा। PCRbrittleness समस्या को हल करने के लिए नीति प्राधिकृत और उसके आवेदन के विस्तृत विवरण के लिए अध्याय 14 देखें।

हालाँकि एक पासवर्ड भी कुंजी की सुरक्षा कर सकता है, लेकिन TPM कुंजी पासवर्ड के बिना भी सुरक्षा लाभ है। एक हमलावर TPMkey पासवर्ड की आपूर्ति किए बिना प्लेटफ़ॉर्म को बूट कर सकता है लेकिन OS उपयोगकर्ता नाम और पासवर्ड के बिना लॉग इन नहीं कर सकता। OSsecurity डेटा की सुरक्षा करता है। हमलावर एक वैकल्पिक ओएस बूट कर सकता है, लाइव डीवीडी या यूएसबी स्टिक से कह सकता है कि हार्ड ड्राइव से, ओएस लॉगिन सुरक्षा को बायपास करने के लिए। हालाँकि, यह भिन्न बूट कॉन्फ़िगरेशन और सॉफ़्टवेयर PCRvalues ​​को बदल देगा। क्योंकि ये नए PCR सीलबंद मूल्यों से मेल नहीं खाते हैं, TPM डिक्रिप्शन कुंजी को रिलीज़ नहीं करेगा, और हार्ड ड्राइव को डिक्रिप्ट नहीं किया जा सकता है।

अति उत्कृष्ट! यह वास्तव में उपयोग मामला है जो मैं चाहता हूँ। यह उपयोग का मामला भी है जिसके लिए Microsoft TPM का उपयोग करता है। मैं यह कैसे करुं!?

इसलिए मैंने उस पूरी किताब को पढ़ा, और इसने कुछ भी उपयोगी नहीं दिया। यह काफी प्रभावशाली है क्योंकि यह 375 पृष्ठ है। आपको आश्चर्य है कि पुस्तक में क्या निहित है - और इस पर पीछे मुड़कर, मुझे कोई पता नहीं है।

इसलिए हम टीपीएम की प्रोग्रामिंग के लिए निश्चित गाइड पर छोड़ देते हैं, और माइक्रोसॉफ्ट से कुछ डॉक्यूमेंटेशन के बजाय मुड़ जाते हैं:

से माइक्रोसॉफ्ट TPM मंच क्रिप्टो-प्रदाता टूलकिट । इसमें उल्लेख है कि मैं क्या करना चाहता हूं:

इंडोर्समेंट की या ई.के.

ईके को मंच के लिए एक विश्वसनीय क्रिप्टोग्राफिक पहचानकर्ता प्रदान करने के लिए डिज़ाइन किया गया है। एक एंटरप्राइज़ अपने उद्यम में सभी पीसी के टीपीएम से संबंधित एंडोर्समेंट कीज़ का एक डेटाबेस रख सकता है, या एक डेटा सेंटर फैब्रिक कंट्रोलर के पास सभी ब्लेड में टीपीएम का डेटाबेस हो सकता है। विंडोज पर आप ईके के सार्वजनिक भाग को पढ़ने के लिए "विंडोज 8 में प्लेटफॉर्म क्रिप्टो प्रदाता" में वर्णित एनसीक्रिप्ट प्रदाता का उपयोग कर सकते हैं।

टीपीएम के अंदर कहीं एक आरएसए निजी कुंजी है। उस कुंजी को वहां बंद कर दिया जाता है - कभी भी बाहरी दुनिया द्वारा नहीं देखा जाना चाहिए। मैं चाहता हूं कि टीपीएम कुछ निजी कुंजी के साथ हस्ताक्षर करे (यानी इसे निजी कुंजी के साथ एन्क्रिप्ट करें)।

इसलिए मुझे सबसे बुनियादी ऑपरेशन चाहिए जो संभवतः मौजूद हो सकते हैं:

यहां छवि विवरण दर्ज करें

अपनी निजी कुंजी के साथ कुछ एन्क्रिप्ट करें। मैं भी (अभी तक) और अधिक जटिल सामान के लिए नहीं कह रहा हूँ:

  • "सीलिंग" यह पीसीआर राज्य पर आधारित है
  • एक कुंजी बना रहा है और इसे वाष्पशील या गैर-वाष्पशील मेम्ब्रो में संग्रहीत कर रहा है
  • एक सममित कुंजी बनाना और इसे टीपीएम में लोड करने की कोशिश करना

मैं सबसे बुनियादी ऑपरेशन के लिए कह रहा हूं जो एक टीपीएम कर सकता है। यह कैसे करना है, इसके बारे में कोई जानकारी प्राप्त करना असंभव है?

मुझे यादृच्छिक डेटा मिल सकता है

मुझे लगता है कि मैं glib जा रहा था जब मैंने कहा था कि RSA पर हस्ताक्षर करना सबसे बुनियादी बात है जो TPM कर सकता है। सबसे बुनियादी बात TPM करने के लिए कहा जा सकता है मुझे यादृच्छिक बाइट्स देना है। कि मुझे पता है कि कैसे करना है:

public Byte[] GetRandomBytesTPM(int desiredBytes)
{
   //The maximum random number size is limited to 4,096 bytes per call
   Byte[] result = new Byte[desiredBytes];

   BCRYPT_ALG_HANDLE hAlgorithm;

   BCryptOpenAlgorithmProvider(
         out hAlgorithm,
         BCRYPT_RNG_ALGORITHM, //AlgorithmID: "RNG"
         MS_PLATFORM_CRYPTO_PROVIDER, //Implementation: "Microsoft Platform Crypto Provider" i.e. the TPM
         0 //Flags
   );
   try
   {                
      BCryptGenRandom(hAlgorithm, @result[0], desiredBytes, 0);
   }
   finally
   {
      BCryptCloseAlgorithmProvider(hAlgorithm);
   }

   return result;
}

फैंसी थिंग

मुझे एहसास है कि टीपीएम का उपयोग करने वाले लोगों की मात्रा बहुत कम है। यही कारण है कि Stackoverflow पर कोई भी जवाब नहीं है। इसलिए मैं अपनी आम समस्या का समाधान पाने के लिए वास्तव में बहुत लालची नहीं हो सकता। लेकिन जिस चीज को मैं वास्तव में करना चाहता हूं वह है कुछ डेटा को "सील" करना:

यहां छवि विवरण दर्ज करें

  • टीपीएम कुछ डेटा प्रस्तुत करें (उदाहरण के लिए मुख्य सामग्री के 32 बाइट्स)
  • TPM डेटा को एन्क्रिप्ट करें, कुछ अपारदर्शी बूँद संरचना लौटाए
  • बाद में टीपीएम से बूँद को डिक्रिप्ट करने के लिए कहें
  • डिक्रिप्शन केवल तभी काम करेगा जब टीपीएम के पीसीआर रजिस्टर एन्क्रिप्शन के दौरान समान थे।

दूसरे शब्दों में:

Byte[] ProtectBytes_TPM(Byte[] plaintext, Boolean sealToPcr)
{
   //...
}

Byte[] UnprotectBytes_TPM(Byte[] protectedBlob)
{
   //...
}

क्रिप्टोग्राफी नेक्स्ट जनरल (Cng, उर्फ ​​BCrypt) टीपीएम का समर्थन करता है

विंडोज में मूल क्रिप्टोग्राफी एपीआई को क्रिप्टो एपीआई के रूप में जाना जाता था।

Windows Vista के साथ शुरू, क्रिप्टो एपीआई के साथ प्रतिस्थापित किया गया है क्रिप्टोग्राफी एपीआई: अगली पीढ़ी (आंतरिक रूप में जाना जाता BestCrypt , के रूप में संक्षिप्त BCrypt , साथ भ्रमित होने की नहीं पासवर्ड हैशिंग एल्गोरिथ्म )।

दो BCrypt प्रदाताओं के साथ विंडोज जहाज :

प्लेटफार्म क्रिप्टो प्रदाता MSDN पर दर्ज नहीं किया है, लेकिन 2012 में माइक्रोसॉफ्ट रिसर्च साइट से प्रलेखन है:

टीपीएम प्लेटफॉर्म क्रिप्टो-प्रदाता टूलकिट

टीपीएम प्लेटफ़ॉर्म क्रिप्टो प्रदाता और टूलकिट में विंडोज 8 में टीपीएम से संबंधित कार्यक्षमता का उपयोग करने के लिए नमूना कोड, उपयोगिताओं और प्रलेखन शामिल हैं। वर्णित सिस्टम में टीपीएम समर्थित क्रिप्टो-नेक्स्ट-जनरल (सीएनजी) प्लेटफॉर्म क्रिप्टो-प्रदाता और कैसे सत्यापन-सेवा प्रदाता शामिल हैं नई विंडोज सुविधाओं का उपयोग कर सकते हैं। दोनों TPM1.2 और TPM2.0-आधारित सिस्टम समर्थित हैं।

ऐसा लगता है कि माइक्रोसॉफ्ट का इरादा क्रिप्टोग्राफी एनजी एपीआई के माइक्रोसॉफ्ट प्लेटफॉर्म क्रिप्टो प्रदाता के साथ टीपीएम क्रिप्टो कार्यक्षमता को सतह पर लाना है।

Microsoft BCrypt का उपयोग कर सार्वजनिक कुंजी एन्क्रिप्शन

मान लीजिये:

आगे का तरीका यह हो सकता है कि Microsoft क्रिप्टोग्राफी नेक्स्ट जेन एपीआई का उपयोग करके डिजिटल हस्ताक्षर कैसे करें ।

मेरा अगला कदम मानक प्रदाता ( MS_PRIMITIVE_PROVIDER) का उपयोग करते हुए आरएसए सार्वजनिक कुंजी के साथ बीसीक्रिप्ट में एन्क्रिप्शन करने के लिए कोड के साथ आना होगा । उदाहरण के लिए:

  • modulus: 0xDC 67 FA F4 9E F2 72 1D 45 2C B4 80 79 06 A0 94 27 50 8209 DD 67 CE 57 B8 6C 4A 40F 4F 40 9F D2 69 FB 995D 85 0,0 07 A1 F9 47 1B 56 16 6E F6 7F B9 CF 2A 58 36 37 99 29 AA 4F A8 12 E8 4F C7 82 2B 9D 72 2A 9C DE 6F C2 EE 12 6D CF F0 F2 B8 C4 DD 7C 5C 1A C8 17 51 9 9 9 ACF DF 22 22 04D D7 F9 4B 09B 9 DE 9A EB 5C 51 1A D8 F8 F9 56 9E F8 FB 37 9B 3F D3 74 65 24 0D FF 34 75 57 A4 F5 BF 55
  • publicExponent: 65537

उस कोड के कामकाज के साथ, मैं टीपीएम प्रदाता ( MS_PLATFORM_CRYPTO_PROVIDER) का उपयोग करने में सक्षम हो सकता हूं ।

2/22/2016: और Apple के साथ उपयोगकर्ता डेटा को डिक्रिप्ट करने में मदद करने के लिए मजबूर किया जा रहा है, टीपीएम को सबसे सरल कार्य करने के लिए कैसे बनाया गया है, इसके लिए नए सिरे से रुचि है कि इसके लिए आविष्कार किया गया था - कुछ एन्क्रिप्ट करना।

यह लगभग एक कार के मालिक के बराबर है, लेकिन किसी को नहीं पता है कि एक को कैसे शुरू किया जाए। यह वास्तव में उपयोगी और शांत चीजें कर सकता है, अगर केवल हम पिछले चरण 1 प्राप्त कर सकते हैं ।

बोनस पढ़ना


बाध्यकारी (एन्क्रिप्शन) के लिए कोई स्पष्ट कार्य उपलब्ध नहीं है और इसकी आवश्यकता भी नहीं है। आप बस TPM में एक बाइंडिंग कुंजी बनाते हैं और सिस्टम rsa एन्क्रिप्शन फ़ंक्शन ("RSA / ECB / OAEPWithSHA1AndMGF1Padding") के साथ एक सममित एन्क्रिप्शन कुंजी sek को एन्क्रिप्ट करने के लिए अपने सार्वजनिक भाग का उपयोग करते हैं और इसे सही संरचना में सहेजते हैं ("TcTssConstants.TSS_ENCDATA_BIND")। सीक को अनबाइंडिंग (डिक्रिप्ट करना) के लिए आप बस TPMs अनबाइंड फ़ंक्शन का उपयोग करें और जो भी सिमिट्रिक एन्क्रिप्शन फ़ंक्शन आपको पसंद है, उसमें सेक का उपयोग करें। मेरे पास इसके लिए एक पुराना कोड आधार है जो मैंने कुछ समय पहले किया था, शायद यह मदद करता है: goo.gl/jV1Ouw
स्पष्ट करें

विकिपीडिया से, बाइंडिंग - टीपीएम बाइंड कुंजी का उपयोग करके डेटा को एन्क्रिप्ट करता है, एक स्टोरेज कुंजी से एक अद्वितीय आरएसए कुंजी उतरता है। en.wikipedia.org/wiki/Trusted_Platform_Module इस जोड़ी की तरह लगता है (TSpi_Data_Bind / TPM_UnBind) आपकी आवश्यकताओं के लिए पर्याप्त होना चाहिए ...
एलेक्स Mazzariya

1
मुझे नहीं लगता कि आपको सीधे टीपीएम का उपयोग करना होगा। यह मानक CNG / NCryptXXX API और "Microsoft प्लेटफ़ॉर्म क्रिप्टो प्रदाता" (हाल ही में विंडोज़ OS प्लेटफ़ॉर्म के लिए, और यदि हार्डवेयर ठीक है और निश्चित रूप से सक्षम है) के माध्यम से समर्थित है। हो सकता है कि तुम यहाँ "TPM मंच क्रिप्टो-प्रदाता टूलकिट पर एक नज़र हो सकता है: research.microsoft.com/en-us/downloads/... : भी इस जाँच tiw2013.cse.psu.edu/slides/...
साइमन Mourier

CryptProtectData टीपीएम का उपयोग जरूरी नहीं करता है। दूसरी ओर, यदि आप टीपीएम के लिए वैध सीएनजी या सीएसपी हैंडल प्राप्त कर सकते हैं, तो आप इसे क्रिप्टो कार्यों में उपयोग कर सकते हैं।
माइकल चाउरडकिस

1
@ b3nj1 नहीं मैं नहीं था; कोई भी प्रश्न का उत्तर देने में सक्षम नहीं था।
इयान बॉयड

जवाबों:


7

भजन की पुस्तक

टीपीएम 1.2 के बारे में सभी इस प्रकार है। ध्यान रखें कि Microsoft को भविष्य के सभी विंडोज संस्करणों के लिए TPM 2.0 की आवश्यकता है। 2.0 पीढ़ी मौलिक रूप से 1.2 से भिन्न है

टीपीएम डिजाइन सिद्धांतों के कारण कोई एक-लाइन समाधान नहीं है। टीपीएम को सीमित संसाधनों के साथ एक माइक्रोकंट्रोलर के रूप में सोचें। यह मुख्य डिजाइन लक्ष्य सस्ता होना था, जबकि अभी भी सुरक्षित है। इसलिए टीपीएम को सभी तर्क से अलग कर दिया गया था जो कि सुरक्षित संचालन के लिए आवश्यक नहीं था। इस प्रकार एक टीपीएम केवल तब काम कर रहा है जब आपके पास कम से कम कुछ अधिक या कम वसा वाले सॉफ़्टवेयर हों, सही क्रम में बहुत सारी कमांड जारी करें। और आज्ञाओं के अनुक्रम बहुत जटिल हो सकते हैं। यही कारण है कि टीसीजी ने टीएसएस को एक अच्छी तरह से परिभाषित एपीआई के साथ निर्दिष्ट किया। यदि आप जावा रास्ते पर जाना चाहते हैं, तो यहां तक ​​कि एक उच्च स्तरीय जावा एपीआई भी है । मुझे C # / .net के लिए एक समान परियोजना के बारे में पता नहीं है

विकास

आपके मामले में मेरा सुझाव है कि आप आईबीएम के सॉफ्टवेयर टीपीएम को देखें।

पैकेज में आपको 3 बहुत उपयोगी घटक मिलेंगे:

  • एक सॉफ्टवेयर TPM एमुलेटर
  • एक हल्के tpm लिब
  • कुछ बुनियादी कमांड लाइन उपयोगिताओं

आपको सॉफ्टवेयर TPM एमुलेटर की आवश्यकता नहीं है, आप मशीन के HW TPM से भी जुड़ सकते हैं। हालांकि, आप जारी किए गए आदेशों को रोक सकते हैं और प्रतिक्रियाओं को देख सकते हैं, इस प्रकार सीख सकते हैं कि उन्हें कैसे इकट्ठा किया जाता है और वे कमांड विनिर्देश के अनुरूप कैसे हैं।

ऊँचा स्तर

आवश्यक शर्तें:

  1. टीपीएम सक्रिय है
  2. TPM ड्राइवर लोड किया गया है
  3. आपने TPM का स्वामित्व ले लिया है

बूँद को सील करने के लिए, आपको निम्नलिखित कार्य करने होंगे:

  1. एक कुंजी बनाएँ
  2. की-ब्लॉब को कहीं स्टोर करें
  3. सुनिश्चित करें कि कुंजी TPM में भरी हुई है
  4. बूँद को सील करना

आपको यह बताने की आवश्यकता नहीं है:

  1. कुंजी-बूँद प्राप्त करें
  2. TPM की कुंजी लोड करें
  3. सील बूँद को सुलझाना

आप संरक्षित बाइट्स को संग्रहीत करने के लिए अपने डेटा संरचना में की-ब्लॉब को स्टोर कर सकते हैं।

टीपीएम कमांड के अधिकांश भाग आपको अधिकृत हैं। इसलिए आपको आवश्यकता होने पर प्राधिकरण सत्र स्थापित करने की आवश्यकता है। AFAIR उन ज्यादातर OSAP सत्र हैं।

टीपीएम कमांड

वर्तमान में मैं डिबग संस्करण नहीं चला सकता, इसलिए मैं आपको सटीक अनुक्रम प्रदान नहीं कर सकता। इस पर विचार करें कि आपके द्वारा उपयोग की जाने वाली कमांड की एक अनियंत्रित सूची:

  • TPM_OSAP
  • TPM_CreateWrapKey
  • TPM_LoadKey2
  • TPM_Seal

यदि आप वर्तमान पीसीआर मूल्यों को पढ़ना चाहते हैं, तो:

  • TPM_PCRRead

टीपीएम का उपयोग करने के लिए Microsoft के पास उनका C # .NET प्रबंधित पुस्तकालय है । उनके पास एक टीपीएम एमुलेटर भी है , जो कि प्रबंधित लाइब्रेरी डिबगिंग विकल्प के रूप में जुड़ सकता है यदि वास्तविक टीपीएम मौजूद नहीं है। उनके पास टीपीएम प्लेटफॉर्म प्रोवाइडर टूलकिट भी है , जिसमें टीपीएम का उपयोग करने के लिए प्रलेखन और नमूना कोड है। अब अगर केवल कोई ही यह पता लगा सकता है कि बाइट को एन्क्रिप्ट करने के लिए टीपीएम का उपयोग कैसे किया जाए।
इयान बॉयड

आपके पहले दो लिंक केवल TPM 2.0 हैं। यदि आप इन का उपयोग करना चाहते हैं, तो मुझे डर है कि मैं कोई मदद नहीं कर रहा हूँ।
स्कोलिटस

4

विश्वसनीय और एन्क्रिप्टेड कुंजी

विश्वसनीय और एन्क्रिप्ट की गई कुंजी मौजूदा कर्नेल कुंजी रिंग सेवा में जोड़े गए दो नए कुंजी प्रकार हैं। ये दोनों नए प्रकार परिवर्तनीय लंबाई सममितीय कुंजियाँ हैं, और दोनों ही मामलों में सभी कुंजियाँ कर्नेल में बनाई जाती हैं, और उपयोगकर्ता स्थान देखता है, स्टोर करता है, और केवल एन्क्रिप्टेड ब्लब्स को लोड करता है। विश्वसनीय कुंजी को अधिक सुरक्षा के लिए एक विश्वसनीय प्लेटफ़ॉर्म मॉड्यूल (TPM) चिप की उपलब्धता की आवश्यकता होती है, जबकि एन्क्रिप्ट किए गए कुंजी किसी भी सिस्टम पर उपयोग किए जा सकते हैं। सभी उपयोगकर्ता स्तर बूँदें, प्रदर्शित किए जाते हैं और सुविधा के लिए हेक्स एससीआई में लोड होते हैं, और अखंडता सत्यापित होते हैं।

विश्वसनीय कुंजी उत्पन्न करने और कुंजियों को सील करने के लिए टीपीएम दोनों का उपयोग करती है। टीपीएम में 2048 बिट आरएसए कुंजी के तहत कुंजी को सील किया जाता है, और वैकल्पिक रूप से निर्दिष्ट पीसीआर (अखंडता माप) मानों को सील किया जाता है, और केवल टीपीआर द्वारा अनसाल्व किया जाता है, अगर पीसीआर और बूँद अखंडता सत्यापन मेल खाते हैं। एक भरी हुई विश्वसनीय कुंजी को नए (भविष्य) पीसीआर मूल्यों के साथ अपडेट किया जा सकता है, इसलिए कुंजी को आसानी से नए पीसीआर मानों में माइग्रेट किया जाता है, जैसे कि कर्नेल और इनट्राम्राम्स को अपडेट किया जाता है। एक ही कुंजी में विभिन्न पीसीआर मूल्यों के तहत कई सहेजे गए ब्लब्स हो सकते हैं, इसलिए कई बूट आसानी से समर्थित हैं।

डिफ़ॉल्ट रूप से, विश्वसनीय कुंजियों को SRK के तहत सील किया जाता है, जिसमें डिफ़ॉल्ट प्राधिकरण मूल्य (20 शून्य) होता है। यह पतलून की उपयोगिता के साथ टेकओवरशिप समय पर सेट किया जा सकता है tpm_takeownership -u -z:।

Usage:
    keyctl add trusted name "new keylen [options]" ring
    keyctl add trusted name "load hex_blob [pcrlock=pcrnum]" ring
    keyctl update key "update [options]"
    keyctl print keyid

    options:
    keyhandle= ascii hex value of sealing key default 0x40000000 (SRK)
    keyauth=   ascii hex auth for sealing key default 0x00...i
        (40 ascii zeros)
    blobauth=  ascii hex auth for sealed data default 0x00...
        (40 ascii zeros)
    blobauth=  ascii hex auth for sealed data default 0x00...
        (40 ascii zeros)
    pcrinfo=   ascii hex of PCR_INFO or PCR_INFO_LONG (no default)
    pcrlock=   pcr number to be extended to "lock" blob
    migratable= 0|1 indicating permission to reseal to new PCR values,
                default 1 (resealing allowed)

keyctl printसीलबंद कुंजी की एससी हेक्स कॉपी लौटाता है, जो मानक TPM_STORED_DATA प्रारूप में है। नई कुंजियों की कुंजी लंबाई हमेशा बाइट्स में होती है। ट्रस्टेड कीज़ 32 - 128 बाइट्स (256 - 1024 बिट्स) हो सकती हैं, ऊपरी सीमा 2048 बिट एसआरके (आरएसए) कीलेंथ के भीतर फिट करने के लिए है, सभी आवश्यक संरचना / पैडिंग के साथ।

एन्क्रिप्ट की गई कुंजी टीपीएम पर निर्भर नहीं करती हैं, और तेज़ होती हैं, क्योंकि वे एन्क्रिप्शन / डिक्रिप्शन के लिए एईएस का उपयोग करती हैं। नई चाबियाँ कर्नेल जनरेट किए गए यादृच्छिक संख्याओं से बनाई गई हैं, और निर्दिष्ट 'मास्टर' कुंजी का उपयोग करके एन्क्रिप्ट / डिक्रिप्ट की गई हैं। 'मास्टर' कुंजी या तो विश्वसनीय-कुंजी या उपयोगकर्ता-कुंजी प्रकार हो सकती है। एन्क्रिप्ट की गई चाबियों का मुख्य नुकसान यह है कि यदि वे एक विश्वसनीय कुंजी में निहित नहीं हैं, तो वे केवल उतना ही सुरक्षित हैं जितना उपयोगकर्ता कुंजी उन्हें एन्क्रिप्ट करती है। इसलिए मुख्य रूप से बूट में अधिमानी तरीके से मास्टर यूजर की को सुरक्षित तरीके से लोड किया जाना चाहिए।

एन्क्रिप्टेड कुंजी के डिक्रिप्ट किए गए हिस्से में एक सरल सममित कुंजी या एक अधिक जटिल संरचना हो सकती है। अधिक जटिल संरचना का प्रारूप अनुप्रयोग विशिष्ट है, जिसे 'प्रारूप' द्वारा पहचाना जाता है।

Usage:
    keyctl add encrypted name "new [format] key-type:master-key-name keylen"
        ring
    keyctl add encrypted name "load hex_blob" ring
    keyctl update keyid "update key-type:master-key-name"

format:= 'default | ecryptfs'
key-type:= 'trusted' | 'user'

विश्वसनीय और एन्क्रिप्टेड कुंजी उपयोग के उदाहरण

32 बाइट्स की लंबाई के "किमीक" नामक एक विश्वसनीय कुंजी बनाएं और सहेजें:

$ keyctl add trusted kmk "new 32" @u
440502848

$ keyctl show
Session Keyring
       -3 --alswrv    500   500  keyring: _ses
 97833714 --alswrv    500    -1   \_ keyring: _uid.500
440502848 --alswrv    500   500       \_ trusted: kmk

$ keyctl print 440502848
0101000000000000000001005d01b7e3f4a6be5709930f3b70a743cbb42e0cc95e18e915
3f60da455bbf1144ad12e4f92b452f966929f6105fd29ca28e4d4d5a031d068478bacb0b
27351119f822911b0a11ba3d3498ba6a32e50dac7f32894dd890eb9ad578e4e292c83722
a52e56a097e6a68b3f56f7a52ece0cdccba1eb62cad7d817f6dc58898b3ac15f36026fec
d568bd4a706cb60bb37be6d8f1240661199d640b66fb0fe3b079f97f450b9ef9c22c6d5d
dd379f0facd1cd020281dfa3c70ba21a3fa6fc2471dc6d13ecf8298b946f65345faa5ef0
f1f8fff03ad0acb083725535636addb08d73dedb9832da198081e5deae84bfaf0409c22b
e4a8aea2b607ec96931e6f4d4fe563ba

$ keyctl pipe 440502848 > kmk.blob

सहेजे गए बूँद से एक विश्वसनीय कुंजी लोड करें:

$ keyctl add trusted kmk "load `cat kmk.blob`" @u
268728824

$ keyctl print 268728824
0101000000000000000001005d01b7e3f4a6be5709930f3b70a743cbb42e0cc95e18e915
3f60da455bbf1144ad12e4f92b452f966929f6105fd29ca28e4d4d5a031d068478bacb0b
27351119f822911b0a11ba3d3498ba6a32e50dac7f32894dd890eb9ad578e4e292c83722
a52e56a097e6a68b3f56f7a52ece0cdccba1eb62cad7d817f6dc58898b3ac15f36026fec
d568bd4a706cb60bb37be6d8f1240661199d640b66fb0fe3b079f97f450b9ef9c22c6d5d
dd379f0facd1cd020281dfa3c70ba21a3fa6fc2471dc6d13ecf8298b946f65345faa5ef0
f1f8fff03ad0acb083725535636addb08d73dedb9832da198081e5deae84bfaf0409c22b
e4a8aea2b607ec96931e6f4d4fe563ba

नए पीसीआर मूल्यों के तहत एक विश्वसनीय कुंजी का पता लगाएं:

$ keyctl update 268728824 "update pcrinfo=`cat pcr.blob`"
$ keyctl print 268728824
010100000000002c0002800093c35a09b70fff26e7a98ae786c641e678ec6ffb6b46d805
77c8a6377aed9d3219c6dfec4b23ffe3000001005d37d472ac8a44023fbb3d18583a4f73
d3a076c0858f6f1dcaa39ea0f119911ff03f5406df4f7f27f41da8d7194f45c9f4e00f2e
df449f266253aa3f52e55c53de147773e00f0f9aca86c64d94c95382265968c354c5eab4
9638c5ae99c89de1e0997242edfb0b501744e11ff9762dfd951cffd93227cc513384e7e6
e782c29435c7ec2edafaa2f4c1fe6e7a781b59549ff5296371b42133777dcc5b8b971610
94bc67ede19e43ddb9dc2baacad374a36feaf0314d700af0a65c164b7082401740e489c9
7ef6a24defe4846104209bf0c3eced7fa1a672ed5b125fc9d8cd88b476a658a4434644ef
df8ae9a178e9f83ba9f08d10fa47e4226b98b0702f06b3b8

विश्वसनीय कुंजियों का प्रारंभिक उपभोक्ता ईवीएम है, जो बूट समय पर फ़ाइल मेटाडेटा के एचएमएसी सुरक्षा के लिए एक उच्च गुणवत्ता वाली सममित कुंजी की आवश्यकता है। एक विश्वसनीय कुंजी का उपयोग मजबूत गारंटी प्रदान करता है कि ईवीएम कुंजी को उपयोगकर्ता स्तर की समस्या से समझौता नहीं किया गया है, और जब विशिष्ट बूट पीसीआर मूल्यों को सील किया जाता है, तो बूट और ऑफ़लाइन हमलों से बचाता है। उपरोक्त विश्वसनीय कुंजी "kmk" का उपयोग करके एक एन्क्रिप्टेड कुंजी "evm" बनाएं और सहेजें:

विकल्प 1: 'प्रारूप' को छोड़ देना

$ keyctl add encrypted evm "new trusted:kmk 32" @u
159771175

विकल्प 2: 'प्रारूप' को स्पष्ट रूप से 'डिफ़ॉल्ट' के रूप में परिभाषित करना

$ keyctl add encrypted evm "new default trusted:kmk 32" @u
159771175

$ keyctl print 159771175
default trusted:kmk 32 2375725ad57798846a9bbd240de8906f006e66c03af53b1b3
82dbbc55be2a44616e4959430436dc4f2a7a9659aa60bb4652aeb2120f149ed197c564e0
24717c64 5972dcb82ab2dde83376d82b2e3c09ffc

$ keyctl pipe 159771175 > evm.blob

सहेजे गए बूँद से एक एन्क्रिप्टेड कुंजी "evm" लोड करें:

$ keyctl add encrypted evm "load `cat evm.blob`" @u
831684262

$ keyctl print 831684262
default trusted:kmk 32 2375725ad57798846a9bbd240de8906f006e66c03af53b1b3
82dbbc55be2a44616e4959430436dc4f2a7a9659aa60bb4652aeb2120f149ed197c564e0
24717c64 5972dcb82ab2dde83376d82b2e3c09ffc

विश्वसनीय और एन्क्रिप्टेड कुंजी के लिए अन्य उपयोग, जैसे डिस्क और फ़ाइल एन्क्रिप्शन के लिए प्रत्याशित हैं। विशेष रूप से नए प्रारूप 'ecryptfs' को परिभाषित किया गया है ताकि eCryptfs फाइल सिस्टम को माउंट करने के लिए एन्क्रिप्टेड कुंजियों का उपयोग किया जा सके। उपयोग के बारे में अधिक विवरण 'डॉक्यूमेंटेशन / सिक्योरिटी / की-ई-क्रिप्टो.इंटरेक्स' फाइल में पाया जा सकता है।


क्या आपके पास कोई विचार है जब इन दो नए प्रकार की कुंजियों को जोड़ा गया था? किस संस्करण में मेरा मतलब है। मैं वर्तमान में 1.2 (कंपनी पैकेज) का उपयोग कर रहा हूं और जो इनका समर्थन नहीं करता है। शायद 1.5+ में?
अकापुल्को

1
इस पोस्टिंग का स्रोत क्या है? अंत एक दस्तावेज़ को संदर्भित करता हैDocumentation/security/keys-ecryptfs.tx
goodguys_activate

ये सभी कमांड लाइन प्रोग्राम के लिए कॉल लगते हैं। मुझे टीपीएम का उपयोग करने के तरीके पर कोई कोड नहीं दिखता है।
इयान बॉयड

3

मैं मशीन के टीपीएम मॉड्यूल का उपयोग करके बाइट्स को कैसे एन्क्रिप्ट कर सकता हूं?

आपके इरादे और परिस्थितियों पर निर्भर करता है:

  • आपके (1-परिवार या 2-परिवार) में किस तरह का टीपीएम है?
  • टीपीएम किस राज्य में है? क्या इसका स्वामित्व था? क्या इसका प्रावधान किया गया है?
  • आपकी प्रोग्रामिंग भाषा क्या है?
  • क्या आप एन्क्रिप्ट या साइन इन करना चाहते हैं? (यह शेष प्रश्न से अस्पष्ट है)
  • वह डेटा कितना बड़ा है जिसे आप एन्क्रिप्ट करना चाहते हैं?
  • क्या आप एक सममित कुंजी या एक असममित कुंजी का उपयोग करना चाहते हैं?
  • क्या आप उस कुंजी का उपयोग करना चाहते हैं जो पहले से ही टीपीएम पर मौजूद है, या क्या आप इसे पहले बनाना चाहते हैं?
  • "एन्क्रिप्ट" करके क्या आप शायद "एक चाबी लपेट" का मतलब है?
  • क्या आप सिस्टम कॉन्फ़िगरेशन के लिए एन्क्रिप्टेड डेटा को लॉक करना चाहते हैं, ताकि यह केवल डिक्रिप्ट किया जा सके जब सिस्टम उसी कॉन्फ़िगरेशन में वापस आ जाए?
  • क्या आप डिक्रिप्टिंग के लिए प्राधिकरण की आवश्यकता चाहते हैं?
  • शायद आपको बिल्कुल भी एन्क्रिप्ट करने की ज़रूरत नहीं है, बल्कि टीपीएम के भीतर डेटा स्टोर करें?
  • यदि आप टीपीएम के भीतर डेटा स्टोर कर रहे हैं, तो क्या आप रिट्रीवल के लिए किसी विशेष कॉन्फ़िगरेशन में प्राधिकरण या सिस्टम की आवश्यकता चाहते हैं?

इनमें से प्रत्येक उपयोग के मामले (और वहाँ अधिक हैं) - या इसके संयोजन - एक अलग कार्यान्वयन पथ प्रस्तुत करता है। क्रिप्टोग्राफिक उपकरणों के स्विस सेना चाकू के रूप में टीपीएम के बारे में सोचो: ऐसा बहुत कुछ नहीं है जो आप इसके साथ नहीं कर सकते हैं, लेकिन उपयोग में आसानी उस बहुमुखी प्रतिभा के लिए ग्रस्त है। प्रश्न सिस्टम कॉन्फ़िगरेशन के लिए एन्क्रिप्ट, हस्ताक्षर और लॉकिंग के बीच उछलता रहता है, लेकिन इस उत्तर का मुख्य भाग प्रश्न में वर्णित अधिकांश आवश्यकताओं को कवर करने के लिए सील कमांड पर विचार करेगा।

अब इस एक कदम को आगे बढ़ाने का समय आ गया है। मैं कुछ डेटा (जैसे एक हार्ड ड्राइव एन्क्रिप्शन मास्टर कुंजी) को एन्क्रिप्ट करना चाहता हूं जिसे केवल स्थानीय टीपीएम द्वारा डिक्रिप्ट किया जा सकता है।

यह वही है जो बिंद कमांड के लिए है (TPM 2 के लिए कमांड बनाएँ)। आप एक कुंजी लोड करते हैं जो टीपीएम-बाउंड कुंजी से निकलती है और इसके साथ एन्क्रिप्ट होती है (या सीधे हार्डवेयर-बाउंड कुंजी के साथ)। इस तरह डेटा को केवल उसी टीपीएम तक पहुंच के साथ डिक्रिप्ट किया जा सकता है।

दूसरे शब्दों में, मैं विंडोज में टीपीएम के साथ, एंड्रॉइड के लिए नीचे ब्लॉक आरेख में क्वालकॉम ट्रस्टेड एक्ज़ीक्यूशन एनवायरनमेंट (टीईई) को बदलना चाहता हूं:

निश्चित नहीं है कि इस पूरी प्रक्रिया की नकल करना एक अच्छा विचार है। एक के लिए, प्रक्रिया में कहीं भी एक हस्ताक्षर ऑपरेशन का उपयोग करने की आवश्यकता नहीं है। ऐसा प्रतीत होता है कि, जिस समय एंड्रॉइड 5 विकसित किया जा रहा था, उस समय कीस्टॉर एपीआई हस्ताक्षर और सत्यापन कार्यों तक सीमित था । मेरा सबसे अच्छा अनुमान है कि डिस्क एन्क्रिप्शन टीम ने उनके साथ काम करने के लिए अपनी पूरी कोशिश की थी और एक एल्गोरिथ्म तैयार किया था, जिसमें एक मध्यवर्ती कुंजी एक हस्ताक्षरित ऑपरेशन के साथ ली गई थी , एक संग्रहीत टीईई कुंजी का उपयोग करके, जिससे पूरी प्रक्रिया एक हार्डवेयर से जुड़ी हुई थी- बाध्य कुंजी केवल प्लेटफ़ॉर्म पर उपलब्ध है - जैसा कि हस्ताक्षर उस समय करने का एकमात्र तरीका था। हालांकि, ऐसे तरीकों से खुद को विवश करने की आवश्यकता नहीं है यदि आपके पास टीपीएम तक पहुंच है, जो आपको जरूरत से ज्यादा क्षमता प्रदान करता है!

मुझे लगता है कि TPM डेटा-हस्ताक्षर नहीं करता है

यह झूठा है, टीपीएम के दोनों संस्करण हस्ताक्षर करने का समर्थन करते हैं।

(या यदि ऐसा होता है, तो यह गारंटी नहीं देता है कि हर बार एक ही डेटा पर हस्ताक्षर करना एक ही बाइनरी आउटपुट देगा)

इसका कोई अर्थ नहीं निकलता। एक ही कुंजी के साथ एक ही डेटा पर हस्ताक्षर करना एक ही हस्ताक्षर का उत्पादन करेगा । आप उद्धृत ऑपरेशन के साथ हस्ताक्षर संचालन को भ्रमित कर रहे होंगे, जो एक गैर में मिल जाएगा।

यही कारण है कि मैं "RSA साइनिंग" को "हार्डवेयर बाउंड की के साथ 256-बिट बूँद को एन्क्रिप्ट करने" के साथ बदलने के लिए तैयार हूं।

यह वास्तव में पसंदीदा विकल्प होना चाहिए, हालांकि दोनों टीपीएम के साथ संभव हैं। ऊपर देखो।

समस्या यह है कि टीपीएम प्रोग्रामिंग MSDN पर पूरी तरह से अनिर्दिष्ट है। कोई भी ऑपरेशन करने के लिए कोई एपीआई उपलब्ध नहीं है।

दुर्भाग्य से दस्तावेज़ के लिए बहुत कुछ नहीं है। विन एपीआई टीबीएस कार्यों के एक जोड़े तक सीमित है जो ड्राइवर से एक स्तर हटा दिए जाते हैं।

इसके बजाय आपको अपने आप को विश्वसनीय कम्प्यूटिंग ग्रुप के सॉफ्टवेयर स्टैक (उर्फ टीएसएस) की एक प्रति ढूंढनी होगी, यह पता लगाना होगा कि किस क्रम में टीपीएम को भेजना है, पेलोड के साथ, किस क्रम में, और सीधे आदेश भेजने के लिए विंडो के Tbsip_Subb_Command फ़ंक्शन को कॉल करें:

वास्तव में, नहीं, यदि आपके पास एक TSS था तो आपको उपयोग नहीं करना होगा Tbsip_submit_Command()। यह TSS होने की पूरी बात है - निम्न-स्तर के विवरण सारगर्भित हैं।

Windows के पास क्रिया करने के लिए कोई उच्च स्तरीय API नहीं है।

TPM 1 के लिए अभी भी सही है, लेकिन TPM 2 के लिए TSS.MSR है

यह SATA I / O आदेशों को आपकी हार्ड ड्राइव पर जारी करके एक पाठ फ़ाइल बनाने की कोशिश करने के नैतिक समकक्ष है।

सही बात।

सिर्फ ट्राउजर का उपयोग क्यों नहीं किया जाता है ... उस कोड के साथ समस्या यह है कि यह विंडोज की दुनिया में पोर्टेबल नहीं है। उदाहरण के लिए, आप इसे डेल्फी से उपयोग नहीं कर सकते, आप इसे C # से उपयोग नहीं कर सकते। इसके लिए आवश्यक है: OpenSSL, pThread

यह स्पष्ट नहीं है कि यह एक बड़ी चुनौती है। एक इंटरोप के माध्यम से ट्राउजर तक पहुंच सभी डेटा स्ट्रक्चरिंग कोड को फिर से लिखना बेहतर होना चाहिए। साथ ही, doTSSप्रश्न लिखने के समय भी था ।

TPM का उपयोग कर डेटा एन्क्रिप्ट करने के लिए समान कोड क्या है? इसमें संभवतः TPM_seal कमांड शामिल है। हालांकि मुझे लगता है कि मैं डेटा को सील नहीं करना चाहता, मुझे लगता है कि मैं इसे बांधना चाहता हूं:

प्रश्न में दो आदेशों के बीच अंतर का वर्णन करने वाला एक उद्धरण है, इसलिए बहुत भ्रम नहीं होना चाहिए। सील बंधन के समान है, अतिरिक्त बाधा के साथ कि सिस्टम राज्य डेटा के अनसाल्टेड होने के लिए समान होना चाहिए।

उसी तरह मैं प्रदान करने में सक्षम था:

Byte[] ProtectBytes_Crypt(Byte[] plaintext)
{
   //...
   CryptProtectData(...); 
   //...
}

क्या कोई इसके समकक्ष प्रदान कर सकता है:

Byte[] ProtectBytes_TPM(Byte[] plaintext)
{
   //...
   Tbsip_Submit_Command(...);
   Tbsip_Submit_Command(...);
   Tbsip_Submit_Command(...);
   //...snip...
   Tbsip_Submit_Command(...);
   //...
}

यह वही काम करता है, सिवाय सिस्टम एलएसए में बंद एक कुंजी के, टीपीएम में दूर बंद है?

सबसे पहले, यह इंगित करने योग्य है कि टीपीएम के दो प्रमुख संस्करण हैं, जो एक दूसरे के बीच पूरी तरह से असंगत हैं। तो वस्तुतः कोई भी कोड जो आपने टीपीएम 1 के लिए लिखा होगा, टीपीएम 2 के लिए काम करेगा। टीबीएस एपीआई दोनों के बीच एकमात्र सामान्य कोड है और माइक्रोसॉफ्ट के लिए निष्पक्ष होना, यह उन कारणों में से एक हो सकता है कि एपीआई कभी नहीं बढ़ा। उत्तर का मुख्य भाग दो कारणों से TPM 1 के लिए कोड प्रस्तुत करेगा:

  • टीपीएम 1 विशिष्ट अवधारणाओं के साथ सवाल भरा हुआ है, इसलिए टीपीएम 1 का उपयोग करने वाले लोगों को उनके लिए खोज करने के लिए यहां उतरने की अधिक संभावना है
  • TPM 2 के लिए TSS का Microsoft कार्यान्वयन है।

दूसरा, आइए प्रश्न को अधिक विशिष्ट बनाते हैं। मैं इसे इस प्रकार पुन: व्याख्या कर रहा हूं:

How do I write code in C#, using only the TBS API, to interface with
an already owned and provisioned TPM to, without user interaction,
encrypt no more than 128 bytes of arbitrary data with an asymmetric
key already resident in the TPM and bound to it, but not protected
with a password, so that in order to decrypt the data the system may
need to be in the same state it was in at encryption time based on an
easily configurable variable?

सील कमांड इसके लिए सबसे उपयुक्त है, क्योंकि यह बिंद कमांड के समान कार्य करता है जब पीसीआर का चयन आकार शून्य पर सेट होता है, लेकिन पीसीआर चयन को आसानी से किसी भी पीसीआर को शामिल करने के लिए बदला जा सकता है जो आप चाहें। यह एक आश्चर्यचकित करता है कि क्यों बिंद कमांड को कल्पना में शामिल किया गया था, और जैसा कि उल्लेख किया गया था कि इसे टीपीएम 2 कल्पना में हटा दिया गया था और दोनों को एक क्रिएट कमांड में जोड़ा गया था।

यहां केवल TBS फ़ंक्शन के साथ डेटा एन्क्रिप्ट करने के लिए TPM 1.2 सील कमांड का उपयोग करने के लिए C # कोड है (ध्यान दें: यह कोड अप्रयुक्त है और डिबगिंग के बिना काम करने की संभावना नहीं है) :

[DllImport ("tbs.dll")]
unsafe static extern UInt32 Tbsi_Context_Create (UInt32 * version, IntPtr * hContext);

[DllImport ("tbs.dll")]
unsafe static extern UInt32 Tbsip_Context_Close (IntPtr hContext);

[DllImport ("tbs.dll")]
unsafe static extern UInt32 Tbsip_Submit_Command (
    IntPtr hContext, UInt32 Locality, 
    UInt32 Priority, 
    byte * pCommandBuf, 
    UInt32 CommandBufLen, 
    byte * pResultBuf, 
    UInt32 * pResultBufLen);

byte[] ProtectBytes_TPM (byte[] plaintext) {

    void AddUInt32Reversed (byte[] a, System.UInt32 o, ref int i) {
        byte[] bytes = System.BitConverter.GetBytes (o);
        Array.Reverse (bytes);
        Array.Copy (bytes, 0, a, i, bytes.Length);
        i += bytes.Length;
    }
    void AddUInt16Reversed (byte[] a, System.UInt16 o, ref int i) {
        byte[] bytes = System.BitConverter.GetBytes (o);
        Array.Reverse (bytes);
        Array.Copy (bytes, 0, a, i, bytes.Length);
        i += bytes.Length;
    }
    void AddBool (byte[] a, byte b, ref int i) {
        a[i] = b;
        i += 1;
    }
    void AddBlob (byte[] a, byte[] b, ref int i) {
        Array.Copy (b, 0, a, i, b.Length);
        i += b.Length;
    }
    byte[] Xor (byte[] text, byte[] key) {
        byte[] xor = new byte[text.Length];
        for (int i = 0; i < text.Length; i++) {
            xor[i] = (byte) (text[i] ^ key[i % key.Length]);
        }
        return xor;
    }

    int offset;

    Random rnd = new Random ();

    IntPtr hContext = IntPtr.Zero;
    unsafe {
        UInt32 version = 1;
        IntPtr handle = hContext;
        UInt32 result = Tbsi_Context_Create ( & version, & handle);

        if (result == 0) {
            hContext = handle;
        }
    }

    byte[] cmdBuf = new byte[768];

    //OSAP
    System.UInt32 outSize;

    byte[] oddOsap = new byte[20];
    byte[] evenOsap = new byte[20];
    byte[] nonceEven = new byte[20];
    byte[] nonceOdd = new byte[20];
    System.UInt32 hAuth = 0;

    offset = 0;
    AddUInt16Reversed (cmdBuf, 0x00C1, ref offset);
    offset = 6;
    AddUInt32Reversed (cmdBuf, 0x0000000B, ref offset);

    offset = 2 + 4 + 4; //2 for tag, 4 for size and 4 for command code

    AddUInt16Reversed (cmdBuf, 0x0004, ref offset); //Entity Type SRK = 0x0004
    AddUInt32Reversed (cmdBuf, 0x40000000, ref offset); //Entity Value SRK = 0x40000000
    rnd.NextBytes (oddOsap);
    AddBlob (cmdBuf, oddOsap, ref offset);
    uint cmdSize = (System.UInt32) offset;
    offset = 2;
    AddUInt32Reversed (cmdBuf, cmdSize, ref offset);

    outSize = (System.UInt32) (Marshal.SizeOf (hAuth) + nonceEven.Length + evenOsap.Length);

    byte[] response = new byte[outSize];
    unsafe {
        UInt32 result = 0;

        //uint cmdSize = (uint)offset;
        uint resSize = outSize;
        fixed (byte * pCmd = cmdBuf, pRes = response) {
            result = Tbsip_Submit_Command (hContext, 0, 200, pCmd, cmdSize, pRes, & resSize);
        }
    }

    byte contSession = 0;
    System.UInt32 hKey = 0x40000000; //TPM_KH_SRK;
    System.UInt32 pcrInfoSize = 0;
    byte[] srkAuthdata = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    uint inDataSize = (uint) plaintext.Length;

    offset = 2 + 4 + 4; //2 for tag, 4 for size and 4 for return code
    byte[] hauthbytes = new byte[Marshal.SizeOf (hAuth)];
    Array.Copy (response, offset, hauthbytes, 0, hauthbytes.Length);
    Array.Reverse (hauthbytes);
    hAuth = System.BitConverter.ToUInt32 (hauthbytes, 0);
    offset += Marshal.SizeOf (hAuth);
    Array.Copy (response, offset, nonceEven, 0, nonceEven.Length);
    offset += nonceEven.Length;
    Array.Copy (response, offset, evenOsap, 0, evenOsap.Length);

    //shared-secret = HMAC(srk_auth, even_osap || odd_osap)
    byte[] sharedSecretBuf = new byte[evenOsap.Length + oddOsap.Length];
    Array.Copy (evenOsap, 0, sharedSecretBuf, 0, evenOsap.Length);
    Array.Copy (oddOsap, 0, sharedSecretBuf, evenOsap.Length, oddOsap.Length);
    System.Security.Cryptography.HMACSHA1 sharedSecretHmac = new System.Security.Cryptography.HMACSHA1 (srkAuthdata);
    byte[] sharedSecret = sharedSecretHmac.ComputeHash (sharedSecretBuf);

    byte[] authSha1InBuf = new byte[sharedSecret.Length + nonceEven.Length];
    Array.Copy (sharedSecret, 0, authSha1InBuf, 0, sharedSecret.Length);
    Array.Copy (nonceEven, 0, authSha1InBuf, sharedSecret.Length, nonceEven.Length);
    System.Security.Cryptography.SHA1Managed sha1 = new System.Security.Cryptography.SHA1Managed ();
    byte[] authSha1 = sha1.ComputeHash (authSha1InBuf);
    byte[] encAuth = Xor (srkAuthdata, authSha1);

    //inParamDigest = sha1(1S ~ 6S) 
    int paramInDigestInBufSize =
        sizeof (System.UInt32) + 
        encAuth.Length +
        Marshal.SizeOf (pcrInfoSize) +
        Marshal.SizeOf (inDataSize) +
        (int) inDataSize;
    byte[] paramInDigestInBuf = new byte[paramInDigestInBufSize];
    offset = 0;
    AddUInt32Reversed (paramInDigestInBuf, 0x00000017, ref offset);
    AddBlob (paramInDigestInBuf, encAuth, ref offset);
    AddUInt32Reversed (paramInDigestInBuf, 0x0, ref offset); //PCR info size
    AddUInt32Reversed (paramInDigestInBuf, inDataSize, ref offset);
    AddBlob (paramInDigestInBuf, plaintext, ref offset);

    byte[] paramInDigest = sha1.ComputeHash (paramInDigestInBuf);

    int pubAuthInBufSize = paramInDigest.Length + nonceEven.Length + nonceOdd.Length + Marshal.SizeOf (contSession);
    byte[] pubAuthInBuf = new byte[pubAuthInBufSize];

    offset = 0;
    AddBlob (pubAuthInBuf, paramInDigest, ref offset);
    AddBlob (pubAuthInBuf, nonceEven, ref offset);
    AddBlob (pubAuthInBuf, nonceOdd, ref offset);
    AddBool (pubAuthInBuf, contSession, ref offset);
    System.Security.Cryptography.HMACSHA1 pubAuthHmac = new System.Security.Cryptography.HMACSHA1 (sharedSecret);
    byte[] pubAuth = pubAuthHmac.ComputeHash (pubAuthInBuf);

    //Seal
    offset = 0;
    AddUInt16Reversed (cmdBuf, 0x00C2, ref offset); // TPM_TAG_RQU_AUTH1_COMMAND;
    offset = 6;
    AddUInt32Reversed (cmdBuf, 0x00000017, ref offset); // TPM_ORD_SEAL;
    offset = 2 + 4 + 4; //2 for tag, 4 for size and 4 for command code

    AddUInt32Reversed (cmdBuf, hKey, ref offset);
    AddBlob (cmdBuf, encAuth, ref offset);
    AddUInt32Reversed (cmdBuf, pcrInfoSize, ref offset);
    AddUInt32Reversed (cmdBuf, inDataSize, ref offset);
    AddBlob (cmdBuf, plaintext, ref offset);

    AddUInt32Reversed (cmdBuf, hAuth, ref offset);
    AddBlob (cmdBuf, nonceOdd, ref offset);
    AddBool (cmdBuf, contSession, ref offset);
    AddBlob (cmdBuf, pubAuth, ref offset);
    cmdSize = (System.UInt32) offset;
    offset = 2;
    AddUInt32Reversed (cmdBuf, cmdSize, ref offset);

    outSize = 768;
    uint responseSize = 0;

    response = new byte[outSize];
    unsafe {
        UInt32 result = 0;

        uint resSize = outSize;
        fixed (byte * pCmd = cmdBuf, pRes = response) {
            result = Tbsip_Submit_Command (hContext, 0, 200, pCmd, cmdSize, pRes, & resSize);
        }
        responseSize = resSize;
    }

    byte[] retBuffer = new byte[responseSize - 10];
    Array.Copy (response, 10, retBuffer, 0, retBuffer.Length);
    Tbsip_Context_Close (hContext);
    return retBuffer;

}

कोड विश्लेषण:

[DllImport ("tbs.dll")]
...

ये Tbs.h में उपलब्ध कुछ कार्यों में से कुछ हैं और केवल वही जो हम यहाँ उपयोग करेंगे। वे मूल रूप से आपको डिवाइस को हैंडल खोलने और कच्चे बाइट्स भेजने और प्राप्त करने के साथ संवाद करने की अनुमति देते हैं।

    void AddUInt32Reversed (byte[] a, System.UInt32 o, ref int i) { ... }
    void AddUInt16Reversed (byte[] a, System.UInt16 o, ref int i) { ... }
    void AddBool (byte[] a, byte b, ref int i) { ... }
    void AddBlob (byte[] a, byte[] b, ref int i) { ... }

टीपीएम बड़ा एंडियन है, विंडोज थोड़ा एंडियन है। इसलिए जो भी डेटा हम भेज रहे हैं, उसके लिए बाइट ऑर्डर को उल्टा करना होगा। हमें केवल 32-बिट और 16-बिट अहस्ताक्षरित इनवर्टर को उलटने के बारे में चिंता करने की आवश्यकता है।

    ...
    UInt32 result = Tbsi_Context_Create ( & version, & handle);
    ...

यहां हम TPM से बात करने के लिए एक हैंडल खोलने के लिए Tbsi_Context_Create () का उपयोग करते हैं। TBS_CONTEXT_PARAMSपैरामीटर एक अहस्ताक्षरित 32-बिट पूर्णांक क्षेत्र है कि एक टी पी एम 1.2 उदाहरण से बात करने के 1 करने के लिए सेट किया जाना चाहिए, और क्या हम इसे करने के लिए सेट के साथ सिर्फ एक सी struct है।

    byte[] cmdBuf = new byte[768];

यह टीपीएम पीसी क्लाइंट स्पेक में न्यूनतम बफर आकार के रूप में निर्दिष्ट है । यह यहां हमारी जरूरतों के लिए पर्याप्त से अधिक होगा।

TPM 1.2 युक्ति भाग 3 निम्नलिखित कहता है:

TPM_Seal requires the encryption of one parameter (“Secret”). For the
sake of uniformity with other commands that require the encryption of
more than one parameter, the string used for XOR encryption is
generated by concatenating a nonce (created during the OSAP session)
with the session shared secret and then hashing the result.

हमें OSAP सत्र के दौरान उत्पन्न एक गैर का उपयोग करके इस "गुप्त" पैरामीटर को XOR-एन्क्रिप्ट करने की आवश्यकता है। सील कमांड इनपुट हैंडल में से एक OSAP हैंडल भी है:

The authorization session handle used for keyHandle authorization.
Must be an OSAP session for this command.

इसलिए हमें पहले इस OSAP सत्र को स्थापित करने की आवश्यकता है। ओएसएपी को टीपीएम 1.2 स्पेक पार्ट 1 में वर्णित किया गया है, । OSAP, या ऑब्जेक्ट-विशिष्ट प्राधिकरण प्रोटोकॉल, का उपयोग उस मामले को संभालने के लिए किया गया था जहाँ आप एक TPM ऑब्जेक्ट का उपयोग करना चाहते हैं जिसे कई बार प्राधिकरण की आवश्यकता होती है, लेकिन हर बार प्राधिकरण प्रदान नहीं करना चाहता: OSAP सत्र का उपयोग इसके बजाय किया जाता है, जो निर्भर करता है "साझा रहस्य" की अवधारणा पर, जो ए एचएमएसी हैजो उत्तर के हमलों को रोकने के लिए प्रत्येक पक्ष पर उत्पन्न गैर के साथ वस्तु प्राधिकरण डेटा में मिश्रण करता है। इसलिए "साझा रहस्य" इस सत्र में केवल दो पक्षों के लिए जाना जाता है: जिस पक्ष ने सत्र (उपयोगकर्ता) शुरू किया और जिस पक्ष ने इसे स्वीकार किया (टीपीएम); इसके अलावा, दोनों पक्षों के पास समान साझा करने के लिए "साझा रहस्य" के लिए समान ऑब्जेक्ट प्राधिकरण डेटा होना चाहिए; इसके अलावा, एक सत्र में उपयोग किया जाने वाला "साझा रहस्य" दूसरे में अमान्य होगा। कल्पना से यह आरेख प्रक्रिया का वर्णन करता है:

OSAP

हम इस विशेष मामले में कई सत्रों का उपयोग नहीं करेंगे (वास्तव में, उस पैरामीटर को सील कमांड के साथ अनदेखा किया गया है!) और हम जिस कुंजी का उपयोग करेंगे, उसे प्राधिकरण की आवश्यकता नहीं है, लेकिन दुर्भाग्य से हम अभी भी ओएसएपी स्थापित करने के लिए कल्पना से बंधे हैं। सत्र।

    offset = 0;
    AddUInt16Reversed (cmdBuf, 0x00C1, ref offset);
    offset = 6;
    AddUInt32Reversed (cmdBuf, 0x0000000B, ref offset);

    offset = 2 + 4 + 4; //2 for tag, 4 for size and 4 for command code

    AddUInt16Reversed (cmdBuf, 0x0004, ref offset); //Entity Type SRK = 0x0004
    AddUInt32Reversed (cmdBuf, 0x40000000, ref offset); //Entity Value SRK = 0x40000000
    rnd.NextBytes (oddOsap);
    AddBlob (cmdBuf, oddOsap, ref offset);
    uint cmdSize = (System.UInt32) offset;

TPM_OSAP कमांड ऑपरेंड हैं:

TPM_OSAP ऑपरेंड करता है

प्रत्येक TPM 1.2 कमांड इस तरह रखी गई है:

  2 bytes       4 bytes             4 bytes
+---------+------------------+------------------+---------------------------
|   Tag   |       Size       |   Command code   |    Command body    ....
+---------+------------------+------------------+---------------------------

टैग एक दो-बाइट मान है जो इंगित करता है कि इनपुट या आउटपुट के बाद क्या है, और क्या कमांड मापदंडों का पालन करते हुए कोई डेटा डेटा मान हैं। TPM_OSAP के लिए, टैग को युक्ति के अनुसार TPM_TAG_RQU_COMMAND (0x00C1) होना चाहिए, जिसका अर्थ है "कोई प्राधिकरण वाला कमांड"।

आकार एक चार-बाइट मूल्य है जो बाइट्स में कमांड के आकार को निर्दिष्ट करता है, जिसमें टैग और आकार शामिल हैं। हम इस मान को बाद में सेट करेंगे, एक बार जब हम इसे गणना कर लेंगे।

कमांड कोड एक चार-बाइट मान है जो एक कमांड आईडी के रूप में सर्वर है: यह टीपीएम को बताता है कि बाकी कमांड की व्याख्या कैसे करें। यहां हमारा कमांड कोड TPM_OSAP (0x0000000B) है।

सेट करने के लिए अगली दो चीजें हैं इकाई प्रकार और इकाई मूल्य। चूंकि हम एक कुंजी का उपयोग करना चाहते हैं जो पहले से ही टीपीएम में मौजूद है, हम इकाई प्रकार "SRK" (0x0004) का उपयोग करेंगे, और चूंकि हम इस धारणा के तहत काम कर रहे हैं कि टीपीएम पहले से ही स्वामित्व में है, इसलिए यह मान लेना सुरक्षित है कि एसआरके ने अनुमान के अनुसार स्थायी हैंडल 0x40000000 के तहत लोड किया है, इसलिए हम अपने इकाई मूल्य के लिए इस स्थायी हैंडल वैल्यू का उपयोग करेंगे। (SRK का अर्थ "स्टोरेज रूट की" है और यह रूट की कुंजी है जिसमें से अधिकांश अन्य TPM के स्वामित्व वाली कुंजी प्राप्त होती हैं)

    result = Tbsip_Submit_Command (hContext, 0, 200, pCmd, cmdSize, pRes, & resSize);

अंत में हम कमांड आकार की गणना करते हैं और इसे सेट करते हैं, और कमांड भेजते हैं।

    offset = 2 + 4 + 4; //2 for tag, 4 for size and 4 for return code
    byte[] hauthbytes = new byte[Marshal.SizeOf (hAuth)];
    Array.Copy (response, offset, hauthbytes, 0, hauthbytes.Length);
    Array.Reverse (hauthbytes);
    hAuth = System.BitConverter.ToUInt32 (hauthbytes, 0);
    offset += Marshal.SizeOf (hAuth);
    Array.Copy (response, offset, nonceEven, 0, nonceEven.Length);
    offset += nonceEven.Length;
    Array.Copy (response, offset, evenOsap, 0, evenOsap.Length);

हम TPM_OSAP पर TPM से वापस प्राप्त करने वाले डेटा हैं:

TPM_OSAP प्रतिक्रिया

तो हम वापस आते हैं:

  • हमारे मुख्य कमांड (सील) के साथ उपयोग करने के लिए प्राधिकरण हैंडल
  • नॉनवेज: मुख्य कमांड के साथ उपयोग करने के लिए टीपीएम द्वारा उत्पन्न गैर
  • nonceEvenOSAP: वह TPAP_OSAP कमांड भेजने से पहले OSAP नॉनस, जो हमारे द्वारा जनरेट किए गए नॉन से काउंटर-नॉन है। इन दो नॉनवेज का उपयोग "साझा रहस्य" बनाने में किया जाएगा।

हम उन मूल्यों को निकालते हैं और उन्हें चर में संग्रहीत करते हैं।

    byte[] sharedSecretBuf = new byte[evenOsap.Length + oddOsap.Length];
    Array.Copy (evenOsap, 0, sharedSecretBuf, 0, evenOsap.Length);
    Array.Copy (oddOsap, 0, sharedSecretBuf, evenOsap.Length, oddOsap.Length);
    System.Security.Cryptography.HMACSHA1 sharedSecretHmac = new System.Security.Cryptography.HMACSHA1 (srkAuthdata);
    byte[] sharedSecret = sharedSecretHmac.ComputeHash (sharedSecretBuf);

फिर हम "साझा रहस्य" की गणना करते हैं। कल्पना के अनुसार, गणना में जाने वाले मान दो ओएसएपी नॉन होते हैं (उपयोगकर्ता द्वारा उत्पन्न और एक टीपीएम द्वारा उत्पन्न) और कुंजी जिसे हम उपयोग करना चाहते हैं के लिए प्राधिकरण मूल्य - एसआरके। कन्वेंशन द्वारा, एसआरके ऑर्टिकल वैल्यू "सुप्रसिद्ध ऑर्किटेक्ट" है: 20-बाइट बफर का एक शून्य। तकनीकी रूप से, कोई टीपीएम के स्वामित्व में होने पर इस मूल्य को किसी और चीज़ में बदल सकता है, लेकिन व्यवहार में ऐसा नहीं किया जाता है, इसलिए हम "अच्छी तरह से ज्ञात विशेषाधिकार" मान को सुरक्षित मान सकते हैं।

आगे चलिए एक नज़र डालते हैं कि TPM_Seal कमांड में क्या जाता है:

TPM_Seal

इनमें से अधिकांश पैरामीटर बनाने के लिए तुच्छ हैं, उनमें से दो को छोड़कर: encAuthऔर pubAuth। आइए एक-एक करके उन्हें देखें।

encAuthसीलबंद डेटा के लिए एन्क्रिप्टेड AuthData है। यहाँ हमारा AuthData पहले से "अच्छी तरह से जाना जाता है" है, लेकिन हाँ हमें अभी भी इसे एन्क्रिप्ट करना है। क्योंकि हम एक OSAP सत्र का उपयोग कर रहे हैं, इसे ADIP या प्राधिकरण-डेटा प्रविष्टि प्रोटोकॉल के बाद एन्क्रिप्ट किया गया है। युक्ति से: "ADIP नई संस्थाओं के निर्माण और नई इकाई AuthData के सुरक्षित सम्मिलन के लिए अनुमति देता है। नए AuthData का प्रसारण OSAP सत्र के साझा रहस्य के आधार पर कुंजी के साथ एन्क्रिप्शन का उपयोग करता है।" इसके अतिरिक्त: "अनिवार्य XOR एन्क्रिप्शन एल्गोरिथ्म के लिए, निर्माता OSAP साझा रहस्य और एक सत्र नॉन के SHA-1 हैश का उपयोग करके एक एन्क्रिप्शन कुंजी बनाता है। निर्माता XOR एक समय पैड के रूप में एन्क्रिप्शन कुंजी का उपयोग करके नए AuthData को एन्क्रिप्ट करता है। यह एन्क्रिप्टेड डेटा TPM के निर्माण अनुरोध के साथ भेजता है। ”

निम्नलिखित चित्र बताता है कि ADIP कैसे संचालित होता है:

एक डुबकी

pubAuth"इनपुट और कीहैंडल के लिए प्राधिकरण सत्र डाइजेस्ट है।" युक्ति का भाग 1, "OIAP और OSAP उदाहरणों के लिए पैरामीटर घोषणाएँ" में बताया गया है कि ऊपर दिए गए TPM_Seal पैरामीटर तालिका की व्याख्या कैसे करें: "HMAC # कॉलम HMAC गणना में उपयोग किए गए मापदंडों का विवरण देता है। पैरामीटर्स SS, 2S, आदि समवर्ती और हैं। हैडर inParamDigest या outParamDigest, को स्पष्ट रूप से 1H1 और संभवतः 1H2 कहा जाता है यदि दो प्राधिकरण सत्र हैं। पहले सत्र के लिए, 1H1, 2H1, 3H1, और 4H1 को संक्षिप्त और HMAC'ed हैं। दूसरे सत्र के लिए, 1H2, 2H2, 3H2। और 4H2 संघटित और HMAC'ed हैं। " इसलिए हमें encAuthप्लेनटेक्स्ट , उसके आकार, ऊपर से पीसीआर सूचना के आकार, और TPM_Seal ऑर्डिनल, और फिर HMAC को दो नॉन और "जारी सत्र" बूलियन का उपयोग करके OSAP का उपयोग करना होगा।

यह सब एक साथ आरेख में लाना:

पबहुत संगणना

ध्यान दें कि हमने इस कोड में "पीसीआर सूचना आकार" को शून्य पर कैसे सेट किया है, क्योंकि हम डेटा को सिस्टम स्थिति में लॉक किए बिना एन्क्रिप्ट करना चाहते हैं। हालाँकि जरूरत पड़ने पर "पीसीआर सूचना" संरचना प्रदान करना तुच्छ है।

    offset = 0;
    AddUInt16Reversed (cmdBuf, 0x00C2, ref offset); 
    offset = 6;
    AddUInt32Reversed (cmdBuf, 0x00000017, ref offset); // TPM_ORD_SEAL;
    ...
    result = Tbsip_Submit_Command (hContext, 0, 200, pCmd, cmdSize, pRes, & resSize);

अंत में हम कमांड का निर्माण करते हैं और इसे भेजते हैं।

    byte[] retBuffer = new byte[responseSize - 10];
    Array.Copy (response, 10, retBuffer, 0, retBuffer.Length);
    Tbsip_Context_Close (hContext);
    return retBuffer;

हम अपने संचार हैंडल को बंद करने के लिए Tbsip_Context_Close () फ़ंक्शन का उपयोग करते हैं ।

हम इस प्रतिक्रिया को वापस लौटा रहे हैं, जैसा कि यहां है। आदर्श रूप से आप बाइट्स को फिर से रिवर्स करना चाहते हैं और इसे resAuthमैन-इन-द-बीच के हमलों को रोकने के लिए मान को पुनर्मूल्यांकन करके सत्यापित करना चाहते हैं ।


क्या भ्रामक है कोई Tspi_Data_Bind कमांड नहीं है।

ऐसा इसलिए है क्योंकि Tspi_Data_Bind एक TSS कमांड है, न कि TPM कमांड। इसका कारण यह है कि इसके लिए कोई रहस्य नहीं है (केवल सार्वजनिक कुंजी का उपयोग किया जाता है) इसलिए इसे टीपीएम को शामिल किए बिना किया जा सकता है। हालांकि, इसने भ्रम पैदा किया, और यहां तक ​​कि उन कमांड्स की भी आवश्यकता होती है, जिन्हें अब TPM 2 युक्ति में शामिल नहीं किया गया है।

मैं टीपीएम की सार्वजनिक कुंजी के साथ एक कुंजी को कैसे एन्क्रिप्ट कर सकता हूं?

टीपीएम संस्करण पर निर्भर करता है। TPM_CreateWrapKey के साथ TPM 1.2 के लिए कमांड। TPM2_Create कमांड के साथ TPM 2 के लिए।

एक डेवलपर TPM की कुंजी को कैसे लॉक करता है?

या तो इसे टीपीएम में बनाएं, या इसे लपेटें, या उपलब्ध तरीकों में से किसी अन्य का उपयोग करें।

TPM2_Create, HMAC कुंजी निर्दिष्ट कर रहा है

पुस्तक का पाठ भ्रामक है। आप HMAC कुंजी निर्दिष्ट नहीं करते हैं , आप निर्दिष्ट करते हैं कि आप HMAC कुंजी चाहते हैं ।

तथ्य यह है कि HMAC कुंजी गुप्त नहीं है समझ में आता है

नहीं इसका कोई मतलब नहीं है। कुंजी गुप्त है।

... उन्हें हार्डवेयर डिवाइस में सुरक्षित रखते हुए कुंजियों का उपयोग करें ... बहुत बढ़िया! आप इसे कैसे करते हो!?

टीपीएम के दोनों संस्करण के लिए या तो कुंजी बनाने या उन्हें आयात करने की आज्ञा है। टीपीएम 1 के लिए केवल एक मूल कुंजी थी - एसआरके - जिसमें से आप लिपटे हुए कुंजी बनाकर एक प्रमुख पदानुक्रम स्थापित कर सकते हैं। टीपीएम 2 के साथ आपके पास कई प्राथमिक, या रूट, चाबियाँ हो सकती हैं।

क्या TPM में क्रिप्टोग्राफ़िक कुंजियाँ उत्पन्न करने और एक हार्डवेयर सीमा के भीतर अपने रहस्यों की रक्षा करने की क्षमता है? ऐसा है, कैसे?

ऊपर देखो।

अति उत्कृष्ट! यह वास्तव में उपयोग मामला है जो मैं चाहता हूँ। यह Microsoft द्वारा TPM के लिए उपयोग किए जाने वाले केस का उपयोग भी है। मैं यह कैसे करुं!?

संभवतः ड्राइव के प्रकार पर निर्भर करता है। गैर-SED ड्राइव के मामले में, ड्राइव एन्क्रिप्शन कुंजी संभवतः TPM कुंजी के साथ लिपटी है। SED ड्राइव के मामले में, व्यवस्थापक 1 पासवर्ड (या ऐसा) टीपीएम के साथ सील है।

इंडोर्समेंट कुंजी या ईके ... कहीं टीपीएम के अंदर आरएसए निजी कुंजी है। उस कुंजी को वहां बंद कर दिया जाता है - कभी भी बाहरी दुनिया द्वारा नहीं देखा जाना चाहिए। मैं चाहता हूं कि टीपीएम अपनी निजी कुंजी के साथ कुछ हस्ताक्षर करे (यानी इसे निजी कुंजी के साथ एन्क्रिप्ट करें)।

ईके एक हस्ताक्षर कुंजी नहीं है - यह एक एन्क्रिप्शन कुंजी है। हालाँकि, यह सामान्य उद्देश्य वाली एन्क्रिप्शन कुंजी नहीं है: इसका उपयोग केवल कुछ संदर्भों में किया जा सकता है

लेकिन जो चीज मैं वास्तव में करना चाहता हूं वह है कुछ डेटा को "सील" करना

ऊपर देखो।


2

जब यह कहता है

HMAC कुंजी निर्दिष्ट करना

इसका मतलब एचएमएसी कुंजी प्रदान नहीं करना है - इसका मतलब "एचएमएसी कुंजी को इंगित करना है जिसे आप उपयोग करना चाहते हैं"

जैसा कि पुस्तक में बताया गया है कि TPM, HMAC कुंजियों की लगभग असीमित संख्या का उपयोग कर सकता है। आपको टीपीएम बताना होगा कि कौन सा उपयोग करना है।


तो क्या कोई कोड नमूना दिखा रहा है कि सी # या किसी अन्य भाषा में उपयोग की जाने वाली एचएमएसी कुंजी को कैसे निर्दिष्ट करें (इंगित करें)?
चाड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.