কীভাবে টিপিএম (বিশ্বস্ত প্ল্যাটফর্ম মডিউল) ব্যবহার করে বাইটগুলি এনক্রিপ্ট করবেন


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কী জেনারেটর হিসাবে অ্যাকাউন্টটি ব্যবহার করে এনক্রিপ্ট করা হয় ( বিশদ, যদিও আকর্ষণীয়, গুরুত্বহীন )। শেষ ফলাফলটি হ'ল আমি ডেটা এনক্রিপ্ট করতে পারি (উদাহরণস্বরূপ একটি হার্ড ড্রাইভ এনক্রিপশন মাস্টার কী) যা কেবলমাত্র স্থানীয় মেশিন দ্বারা ডিক্রিপ্ট করা যায়।

এখন সময় এসেছে এটি আরও একধাপ এগিয়ে নিয়ে যাওয়ার। আমি কিছু ডেটা (যেমন একটি হার্ড ড্রাইভ এনক্রিপশন মাস্টার কী) এনক্রিপ্ট করতে চাই যা কেবলমাত্র স্থানীয় টিপিএম দ্বারা ডিক্রিপ্ট করা যায়। অন্য কথায়, আমি উইন্ডোজ টিপিএম সহ অ্যান্ড্রয়েডের জন্য নীচের ব্লক ডায়াগ্রামে কোয়ালকম ট্রাস্টেড এক্সিকিউশন পরিবেশ ( টিইই ) প্রতিস্থাপন করতে চাই :

এখানে চিত্র বর্ণনা লিখুন

দ্রষ্টব্য : আমি বুঝতে পারি যে টিপিএম ডেটা-স্বাক্ষর করে না (বা যদি তা করে তবে এটি কোনও গ্যারান্টি দেয় না যে একই ডেটাতে স্বাক্ষর করা প্রতি বারে একই বাইনারি আউটপুট দেবে)। যে কারণে আমি "আরএসএ স্বাক্ষর" প্রতিস্থাপন করতে চাই " একটি হার্ডওয়্যার বাউন্ড কী দ্বারা 256-বিট ব্লব এনক্রিপ্ট করা " দিয়ে ।

তাহলে কোডটি কোথায়?

সমস্যাটি হ'ল টিপিএম প্রোগ্রামিংটি এমএসডিএন-তে সম্পূর্ণ নথিভুক্ত । কোনও ক্রিয়াকলাপ সম্পাদনের জন্য কোনও এপিআই উপলব্ধ নেই। এর পরিবর্তে আপনি নিজেকে একটি কপি খুঁজে বের করতে হবে বিশ্বস্ত কম্পিউটিং গ্রুপের সফটওয়্যার স্ট্যাক (TSS ওরফে) , কি কি অনুক্রমে, TPM টি পাঠাতে প্লেলোডগুলি সঙ্গে, এবং কল কমান্ড জিনিসটা উইন্ডো এর Tbsip_Submit_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
);

উইন্ডোজের ক্রিয়া সম্পাদনের জন্য উচ্চ স্তরের কোনও এপিআই নেই।

এটি আপনার হার্ড ড্রাইভে SATA I / O কমান্ড জারি করে একটি পাঠ্য ফাইল তৈরি করার চেষ্টা করার নৈতিক সমতুল্য

কেন শুধু ট্রাউজার ব্যবহার করবেন না

বিশ্বস্ত কম্পিউটিং গ্রুপ (টিসিজি) তাদের নিজস্ব এপিআই নির্ধারণ করেছে: টিসিবি সফ্টওয়্যার স্ট্যাক (টিএসএস) । এই এপিআইটির একটি বাস্তবায়ন কিছু লোক তৈরি করেছিলেন এবং এটি ট্রাউসার্স নামে পরিচিত । তারপরে একজন লোক সেই প্রকল্পটি উইন্ডোজে পোর্ট করে

এই কোডটি নিয়ে সমস্যাটি হ'ল এটি উইন্ডোজ বিশ্বে পোর্টেবল নয়। উদাহরণস্বরূপ, আপনি এটি ডেল্ফি থেকে ব্যবহার করতে পারবেন না, আপনি এটি সি # থেকে ব্যবহার করতে পারবেন না। এটি প্রয়োজন:

  • দ্বারা OpenSSL
  • pThread

আমি কেবল কোডটি আমার টিপিএম দিয়ে কিছু এনক্রিপ্ট করতে চাই।

উপরের CryptProtectDataজন্য ফাংশন বডিটিতে যা রয়েছে তা ব্যতীত অন্য কিছুই প্রয়োজন।

টিপিএম ব্যবহার করে ডেটা এনক্রিপ্ট করার সমতুল্য কোডটি কী? অন্যরা যেমন উল্লেখ করেছে, আপনাকে সম্ভবত তিনটি টিপিএম ম্যানুয়াল পরামর্শ করতে হবে এবং নিজেই ব্লবগুলি তৈরি করতে হবে । এটি সম্ভবত TPM_sealআদেশ জড়িত । যদিও আমি মনে করি যে আমি ডেটা সিল করতে চাই না , আমি মনে করি আমি এটি আবদ্ধ করতে চাই:

বাইন্ডিং - টিপিএম বাইন্ড কী ব্যবহার করে ডেটা এনক্রিপ্ট করে, একটি অনন্য আরএসএ কী স্টোরেজ কী থেকে নেমে আসে। সিলিং - একইভাবে বাঁধাইয়ের জন্য ডেটা এনক্রিপ্ট করে, তবে পাশাপাশি একটি রাজ্য নির্দিষ্ট করে যেখানে ডিক্রিপ্ট করার জন্য টিপিএম অবশ্যই থাকতে হবে (আনসিল করা হয়নি)

আমার প্রয়োজনীয় 20 টি লাইন কোডের সন্ধানের জন্য আমি তিনটি প্রয়োজনীয় খণ্ড পড়তে চেষ্টা করেছি:

কিন্তু আমার আছে কী পড়ছি তা সম্পর্কে আমার ধারণা নেই । যদি কোনও ধরণের টিউটোরিয়াল বা উদাহরণ থাকে তবে আমার শট থাকতে পারে। তবে আমি পুরোপুরি হারিয়ে গেছি।

সুতরাং আমরা স্ট্যাকওভারফ্লো জিজ্ঞাসা করি

একইভাবে আমি প্রদান করতে সক্ষম হয়েছিল:

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এলএসএ-তে টিপিএম-এ লক করা আছে?

গবেষণা শুরু

বাঁধনের অর্থ কী তা আমি ঠিক জানি না । কিন্তু TPM টি প্রধান দিকে তাকিয়ে - পার্ট 3 কমান্ড - স্পেসিফিকেশন সংস্করণ 1.2, সেখানে একটি উল্লেখ করা হয় বেঁধে :

10.3 টিপিএম_উনবাইন্ড

টিপিএম_উনবাইন্ড একটি ডেটা ব্লব নেয় যা টিএসপি_ডাটা_বিন্দ কমান্ডের ফলাফল এবং ব্যবহারকারীর কাছে রফতানির জন্য ডিক্রিপ্ট করে। কলকারীকে অবশ্যই কীটির ব্যবহার অনুমোদিত করতে হবে যা আগত ব্লবটি ডিক্রিপ্ট করবে। টিপিএম_উইনবাইন্ড একটি ব্লক-বাই-ব্লক ভিত্তিতে কাজ করে এবং এর মধ্যে একটি ব্লক এবং অন্য একটির মধ্যে কোনও সম্পর্কের ধারণা নেই।

কি বিভ্রান্তিকর হয় কোন Tspi_Data_Bindআদেশ আছে।

গবেষণা প্রচেষ্টা

এটি হতাশাজনক যে কেউ কখনই টিপিএম বা এর ক্রিয়াকলাপ ডকুমেন্ট করার জন্য মাথা ঘামায় না। এটি মনে হয় যেন তারা তাদের সমস্ত সময় এই দুর্দান্ত জিনিসটি নিয়ে খেলতে ব্যয় করে, তবে এটি কোনও কিছুর জন্য ব্যবহারযোগ্য করে তোলার বেদনাদায়ক পদক্ষেপটি মোকাবেলা করতে চায় নি ।

টিপিএম ২.০ এর প্র্যাকটিক্যাল গাইড টু: এখনকার বিনামূল্যে বইয়ের সাথে শুরু : সুরক্ষার নতুন যুগে বিশ্বস্ত প্ল্যাটফর্ম মডিউলটি ব্যবহার করে :

অধ্যায় 3 - টিপিএম 2.0 এর দ্রুত টিউটোরিয়াল

টিপিএমের একটি স্ব-উত্পন্ন বেসরকারী কীতে অ্যাক্সেস রয়েছে, সুতরাং এটি একটি পাবলিক কী দিয়ে কীগুলি এনক্রিপ্ট করতে পারে এবং তারপরে ফলস ব্লবটি হার্ড ডিস্কে সঞ্চয় করতে পারে। এইভাবে, টিপিএম ব্যবহারের জন্য কার্যত সীমিত সীমাহীন সংখ্যক কী রাখতে পারে তবে মূল্যবান অভ্যন্তরীণ সঞ্চয়স্থান নষ্ট করে না। হার্ড ডিস্কে সঞ্চিত কীগুলি মুছে ফেলা যায়, তবে সেগুলি ব্যাকআপও করা যায়, যা ডিজাইনারদের কাছে একটি গ্রহণযোগ্য ট্রেড অফের মতো বলে মনে হয়েছিল।

আমি টিপিএমের পাবলিক কী দিয়ে কী কী এনক্রিপ্ট করব?

অধ্যায় 4 - বিদ্যমান অ্যাপ্লিকেশন যা টিপিএম ব্যবহার করে

অ্যাপ্লিকেশন যে টিপিএম ব্যবহার করা উচিত কিন্তু না

গত কয়েক বছরে, ওয়েব-ভিত্তিক অ্যাপ্লিকেশনগুলির সংখ্যা বৃদ্ধি পেয়েছে। এর মধ্যে ওয়েব-ভিত্তিক ব্যাকআপ এবং স্টোরেজ রয়েছে। বিপুল সংখ্যক সংস্থাগুলি এখন এই জাতীয় পরিষেবাদি সরবরাহ করে, তবে আমরা যতটা অবগত আছি, এই পরিষেবাদির ক্লায়েন্টগুলির মধ্যে কোনওরই ব্যবহারকারী কোনও টিপিএম-এ ব্যাকআপ পরিষেবার জন্য কীটি লক করতে দেয় না। এটি করা হয়ে থাকলে, টিপিএম কী নিজেই একাধিক মেশিনে এটির সদৃশ করে ব্যাক আপ করে নিলে তা অবশ্যই দুর্দান্ত হবে। এটি বিকাশকারীদের জন্য একটি সুযোগ বলে মনে হয়।

কীভাবে কোনও বিকাশকারী টিপিমের চাবি লক করে?

অধ্যায় 9 - হেরার্চি

ব্যবহারের পরিস্থিতি: স্টোরিং লগিন পাসওয়ার্ড

একটি সাধারণ পাসওয়ার্ড ফাইল পাসওয়ার্ডের সল্ট হ্যাশগুলি সঞ্চয় করে। যাচাইকরণটিতে সরবরাহ করা পাসওয়ার্ড সল্টিং এবং হ্যাশিং এবং স্টোর মানের সাথে তুলনা করে। যেহেতু গণনাটিতে কোনও গোপন নেই, এটি পাসওয়ার্ড ফাইলে অফলাইনে আক্রমণের বিষয় to

এই ব্যবহারের ক্ষেত্রে টিপিএম-উত্পন্ন HMAC কী ব্যবহার করা হয়। পাসওয়ার্ড ফাইলটি লবণাক্ত পাসওয়ার্ডের একটি এইচএমএসি সঞ্চয় করে। যাচাইয়ের মধ্যে সরবরাহ করা পাসওয়ার্ড সল্টিং এবং এইচএমএকিং এবং সঞ্চিত মানের সাথে তুলনা করে। কোনও অফলাইন আক্রমণকারীর এইচএমএসি কী নেই বলে, আক্রমণকারী গণনা সম্পাদন করে আক্রমণ আক্রমণ করতে পারে না।

এটি কাজ করতে পারে । যদি টিপিএমের একটি গোপন এইচএমএসি কী থাকে এবং কেবলমাত্র আমার টিপিএমই এইচএমএসি কী জানে, তবে আমি "সাইন (এটির ব্যক্তিগত কী সহ টিপিএম এনক্রিপ্ট)" প্রতিস্থাপন করতে পারি "এইচএমএসি" দিয়ে। তবে তার পরের লাইনেই তিনি নিজেকে পুরোপুরি উল্টে দেন:

TPM2_Create, একটি HMAC কী নির্দিষ্ট করে

যদি আমাকে এইচএমএসি কীটি নির্দিষ্ট করতে হয় তবে এটি টিপিএম গোপন নয়। এইচএমএসি কীটি গোপনীয় নয় তা আপনি যখন বুঝতে পারবেন তখন এটি টিপিএম সরবরাহ করা ক্রিপ্টোগ্রাফিক ইউটিলিটিগুলি সম্পর্কে অধ্যায়টি বোঝায়। আপনার নিজের নিজের SHA2, AES, HMAC বা RSA লেখার পরিবর্তে, টিপিএম ইতিমধ্যে যা পড়েছিল তা আপনি আবার ব্যবহার করতে পারেন।

অধ্যায় 10 - কী

সুরক্ষা ডিভাইস হিসাবে, কোনও হার্ডওয়্যার ডিভাইসে নিরাপদ রাখার সময় কীগুলি ব্যবহার করার জন্য অ্যাপ্লিকেশনটির ক্ষমতা হ'ল টিপিএমের বৃহত্তম শক্তি। টিপিএম উভয়ই বাহ্যিকভাবে উত্পন্ন কীগুলি উত্পন্ন এবং আমদানি করতে পারে। এটি উভয় অসমमित এবং প্রতিসাম্য কী সমর্থন করে।

অসাধারণ! তুমি এটা কিভাবে কর!?

কী জেনারেটর

যুক্তিযুক্তভাবে, টিপিএমের বৃহত্তম শক্তি হ'ল একটি ক্রিপ্টোগ্রাফিক কী উত্পন্ন করার এবং একটি হার্ডওয়্যার সীমানার মধ্যে এর গোপনীয়তা রক্ষা করার দক্ষতা। মূল জেনারেটর টিপিএমের নিজস্ব র্যান্ডম নম্বর জেনারেটরের উপর ভিত্তি করে তৈরি এবং এলোমেলোতার বাহ্যিক উত্সগুলিতে নির্ভর করে না। এটি এন্ট্রপির অপর্যাপ্ত উত্স সহ দুর্বল সফ্টওয়্যার সফটওয়্যারের ভিত্তিতে দুর্বলতাগুলি দূর করে।

না TPM টি ক্রিপ্টোগ্রাফিক কী তৈরী করা এবং একটি হার্ডওয়্যার সীমানা মধ্যে এর গোপন রক্ষা করার ক্ষমতা আছে? তাইলে কীভাবে?

অধ্যায় 12 - প্ল্যাটফর্ম কনফিগারেশন নিবন্ধসমূহ

অনুমোদনের জন্য পিসিআর

ব্যবহারের পরিস্থিতি: প্ল্যাটফর্ম স্টেটের জন্য একটি হার্ড ডিস্ক এনক্রিপশন কীটি বিক্রয় করুন

সম্পূর্ণ ডিস্ক এনক্রিপশন অ্যাপ্লিকেশনগুলি আরও সুরক্ষিত হয় যদি কোনও টিপিএম একই ডিস্কে সঞ্চিত থাকে তবে কেবলমাত্র একটি পাসওয়ার্ড দ্বারা সুরক্ষিত থাকলে এনক্রিপশন কীটি সুরক্ষা দেয়। প্রথমত, টিপিএম হার্ডওয়্যারটিতে এন্টি হাতুড়ির সুরক্ষা রয়েছে (টিপিএম অভিধান আক্রমণ সুরক্ষা সম্পর্কিত বিশদ বিবরণের জন্য অধ্যায় 8 দেখুন), পাসওয়ার্ডটিকে অবৈজ্ঞানিকভাবে আক্রমণাত্মক আক্রমণ তৈরি করে। কেবল সফ্টওয়্যার দ্বারা সুরক্ষিত একটি কী দুর্বল পাসওয়ার্ডের চেয়ে অনেক বেশি ঝুঁকিপূর্ণ। দ্বিতীয়ত, ডিস্কে সঞ্চিত একটি সফ্টওয়্যার কী চুরি করা অনেক সহজ। ডিস্কটি (বা ডিস্কের একটি ব্যাকআপ) নিন এবং আপনি কীটি পাবেন। যখন কোনও টিপিএম কী ধরে রাখে, পুরো প্ল্যাটফর্ম, বা কমপক্ষে ডিস্ক এবং মাদারবোর্ডটি অবশ্যই চুরি করতে হবে।

সিলিং কীটিকে কেবল একটি পাসওয়ার্ড দ্বারা নয়, একটি নীতি দ্বারা সুরক্ষিত করার অনুমতি দেয়। একটি সাধারণ নীতি সিলিংয়ের সময় পিসিআর মানগুলির (সফ্টওয়্যার স্টেট) বর্তমানের চাবিটি লক করে। এটি ধরে নিয়েছে যে প্রথম বুটে রাজ্য কোনও আপোসযুক্ত নয়। প্রথম বুটে উপস্থিত যে কোনও প্রাক-ইনস্টল করা ম্যালওয়ার পিসিআরগুলিতে পরিমাপ করা হবে এবং এই কীটি আপোসযুক্ত সফ্টওয়্যার অবস্থায় সীলমোহর করা হবে। কম বিশ্বাসযোগ্য এন্টারপ্রাইজটিতে একটি স্ট্যান্ডার্ড ডিস্ক চিত্র থাকতে পারে এবং সেই চিত্রটি উপস্থাপনকারী পিসিআরগুলিতে মোহর দেওয়া যেতে পারে। এই পিসিআর মানগুলি সম্ভবত আরও বিশ্বস্ত প্ল্যাটফর্মে প্রাক্কুলেট করা হবে। এমনকি আরও পরিশীলিত এন্টারপ্রাইজ টিপিএম 2_পলিসিঅর্টিফাইজ ব্যবহার করবে এবং বিশ্বস্ত পিসিআর মানগুলির সেটকে অনুমোদন দেওয়ার জন্য বেশ কয়েকটি টিকিট সরবরাহ করবে। পিসিআর ব্রিটলিনেস সমস্যা সমাধানের জন্য নীতি অনুমোদনের বিশদ বিবরণ এবং এর প্রয়োগের জন্য অধ্যায় 14 দেখুন।

যদিও একটি পাসওয়ার্ড কীটিও সুরক্ষিত করতে পারে, এমনকি টিপিএম কী পাসওয়ার্ড ছাড়াই সুরক্ষা পাওয়া যায়। কোনও আক্রমণকারী টিপিএমকি পাসওয়ার্ড সরবরাহ না করে প্ল্যাটফর্মটি বুট করতে পারে তবে ওএস ব্যবহারকারীর নাম এবং পাসওয়ার্ড ছাড়া লগ ইন করতে পারে না। ওএসসিকিউরিটি ডেটা সুরক্ষিত করে। আক্রমণকারী একটি বিকল্প ওএস বুট করতে পারে, হার্ড ড্রাইভ থেকে ওএস লগইন সুরক্ষা বাইপাস করার পরিবর্তে লাইভ ডিভিডি বা ইউএসবি স্টিক থেকে বলতে পারেন। যাইহোক, এই পৃথক বুট কনফিগারেশন এবং সফ্টওয়্যার পিসিআরওয়েলগুলি পরিবর্তন করবে। যেহেতু এই নতুন পিসিআর সিল করা মানগুলির সাথে মেলে না, টিপিএম ডিক্রিপশন কীটি প্রকাশ করবে না এবং হার্ড ড্রাইভটি ডিক্রিপ্ট করা যাবে না।

অসাধারণ! এটি হ'ল আমার ব্যবহারের ক্ষেত্রে এটি ঘটবে। মাইক্রোসফ্ট এটির ব্যবহারের ক্ষেত্রে টিপিএম ব্যবহার করে। আমি এটা কিভাবে করব!?

সুতরাং আমি সেই পুরো বইটি পড়েছি এবং এটি কার্যকর কোনও কিছুই সরবরাহ করে নি। এটি বেশ চিত্তাকর্ষক কারণ এটি 375 পৃষ্ঠা। আপনি কি ভাবছেন বইটি কী রয়েছে - এবং এটির দিকে ফিরে তাকালে আমার কোনও ধারণা নেই।

সুতরাং আমরা টিপিএম প্রোগ্রামিংয়ের সুনির্দিষ্ট গাইড ত্যাগ করি এবং এর পরিবর্তে মাইক্রোসফ্ট থেকে কিছু ডকুমেন্টেশনে ফিরে যাই:

থেকে মাইক্রোসফট TPM টি প্ল্যাটফর্ম ক্রিপ্টো জীবিকাদাতা টুলকিট । এটিতে আমি কী করতে চাই তা উল্লেখ করেছে:

এন্ডোসরমেন্ট কী বা ইকে

ই প্ল্যাটফর্মটির জন্য একটি নির্ভরযোগ্য ক্রিপ্টোগ্রাফিক সনাক্তকারী সরবরাহ করার জন্য ডিজাইন করা হয়েছে। কোনও এন্টারপ্রাইজ তাদের এন্টারপ্রাইজের সমস্ত পিসির টিপিএম সম্পর্কিত এনডোর্সমেন্ট কীগুলির একটি ডাটাবেস বজায় রাখতে পারে, বা একটি ডেটা সেন্টার ফ্যাব্রিক কন্ট্রোলারের সমস্ত ব্লেডে টিপিএমের একটি ডাটাবেস থাকতে পারে। উইন্ডোজে আপনি ইসির পাবলিক অংশটি পড়তে "উইন্ডোজ 8-এ প্ল্যাটফর্ম ক্রিপ্টো সরবরাহকারী" বিভাগে বর্ণিত এনক্রিপট সরবরাহকারী ব্যবহার করতে পারেন।

কোথাও টিপিএমের ভিতরে একটি আরএসএ প্রাইভেট কী রয়েছে। সেই চাবিটি সেখানে লক করা আছে - বাইরের পৃথিবীর দ্বারা আর কখনও দেখা যায় না। আমি চাই টিপিএম এটির ব্যক্তিগত কী (যেমন এটি ব্যক্তিগত কী দিয়ে এটি এনক্রিপ্ট করুন) দিয়ে কিছু সই করতে পারে।

সুতরাং আমি সম্ভবত সর্বাধিক প্রাথমিক অপারেশন চাই যা বিদ্যমান থাকতে পারে:

এখানে চিত্র বর্ণনা লিখুন

আপনার ব্যক্তিগত কী দিয়ে কিছু এনক্রিপ্ট করুন। আমি আরও জটিল জিনিস জিজ্ঞাসা করছি না (এখনও):

  • এটি পিসিআর রাজ্যের উপর ভিত্তি করে "সিলিং"
  • একটি কী তৈরি করা এবং এটি উদ্বায়ী বা অ-উদ্বায়ী স্মৃতিতে সঞ্চয় করা
  • একটি প্রতিসম কী তৈরি করা এবং এটি টিপিএম-এ লোড করার চেষ্টা করা

আমি কোনও টিপিএম করতে পারে এমন সবচেয়ে বেসিক অপারেশনটির জন্য বলছি। এটি কীভাবে করবেন সে সম্পর্কে কোনও তথ্য পাওয়া কেন অসম্ভব?

আমি এলোমেলো ডেটা পেতে পারি

আমি মনে করি যে টিপিএম করতে পারে যখন আরএসএ সাইন ইন করা সবচেয়ে মৌলিক জিনিস তখন আমি বলেছিলাম যে আমি গ্লীব হয়ে যাচ্ছিলাম। সবচেয়ে মৌলিক জিনিস 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;
}

অভিনব জিনিস

আমি বুঝতে পারি যে টিপিএম ব্যবহার করে মানুষের আয়তন খুব কম। এজন্য স্ট্যাকওভারফ্লোতে কারওও উত্তর নেই। সুতরাং আমি আমার সাধারণ সমস্যার সমাধান পেতে সত্যিই খুব লোভ পেতে পারি না। তবে বিষয়টি আমি চাই সত্যিই কাজ করতে চান হয় "সীল" কিছু ডেটা:

এখানে চিত্র বর্ণনা লিখুন

  • টিপিএমকে কিছু উপাত্ত উপস্থাপন করুন (উদাহরণস্বরূপ কী উপাদানগুলির 32 বাইট)
  • টিপিএম ডেটা এনক্রিপ্ট করে কিছু অস্বচ্ছ ব্লব কাঠামো ফিরিয়ে দেয়
  • পরে টিপিএমকে ব্লবটি ডিক্রিপ্ট করতে বলুন
  • ডিক্রিপশনটি কেবল তখনই কাজ করবে যখন টিপিএমের পিসিআর নিবন্ধগুলি এনক্রিপশন চলাকালীন একই ছিল।

অন্য কথায়:

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

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

ক্রিপ্টোগ্রাফি নেক্সট জেনার (সিএনজি, ওরফে বিসিক্রিপ) টিপিএম সমর্থন করে

উইন্ডোজের আসল ক্রিপ্টোগ্রাফি এপিআই ক্রিপ্টো এপিআই হিসাবে পরিচিত।

উইন্ডোজ ভিস্তার সাথে শুরু করে, ক্রিপ্টো এপিআই-কে প্রতিস্থাপন করা হয়েছে ক্রিপ্টোগ্রাফি এপিআই: নেক্সট জেনারেশন (অভ্যন্তরীণভাবে বেস্টক্রিপ হিসাবে পরিচিত , বিসিক্রিপ হিসাবে সংক্ষেপিত , পাসওয়ার্ড হ্যাশিং অ্যালগরিদমের সাথে বিভ্রান্ত হওয়ার দরকার নেই )।

দুটি বিসিক্রিপ সরবরাহকারী সহ উইন্ডোজ জাহাজ :

প্ল্যাটফর্ম ক্রিপ্টো প্রদানকারী দুটিই MSDN নথিভুক্ত করা হয় না, কিন্তু একটি 2012 মাইক্রোসফট রিসার্চ সাইট থেকে ডকুমেন্টেশন আছে:

টিপিএম প্ল্যাটফর্ম ক্রিপ্টো-সরবরাহকারী টুলকিট

টিপিএম প্ল্যাটফর্ম ক্রিপ্টো সরবরাহকারী এবং টুলকিট উইন্ডোজ ৮-তে টিপিএম-সম্পর্কিত কার্যকারিতা ব্যবহারের জন্য স্যাম্পল কোড, ইউটিলিটিস এবং ডকুমেন্টেশন রয়েছে। বর্ণিত সাবসিস্টিমে রয়েছে টিপিএম-ব্যাকড ক্রিপ্টো-নেক্সট-জেন (সিএনজি) প্ল্যাটফর্ম ক্রিপ্টো-সরবরাহকারী, এবং কীভাবে সত্যায়ন-পরিষেবা সরবরাহকারী নতুন উইন্ডোজ বৈশিষ্ট্য ব্যবহার করতে পারেন। উভয়ই TPM1.2 এবং TPM2.0- ভিত্তিক সিস্টেম সমর্থিত।

মনে হচ্ছে মাইক্রোসফ্টের অভিপ্রায়টি ক্রিপ্টোগ্রাফি এনজি এপিআইয়ের মাইক্রোসফ্ট প্ল্যাটফর্ম ক্রিপ্টো সরবরাহকারীর সাথে টিপিএম ক্রিপ্টো কার্যকারিতা উপস্থাপন করবে ।

মাইক্রোসফ্ট বিসিক্রিপ ব্যবহার করে সর্বজনীন কী এনক্রিপশন

দেত্তয়া আছে:

মাইক্রোসফ্ট ক্রিপ্টোগ্রাফি নেক্সট জেনার এপিআই ব্যবহার করে কীভাবে ডিজিটাল স্বাক্ষর করবেন তা নির্ধারণের জন্য এগিয়ে যাওয়ার উপায় হতে পারে ।

আমার পরবর্তী পদক্ষেপটি স্ট্যান্ডার্ড প্রদানকারী ( MS_PRIMITIVE_PROVIDER) ব্যবহার করে একটি আরএসএ পাবলিক কী সহ বিসিক্রিপ্টে এনক্রিপশন করার কোডটি নিয়ে আসবে । উদাহরণ:

  • modulus: 0 এক্সডিসি 67 এফএ এফ 4 9 ই এফ 2 72 1 ডি 45 2 সি বি 4 80 79 06 এ0 94 27 50 8209 ডিডি 67 সিই 57 বি 8 6 সি 4 এ 4 এফ 4 9 এফ ডি 2 ডি 1 69 এফবি 995 ডি 85 0 সি 07 এ 1 এফ 9 47 1 বি 56 16 6 ই এফ 6 7 এফ বি 9 সিএফ 2 এ 58 36 37 99 29 এএ 4 এফ এ 8 12 ই 8 4 এফ সি 7 82 2 বি 9 ডি 72 2 এ 9 সি ডিইএফ 6 এফ সি 2 ইই 12 6 ডি সিএফ এফ 0 এফ 2 বি 8 সি 4 ডিডি 7 সি 5 সি 1 এ সি 8 17 51 এ 9 এসি ডিএফ 08 22 04 9D 2B ডি 7 এফ 9 4 বি 09 ডি 9 এ 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) ব্যবহার করে স্যুইচ করতে সক্ষম হতে পারি ।

২/২২/২০১6: এবং অ্যাপল ব্যবহারকারীদের ডেটা ডিক্রিপ্ট করতে সহায়তা করতে বাধ্য হওয়ার সাথে সাথে, কীভাবে টিপিএমকে এটি উদ্ভাবিত হয়েছিল সবচেয়ে সর্বাধিক সহজ কাজ সম্পাদন করতে পারে সে সম্পর্কে নতুনভাবে আগ্রহ তৈরি হয় - কিছু এনক্রিপ্ট করা।

এটি মোটামুটি গাড়ির মালিক সবার সমতুল্য, তবে কেউ কীভাবে এটি চালাবেন তা জানেন না। এটি সত্যিকারের দরকারী এবং দুর্দান্ত জিনিসগুলি করতে পারে, কেবলমাত্র যদি আমরা পদক্ষেপ 1 টি পাশ করতে পারি ।

বোনাস রিডিং


বাঁধাইয়ের জন্য (এনক্রিপশন) এর জন্য কোনও স্পষ্টত কার্য উপলব্ধ নেই এবং এটিরও প্রয়োজন নেই। আপনি কেবল টিপিএম-এ একটি বাঁধাই কী তৈরি করেন এবং সিস্টেমের আরএসএ এনক্রিপশন ফাংশন ("আরএসএ / ইসিবি / ওএইপিউইথএইচএমএইচএমএফ 1 প্যাডিং") সহ একটি প্রতিসৃত এনক্রিপশন কী সেককে এনক্রিপ্ট করার জন্য এর সর্বজনীন অংশটি ব্যবহার করুন এবং এটিকে সঠিক কাঠামোয় সংরক্ষণ করুন ("TcTssConstants.TSS_ENCDATA_BIND")। আনবাইন্ডিং (ডিক্রিপ্টিং) এর জন্য সেক আপনি তারপরে টিপিএম আনবাইন্ড ফাংশনটি ব্যবহার করুন এবং আপনার পছন্দসই প্রতিসামগ্রী এনক্রিপশন ফাংশনটিতে সেকটি ব্যবহার করুন। কিছুটা আগে এর জন্য আমার একটি বরং পুরানো কোড বেস রয়েছে, সম্ভবত এটি সহায়তা করে: goo.gl/jV1 ওউ
দুষ্টু

উইকিপিডিয়া, বাইন্ডিং থেকে - টিপিএম বাইন্ড কী ব্যবহার করে ডেটা এনক্রিপ্ট করে, একটি অনন্য আরএসএ কী স্টোরেজ কী থেকে নেমে আসে। en.wikipedia.org/wiki/Trusted_Platform_Module কমান্ড এই জোড়া (TSpi_Data_Bind / TPM_UnBind) মত শোনাচ্ছে আপনার প্রয়োজনের জন্য যথেষ্ট হওয়া উচিত ...
অ্যালেক্স Mazzariol

1
আমার মনে হয় না আপনাকে সরাসরি টিপিএম ব্যবহার করতে হবে। এটি স্ট্যান্ডার্ড সিএনজি / এনক্রিপ্টএক্সএক্সএক্স এপিআই এবং "মাইক্রোসফ্ট প্ল্যাটফর্ম ক্রিপ্টো প্রোভাইডার" (সাম্প্রতিক উইন্ডোজ ওএস প্ল্যাটফর্মগুলির জন্য, এবং যদি হার্ডওয়্যারটি ঠিক আছে এবং অবশ্যই সক্ষম হয়েছে) এর মাধ্যমে সমর্থিত। হতে পারে আপনি এখানে "TPM টি প্ল্যাটফর্ম ক্রিপ্টো জীবিকাদাতা টুলকিট কটাক্ষপাত আছে পারে: research.microsoft.com/en-us/downloads/... : এছাড়াও এই পরীক্ষা tiw2013.cse.psu.edu/slides/...
সাইমন Mourier

ক্রিপ্টপ্রোটেক্টডাটা প্রয়োজনীয়ভাবে টিপিএম ব্যবহার করে না। অন্যদিকে, আপনি যদি টিপিএমের জন্য কোনও বৈধ সিএনজি বা সিএসপি হ্যান্ডেল পেতে পারেন তবে আপনি এটি ক্রিপ্টো ফাংশনে ব্যবহার করতে পারেন।
মাইকেল চোরডাকিস

1
@ b3nj1 না আমি ছিলাম না; কেউই প্রশ্নের উত্তর দিতে সক্ষম হয় নি।
ইয়ান বয়ড

উত্তর:


7

কার্তুজ

এরপরে সমস্ত টিপিএম 1.2 সম্পর্কে 1.2 মনে রাখবেন যে মাইক্রোসফ্টের ভবিষ্যতের সমস্ত উইন্ডোজ সংস্করণগুলির জন্য একটি টিপিএম 2.0 প্রয়োজন। 2.0 প্রজন্মটি মূলত 1.2 এর থেকে পৃথক

টিপিএম ডিজাইনের নীতিগুলির কারণে কোনও এক-লাইন সমাধান নেই। টিপিএমকে সীমিত সংস্থান সহ একটি মাইক্রোকন্ট্রোলার হিসাবে ভাবেন। এটির মূল নকশার লক্ষ্যটি ছিল সস্তা, এখনও নিরাপদ থাকা। সুতরাং টিপিএম সমস্ত যুক্তি ছিন্ন করেছিল যা সুরক্ষিত অপারেশনের জন্য প্রয়োজনীয় ছিল না। সুতরাং একটি টিপিএম কেবল তখনই কাজ করছে যখন আপনার কমপক্ষে আরও কম বা কম ফ্যাটযুক্ত সফ্টওয়্যার রয়েছে, সঠিক ক্রমে প্রচুর কমান্ড জারি করে। এবং এই আদেশগুলির ক্রমগুলি খুব জটিল হয়ে উঠতে পারে। এজন্য টিসিজি একটি ভাল সংজ্ঞায়িত এপিআই দিয়ে টিএসএসকে নির্দিষ্ট করেছে। আপনি যদি জাভা পথে যেতে চান তবে একটি উচ্চ স্তরের জাভা API রয়েছে । আমি সি # / .নেটের জন্য একই জাতীয় প্রকল্প সম্পর্কে অবগত নই

উন্নয়ন

আপনার ক্ষেত্রে আমি আপনাকে আইবিএমের সফটওয়্যার টিপিএম দেখার পরামর্শ দিচ্ছি suggest

প্যাকেজটিতে আপনি খুব খুব দরকারী 3 উপাদান পাবেন:

  • একটি সফ্টওয়্যার টিপিএম এমুলেটর
  • একটি হালকা ওজনের টিএমপি লাইব
  • কিছু বেসিক কমান্ড লাইন ইউটিলিটি

আপনার অগত্যা সফ্টওয়্যার টিপিএম এমুলেটর দরকার নেই, আপনি মেশিনের এইচডাব্লু টিপিএমের সাথেও সংযোগ স্থাপন করতে পারেন। যাইহোক, আপনি জারি করা আদেশগুলি আটকে রাখতে পারেন এবং প্রতিক্রিয়াগুলি দেখতে পারেন, সুতরাং তারা কীভাবে একত্রিত হয় এবং কীভাবে তারা আদেশের নির্দিষ্টকরণের সাথে সামঞ্জস্য করে।

উচ্চস্তর

পূর্বশর্ত:

  1. টিপিএম সক্রিয় করা হয়েছে
  2. টিপিএম ড্রাইভার বোঝাই হয়েছে
  3. আপনি টিপিএমের মালিকানা নিয়েছেন

একটি ব্লব সিল করতে, আপনাকে নিম্নলিখিতগুলি করতে হবে:

  1. একটি কী তৈরি করুন
  2. কী-ব্লবটি কোথাও সংরক্ষণ করুন
  3. কী টিপিএম-এ লোড হয়েছে তা নিশ্চিত করুন
  4. অঙ্কুর সীল

আনসিল করতে আপনার প্রয়োজন:

  1. কী-ব্লব প্রাপ্ত
  2. টিপিএম-তে কী চাপুন
  3. সিল ব্লব unseal

আপনি সুরক্ষিত বাইটগুলি সঞ্চয় করতে আপনার ডেটা কাঠামোটিতে কী-ব্লব সংরক্ষণ করতে পারেন।

আপনার প্রয়োজনীয় টিপিএম কমান্ডগুলির বেশিরভাগই অনুমোদিত are অতএব যেখানে প্রয়োজন সেখানে আপনাকে অনুমোদনের সেশনগুলি স্থাপন করতে হবে। এএফআইআরগুলি বেশিরভাগ ওএসএপি সেশন হয়।

টিপিএম কমান্ড

বর্তমানে আমি একটি ডিবাগ সংস্করণ চালাতে পারি না, সুতরাং আমি আপনাকে সঠিক ক্রমটি সরবরাহ করতে পারি না। সুতরাং আপনি যে কমান্ডগুলি ব্যবহার করতে হবে তার একটি আনর্ডার্ডযুক্ত তালিকা বিবেচনা করুন :

  • TPM_OSAP
  • TPM_CreateWrapKey
  • TPM_LoadKey2
  • TPM_Seal

আপনি যদি বর্তমান পিসিআর মানগুলি পড়তে চান তবে:

  • TPM_PCRRead

মাইক্রোসফ্টের টিপিএম ব্যবহারের জন্য তাদের সি # .NET পরিচালিত গ্রন্থাগার রয়েছে । তাদের কাছে একটি টিপিএম এমুলেটর রয়েছে , যেটি যদি সত্যিকারের টিপিএম উপস্থিত না থাকে তবে পরিচালিত গ্রন্থাগারটি ডিবাগিং বিকল্প হিসাবে সংযুক্ত হতে পারে। তাদের টিপিএম প্ল্যাটফর্ম সরবরাহকারী টুলকিটও রয়েছে, এতে টিপিএম ব্যবহারের জন্য ডকুমেন্টেশন এবং নমুনা কোড রয়েছে। এখন যদি কেবলমাত্র কেউ বাইটগুলি এনক্রিপ্ট করতে কীভাবে টিপিএম ব্যবহার করতে পারে তা বুঝতে পারে।
আয়ান

আপনার প্রথম দুটি লিঙ্ক টিপিএম ২.০ মাত্র are আপনি যদি এগুলি ব্যবহার করতে চান তবে আমি ভয় করি যে আমার কোনও সাহায্য নেই of
স্কোলিটাস

4

বিশ্বস্ত এবং এনক্রিপ্ট করা কীগুলি

বিশ্বস্ত এবং এনক্রিপ্ট করা কীগুলি দুটি নতুন কী ধরণের বিদ্যমান কার্নেল কী রিং পরিষেবাটিতে যুক্ত করা হয়। এই উভয় প্রকারেরই পরিবর্তনশীল দৈর্ঘ্যের প্রতিসাম্য কী এবং উভয় ক্ষেত্রেই সমস্ত কীগুলি কার্নেলের মধ্যে তৈরি করা হয়, এবং ব্যবহারকারীর স্থান দেখায়, সঞ্চয় করে এবং লোড কেবল এনক্রিপ্ট করা ব্লবগুলি। বিশ্বস্ত কীগুলি বৃহত্তর সুরক্ষার জন্য একটি বিশ্বস্ত প্ল্যাটফর্ম মডিউল (টিপিএম) চিপের প্রাপ্যতা প্রয়োজন, অন্যদিকে এনক্রিপ্ট করা কীগুলি যে কোনও সিস্টেমে ব্যবহার করা যেতে পারে। সমস্ত ব্যবহারকারীর স্তরের ব্লবগুলি সুবিধার্থে হেক্স অ্যাস্কেইতে প্রদর্শিত এবং লোড করা হয় এবং এটি অখণ্ডতা যাচাই করা হয়।

বিশ্বস্ত কীগুলি কীগুলি উত্পন্ন করতে এবং সিল করতে উভয়ই একটি টিপিএম ব্যবহার করে। টিপিএমের 2048 বিট আরএসএ কী এর অধীনে কীগুলি সিল করা হয় এবং নির্দিষ্ট পিসিআর (অখণ্ডতা পরিমাপ) মানগুলিতে seচ্ছিকভাবে সিল করা হয় এবং পিসিআর এবং ব্লব অখণ্ডতা যাচাইকরণ মেলে তবে কেবল টিপিএম দ্বারা সিল করা হয়। একটি লোডেড বিশ্বাসযোগ্য কীটি নতুন (ভবিষ্যত) পিসিআর মানগুলির সাথে আপডেট করা যেতে পারে, তাই কীগুলি সহজেই নতুন পিসিআর মানগুলিতে স্থানান্তরিত হয়, যেমন কার্নেল এবং initramfs আপডেট করা হয়। একই কীতে বিভিন্ন পিসিআর মানগুলির অধীনে অনেকগুলি সংরক্ষিত ব্লব থাকতে পারে, তাই একাধিক বুট সহজেই সমর্থিত।

ডিফল্টরূপে, বিশ্বস্ত কীগুলি এসআরকে-এর অধীনে সিল করা হয় যার ডিফল্ট অনুমোদনের মান (20 জিরো) থাকে। এই ট্রাউজার এর উপযোগ সঙ্গে takeownership সময়েও নির্ধারণ করা যেতে পারে: 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সিল করা কীটির একটি আসকি হেক্স অনুলিপি প্রদান করে, এটি স্ট্যান্ডার্ড টিপিএমপোরড_ডাটা ফর্ম্যাটে রয়েছে। নতুন কীগুলির মূল দৈর্ঘ্য সর্বদা বাইটে থাকে। বিশ্বস্ত কীগুলি 32 - 128 বাইট (256 - 1024 বিট) হতে পারে, উপরের সীমাটি সমস্ত প্রয়োজনীয় কাঠামো / প্যাডিং সহ 2048 বিট এসআরকে (আরএসএ) কীলাইনেথের মধ্যে ফিট হতে পারে।

এনক্রিপ্ট করা কীগুলি কোনও টিপিএমের উপর নির্ভর করে না এবং দ্রুত হয়, কারণ তারা এনক্রিপশন / ডিক্রিপশন জন্য AES ব্যবহার করে। নতুন কীগুলি কার্নেল থেকে উত্পাদিত এলোমেলো সংখ্যা থেকে তৈরি করা হয় এবং নির্দিষ্ট 'মাস্টার' কী ব্যবহার করে এনক্রিপ্ট / ডিক্রিপ্ট করা হয়। 'মাস্টার' কীটি কোনও বিশ্বস্ত-কী বা ব্যবহারকারী-কী প্রকার হতে পারে। এনক্রিপ্ট করা কীগুলির প্রধান অসুবিধা হ'ল যদি সেগুলি কোনও বিশ্বস্ত কীতে মূলযুক্ত না হয় তবে তারা কেবল ব্যবহারকারী কীগুলি এনক্রিপ্ট করার মতোই সুরক্ষিত। মাস্টার ব্যবহারকারীর কীটি যথাসম্ভব নিরাপদে কোনও উপায়ে লোড করা উচিত, বুট করার প্রথম দিকে।

এনক্রিপ্ট করা কীগুলির ডিক্রিপ্ট হওয়া অংশে একটি সাধারণ প্রতিসম কী বা আরও জটিল কাঠামো থাকতে পারে। আরও জটিল কাঠামোর বিন্যাসটি অ্যাপ্লিকেশন নির্দিষ্ট, যা 'ফর্ম্যাট' দ্বারা চিহ্নিত করা হয়।

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

বিশ্বস্ত চাবিগুলির প্রাথমিক গ্রাহক হ'ল ইভিএম, যা বুট করার সময় ফাইল মেটাডেটা এইচএমএসি সুরক্ষার জন্য একটি উচ্চ মানের সিমেট্রিক কী প্রয়োজন। একটি বিশ্বস্ত কী ব্যবহারের দৃ strong় গ্যারান্টি সরবরাহ করে যে কোনও ইভিএম কী কোনও ব্যবহারকারীর স্তরের সমস্যার দ্বারা আপস করা হয়নি এবং নির্দিষ্ট বুট পিসিআর মানগুলিতে সিল করা হয়ে গেলে, বুট এবং অফলাইন আক্রমণ থেকে রক্ষা করে। উপরোক্ত বিশ্বস্ত কী "কি.মি. কে" ব্যবহার করে একটি এনক্রিপ্ট করা কী "ইভম" তৈরি এবং সংরক্ষণ করুন:

বিকল্প 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
শেষটি

এগুলি সকলকে একটি কমান্ড লাইন প্রোগ্রামে কল করার মত মনে হচ্ছে। আমি টিপিএম কীভাবে ব্যবহার করব সে সম্পর্কে কোনও কোড দেখছি না।
ইয়ান বয়ড

3

আমি কীভাবে কোনও মেশিনের টিপিএম মডিউল ব্যবহার করে বাইটগুলি এনক্রিপ্ট করতে পারি?

আপনার উদ্দেশ্য এবং পরিস্থিতিতে উপর নির্ভর করে:

  • আপনার কী ধরণের টিপিএম রয়েছে (1-পরিবার বা 2-পরিবার)?
  • টিপিএম কোন রাজ্যে রয়েছে? এটি মালিকানাধীন হয়েছে? এটা বিধান করা হয়েছে?
  • আপনার প্রোগ্রামিং ভাষা কি?
  • আপনি কি এনক্রিপ্ট বা সাইন ইন করতে চান? (এটি বাকি প্রশ্নের থেকে অস্পষ্ট)
  • আপনি এনক্রিপ্ট করতে চান ডেটা কত বড়?
  • আপনি কি একটি প্রতিসম কী বা একটি অসমেট্রিক কী ব্যবহার করতে চান?
  • আপনি কি টিপিএম-এ ইতিমধ্যে বিদ্যমান একটি কী ব্যবহার করতে চান, বা আপনি কিটিটি প্রথমে তৈরি করতে চান?
  • "এনক্রিপ্ট" দ্বারা আপনি সম্ভবত "একটি চাবি মোড়ক" বোঝাতে চান?
  • আপনি কি সিস্টেম কনফিগারেশনে এনক্রিপ্ট করা ডেটা লক করতে চান, যাতে সিস্টেমটি একই কনফিগারেশনে ফিরে আসলেই এটি ডিক্রিপ্ট করা যায়?
  • ডিক্রিপ্টিংয়ের জন্য আপনি কি অনুমোদন চান?
  • সম্ভবত আপনার কিছুতেই এনক্রিপ্ট করার দরকার নেই, বরং টিপিএমের মধ্যে ডেটা সংরক্ষণ করবেন?
  • আপনি যদি টিপিএমের মধ্যে ডেটা সংরক্ষণ করে থাকেন তবে পুনরুদ্ধারের জন্য আপনার কি অনুমোদনের প্রয়োজন, বা সিস্টেমটি একটি নির্দিষ্ট কনফিগারেশনে থাকতে চান?

এর প্রতিটি ব্যবহারের ক্ষেত্রে (এবং আরও রয়েছে) - বা এর সংমিশ্রণ - একটি পৃথক বাস্তবায়ন পথ উপস্থাপন করে। টিপিএমটিকে ক্রিপ্টোগ্রাফিক ডিভাইসের একটি সুইস আর্মি ছুরি হিসাবে ভাবেন: আপনি এটি দিয়ে তেমন কিছু করতে পারবেন না, তবে ব্যবহারের সহজতা সেই বহুমুখিতাটির জন্য ভোগে। প্রশ্নটি এনক্রিপ্ট করা, স্বাক্ষর করতে এবং সিস্টেম কনফিগারেশনে লক করার মধ্যে উত্সাহ বজায় রাখে, তবে এই উত্তরের মূল অংশটি সিল কমান্ডটিকে প্রশ্নটিতে বর্ণিত বেশিরভাগ প্রয়োজনীয়তা আবশ্যক হিসাবে বিবেচনা করবে।

এখন সময় এসেছে এটি আরও একধাপ এগিয়ে নিয়ে যাওয়ার। আমি কিছু ডেটা (যেমন একটি হার্ড ড্রাইভ এনক্রিপশন মাস্টার কী) এনক্রিপ্ট করতে চাই যা কেবলমাত্র স্থানীয় টিপিএম দ্বারা ডিক্রিপ্ট করা যায়।

বাইন্ড কমান্ডটি এটির জন্য (টিপিএম 2 এর জন্য তৈরি কমান্ড দ্বারা বাতিল)। আপনি একটি কী টিপিএম-বাউন্ড কী থেকে উত্পন্ন এবং লোড করুন এবং এটির সাথে এনক্রিপ্ট করুন (বা সরাসরি একটি হার্ডওয়্যার-বাউন্ড কী দিয়ে)। এইভাবে একই টিপিএম অ্যাক্সেসের সাথে ডেটা ডিক্রিপ্ট করা যেতে পারে।

অন্য কথায়, আমি উইন্ডোজ টিপিএম সহ অ্যান্ড্রয়েডের জন্য নীচের ব্লক ডায়াগ্রামে কোয়ালকম ট্রাস্টেড এক্সিকিউশন এনভায়রনমেন্ট (টিইই) প্রতিস্থাপন করতে চাই:

এই পুরো প্রক্রিয়াটির প্রতিলিপি দেওয়া ভাল ধারণা কিনা তা নিশ্চিত নন। একটির জন্য, প্রক্রিয়াটির যে কোনও জায়গায় সাইন ইন অপারেশন ব্যবহার করার দরকার নেই। এটি প্রদর্শিত হবে, যখন অ্যান্ড্রয়েড 5 বিকাশ করা হচ্ছিল, সেই সময় কীস্টোর এপিআই সাইন ইন এবং যাচাইকরণ ক্রিয়াকলাপের মধ্যে সীমাবদ্ধ ছিল । আমার সর্বোত্তম অনুমান যে ডিস্ক এনক্রিপশন দলটি যা করেছে তার সাথে কাজ করার জন্য তাদের যথাসাধ্য চেষ্টা করেছিল এবং একটি অ্যালগরিদম তৈরি করেছিল যার মাধ্যমে একটি মধ্যবর্তী কীগুলির মধ্যে একটি সাইন ইন অপারেশন, একটি স্টোরেজ টি টিই কী ব্যবহার করে উত্পন্ন হয়েছিল , যার ফলে পুরো প্রক্রিয়াটি একটি হার্ডওয়্যার- এ সংযুক্ত করা হয়েছিল- প্লাটফর্মে কেবল বাউন্ড কী উপলব্ধ - সাইন ইন করা তখন একমাত্র উপায় ছিল। তবে, কোনও টিপিএমের অ্যাক্সেস থাকলে নিজেকে এইভাবে বাধা দেওয়ার দরকার নেই যা আপনাকে জানত যে আপনি নিজের প্রয়োজনের চেয়ে আরও বেশি ক্ষমতা অর্জন করেছেন!

আমি বুঝতে পারি যে টিপিএম ডেটা-স্বাক্ষর করে না

এটি মিথ্যা, টিপিএমের উভয় সংস্করণ স্বাক্ষর সমর্থন করে।

(বা যদি এটি হয় তবে এটি কোনও গ্যারান্টি দেয় না যে একই ডেটাতে স্বাক্ষর করলে প্রতিবার একই বাইনারি আউটপুট আসবে)

এর কোন মানে নেই. একই কী দিয়ে একই ডেটাতে সাইন করা একই স্বাক্ষর তৈরি করবে । আপনি উদ্ধৃতি ক্রিয়াকলাপের সাথে সাইন ইন অপারেশনটিকে বিভ্রান্ত করছেন, যা একটি ননজে মিশবে।

যে কারণে আমি "আরএসএ স্বাক্ষর" প্রতিস্থাপন করতে চাই "একটি হার্ডওয়্যার বাউন্ড কী দ্বারা 256-বিট ব্লব এনক্রিপ্ট করা" দিয়ে।

এটি আসলে পছন্দসই বিকল্প হওয়া উচিত, যদিও উভয়ই টিপিএম দিয়েই সম্ভব। উপরে দেখুন.

সমস্যাটি হ'ল টিপিএম প্রোগ্রামিংটি এমএসডিএন-তে সম্পূর্ণ নথিভুক্ত। কোনও ক্রিয়াকলাপ সম্পাদনের জন্য কোনও এপিআই উপলব্ধ নেই।

দুর্ভাগ্যক্রমে নথির অনেক কিছুই নেই isn't উইন এপিআই কয়েকটি টিবিএস ফাংশন সীমাবদ্ধ যা ড্রাইভার থেকে এক স্তরের সরানো।

পরিবর্তে আপনাকে নিজেকে বিশ্বস্ত কম্পিউটিং গ্রুপের সফটওয়্যার স্ট্যাকের একটি অনুলিপি খুঁজে বের করতে হবে (ওরফে টিএসএস), পেডলোড সহ, টিপিএমকে কোন আদেশে প্রেরণ করতে হবে তা কোন আদেশে খুঁজে বের করতে হবে এবং উইন্ডোর Tbsip_Submit_Command ফাংশনটিতে সরাসরি আদেশগুলি জমা দেওয়ার জন্য কল করুন:

আসলে, না, আপনার যদি টিএসএস থাকে তবে আপনাকে ব্যবহার করতে হবে না Tbsip_submit_Command()। এটি টিএসএস করার পুরো বিষয় - নিম্ন স্তরের বিশদ বিবরণ দূরে সরিয়ে দেওয়া হয়।

উইন্ডোজের ক্রিয়া সম্পাদনের জন্য উচ্চ স্তরের কোনও এপিআই নেই।

টিপিএম 1 এর জন্য এখনও সত্য, তবে টিপিএম 2 এর জন্য রয়েছে টিএসএস.এমএসআর

এটি আপনার হার্ড ড্রাইভে SATA I / O কমান্ড জারি করে একটি পাঠ্য ফাইল তৈরি করার চেষ্টা করার নৈতিক সমতুল্য।

সঠিক।

শুধু ট্রাউজারগুলি কেন ব্যবহার করবেন না ... সেই কোডটির সাথে সমস্যাটি হ'ল এটি উইন্ডোজ বিশ্বে পোর্টেবল নয়। উদাহরণস্বরূপ, আপনি এটি ডেল্ফি থেকে ব্যবহার করতে পারবেন না, আপনি এটি সি # থেকে ব্যবহার করতে পারবেন না। এটির প্রয়োজন: ওপেনএসএসএল, পিথ্রেড

এটি স্পষ্ট নয় যে এটি একটি দুর্গম চ্যালেঞ্জ। একটি ইন্টারুপের মাধ্যমে ট্রাউসার্স অ্যাক্সেস করা সমস্ত ডেটা স্ট্রাকচারিং কোডটি পুনরায় লেখার চেয়ে পছন্দনীয়। এছাড়াও, doTSSপ্রশ্ন লেখার সময় ছিল ।

টিপিএম ব্যবহার করে ডেটা এনক্রিপ্ট করার সমতুল্য কোডটি কী? এটিতে সম্ভবত টিপিএম_সিল কমান্ড জড়িত। যদিও আমি মনে করি যে আমি ডেটা সিল করতে চাই না, আমি মনে করি আমি এটি আবদ্ধ করতে চাই:

প্রশ্নটিতে দুটি কমান্ডের মধ্যে পার্থক্য বর্ণনা করে একটি উক্তি রয়েছে, সুতরাং খুব বেশি বিভ্রান্তি হওয়া উচিত নয়। সিলিং বাঁধাইয়ের সমান, অতিরিক্ত সীমাবদ্ধতার সাথে ডেটা আনসিল করার জন্য সিস্টেমের অবস্থাটি একই হওয়া উচিত।

একইভাবে আমি প্রদান করতে সক্ষম হয়েছিল:

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-এর জন্য কাজ করবে না। টিবিএস এপিআই এই দুজনের মধ্যে একমাত্র সাধারণ কোড এবং মাইক্রোসফ্টের কাছে ন্যায়সঙ্গত হতে, এই কারণটি এপিআই কখনই বাড়েনি তার অন্যতম কারণ হতে পারে। উত্তরের মূল অংশটি টিপিএম 1 এর জন্য দুটি কারণে কোড উপস্থাপন করবে:

  • টিপিএম 1 নির্দিষ্ট ধারণাটি নিয়ে প্রশ্নটি লোড করা হয়েছে, সুতরাং টিপিএম 1 ব্যবহার করা লোকেরা তাদের এখানে অনুসন্ধানের জন্য আরও বেশি সম্ভবত নামবে
  • টিপিএম 2 এর জন্য মাইক্রোসফ্ট টিএসএসের প্রয়োগ রয়েছে।

দ্বিতীয়ত, আসুন প্রশ্নটি আরও নির্দিষ্ট করে তুলি। আমি এটিকে পুনরায় ব্যাখ্যা করছি:

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 স্পাকে সরানো হয়েছিল এবং দুটি ক্রিয়েট কমান্ডে একত্রিত হয়েছিল।

কেবলমাত্র টিবিএস ফাংশন সহ ডেটা এনক্রিপ্ট করতে টিপিএম ১.২ সিল কমান্ডটি ব্যবহার করার জন্য সি # কোডটি এখানে রয়েছে (দ্রষ্টব্য: এই কোডটি অন্টিস্টেড এবং ডিবাগিং ছাড়াই কাজ করার সম্ভাবনা নেই) :

[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);
    ...

এখানে আমরা টিপিএমের সাথে কথা বলার জন্য একটি হ্যান্ডেল খোলার জন্য Tbsi_Context_Create () ব্যবহার করিTBS_CONTEXT_PARAMSপরামিতি এক স্বাক্ষরবিহীন 32 বিট int- এ ক্ষেত্র একটি TPM টি 1.2 উদাহরণস্বরূপ সাথে কথা বলতে 1 সেট করে রাখতে হবে, এবং কি আমরা এটা সেট দিয়ে শুধু একটি সি struct হয়।

    byte[] cmdBuf = new byte[768];

এটি টিপিএম পিসি ক্লায়েন্ট স্পেসে সর্বনিম্ন বাফার আকার হিসাবে নির্দিষ্ট করা হয়েছে । এটি আমাদের প্রয়োজনের জন্য এখানে যথেষ্ট পরিমাণে বেশি হবে।

টিপিএম 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.

একটি ওএসএপি সেশনের সময় উত্পন্ন ননস ব্যবহার করে আমাদের এই "গোপন" পরামিতিটি XOR- এনক্রিপ্ট করতে হবে। সিল কমান্ড ইনপুট হ্যান্ডেলগুলির মধ্যে একটি হ'ল ওএসএপি হ্যান্ডেল:

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

সুতরাং আমাদের প্রথমে এই ওএসএপি সেশনটি স্থাপন করা দরকার। ওএসএপি টিপিএম 1.2 স্পেস পার্ট 1 এ । ওএসএপি, বা অবজেক্ট-স্পেসিফিক অথরাইজেশন প্রোটোকলটি এমন একটি ব্যবহারের কেসটি পরিচালনা করার জন্য আবিষ্কার করা হয়েছিল যেখানে আপনি একাধিকবার অনুমোদনের প্রয়োজন হয় এমন টিপিএম অবজেক্ট ব্যবহার করতে চান তবে প্রতিবার অনুমোদন দিতে চান না: পরিবর্তে একটি ওএসএপি সেশন ব্যবহৃত হয়, যা নির্ভর করে "শেয়ারড সিক্রেট" ধারণাটি, যা এইচএমএসি বর্ণিত হয়েছে যা প্রত্যুত্তর আক্রমণগুলি প্রতিরোধের জন্য প্রতিটি পক্ষের উত্পন্ন নরগুলির সাথে অবজেক্ট অনুমোদনের ডেটাগুলিতে মিশ্রিত হয়। সুতরাং এই "অংশীদারি গোপনীয়তা" এই অধিবেশনটিতে কেবল উভয় পক্ষেরই জানা রয়েছে: সেশনটি (ব্যবহারকারী) যে দিকটি শুরু করেছিল এবং যে পক্ষ এটি গ্রহণ করেছে (টিপিএম); এছাড়াও, "ভাগ করা গোপন" একই হতে উভয় পক্ষের অবশ্যই একই অবজেক্টের অনুমোদনের ডেটা থাকতে হবে; অতিরিক্তভাবে, একটি অংশে ব্যবহৃত "ভাগ করা গোপনীয়তা" অন্য সেশনে অবৈধ। অনুমানের এই চিত্রটি প্রক্রিয়াটি বর্ণনা করে:

OSAP

আমরা এই বিশেষ ক্ষেত্রে একাধিক অধিবেশন ব্যবহার করব না (প্রকৃতপক্ষে সিল কমান্ডের সাহায্যে প্যারামিটারটি উপেক্ষা করা হয়েছে!) এবং আমরা যে কীটি ব্যবহার করব সেটি অনুমোদনের প্রয়োজন নেই, তবে দুর্ভাগ্যক্রমে আমরা এখনও ওএসএপি স্থাপনের জন্য বিশেষায় আবদ্ধ are সেশন.

    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 অপারেশন করে

প্রতিটি টিপিএম ১.২ কমান্ডটি এভাবে প্রকাশিত হয়:

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

ট্যাগটি একটি দ্বি-বাইট মান যা নির্দেশ করে যে কোনওটি ইনপুট বা আউটপুট, এবং কমান্ড প্যারামিটারগুলি অনুসরণ করে কোনও প্রমাণীকরণের ডেটা মান রয়েছে কিনা তা নির্দেশ করে। টিপিএম_অ্যাস্যাপের জন্য, ট্যাগটি অবশ্যই টিপিমট্যাগ_আরকিউ_কোম্যান্ড (0x00C1) হিসাবে অনুমান করা উচিত, যার অর্থ "কোনও অনুমোদন ছাড়াই একটি কমান্ড"।

আকার হ'ল একটি চার-বাইট মান যা ট্যাগ এবং আকার নিজেই সহ বাইটে কমান্ডের আকার নির্দিষ্ট করে। একবার আমরা এটির গণনা করার পরে আমরা এই মানটি পরে সেট করব।

কমান্ড কোড একটি চার-বাইট মান যা কমান্ড আইডি হিসাবে সার্ভারগুলি দেয়: এটি টিপিএমকে কীভাবে বাকী কমান্ডটি ব্যাখ্যা করতে পারে তা জানায়। আমাদের কমান্ড কোডটি এখানে টিপিএম_ওএসএপি (0x0000000B)।

পরবর্তী দুটি জিনিস সেট করতে হ'ল সত্তার ধরণ এবং সত্তার মান। যেহেতু আমরা টিপিএমটিতে ইতিমধ্যে বিদ্যমান একটি কী ব্যবহার করতে চাই, আমরা সত্তা টাইপ "এসআরকে" (0x0004) ব্যবহার করব এবং যেহেতু আমরা টিপিএম এর মালিকানাধীন ইতিমধ্যে অনুমানের অধীনে কাজ করছি, এটি অনুমান করা নিরাপদ যে এটি রয়েছে অনুমান অনুযায়ী স্থায়ী হ্যান্ডেল 0x40000000 এর অধীনে থাকা একটি এসআরকে, সুতরাং আমরা আমাদের সত্তা মানের জন্য এই স্থায়ী হ্যান্ডেল মানটি ব্যবহার করব। (এসআরকে "স্টোরেজ রুট কী" বলতে বোঝায় এবং এটি মূল কী যা থেকে অন্যান্য টিপিএম-মালিকানাধীন কীগুলি প্রাপ্ত হয়)

    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 প্রতিক্রিয়া

সুতরাং আমরা ফিরে পেতে:

  • আমাদের প্রধান কমান্ড (সিল) এর সাথে ব্যবহারের জন্য অনুমোদনের হ্যান্ডেল
  • ননসিভেন: টিপএম দ্বারা উত্পাদিত নোটস প্রধান কমান্ডের সাথে ব্যবহার করতে
  • ননসিভেনোস্যাপ: ওএসএপি ননস যা টিপএম_স্যাপ কমান্ড প্রেরণের আগে আমরা আমাদের পক্ষে উত্পন্ন ননসকে পাল্টা ননস বলে। এই দুটি নোকস "ভাগ করা গোপন" তৈরি করতে ব্যবহৃত হবে।

আমরা সেই মানগুলি বের করি এবং সেগুলি ভেরিয়েবলগুলিতে সঞ্চয় করি।

    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

এই পরামিতি বেশিরভাগ গড়ে তুলতে তুচ্ছ হয় তাদের দুটি ছাড়া: encAuthএবংpubAuth । একে একে তাদের তাকান।

encAuth"সিল করা ডেটার জন্য এনক্রিপ্ট করা অুথডাটা"। আমাদের অথডাটা এখানে আগে থেকেই "সুপরিচিত লেখক", তবে হ্যাঁ আমাদের এখনও এটি এনক্রিপ্ট করতে হবে। কারণ আমরা একটি ওএসএপি সেশন ব্যবহার করছি এটি এডিআইপি বা অনুমোদন-ডেটা সন্নিবেশ প্রোটোকলের নীচে এনক্রিপ্ট করা আছে। বৈশিষ্টটি থেকে: "এডিআইপি নতুন সত্ত্বা তৈরি এবং নতুন সত্ত্বা অথডাটা সুরক্ষিত সন্নিবেশের অনুমতি দেয়। নতুন অথডাটা সংক্রমণে একটি ওএসএপি সেশনের ভাগী গোপনের ভিত্তিতে কী সহ এনক্রিপশন ব্যবহার করা হয়।" অতিরিক্তভাবে: "বাধ্যতামূলক এক্সওআর এনক্রিপশন অ্যালগরিদমের জন্য, নির্মাতা ওএসএপি শেয়ারড সিক্রেট এবং একটি সেশন ননসের SHA-1 হ্যাশ ব্যবহার করে একটি এনক্রিপশন কী তৈরি করে The এই এনক্রিপ্ট করা ডেটা তৈরির অনুরোধের সাথে টিপিএমকে প্রেরণ করে।

নিম্নলিখিত চিত্রটি কীভাবে এডিআইপি পরিচালনা করে তা ব্যাখ্যা করে:

ADIP

pubAuth"ইনপুট এবং কীহ্যান্ডেলের জন্য অনুমোদনের সেশনটি হজম হয়।" "ওআইএপি এবং ওএসএপি উদাহরণগুলির জন্য প্যারামিটার ডিক্লারেশনস" -তে অনুচ্ছেদের প্রথম অংশ, উপরের টিপিএম_সেসিলে প্যারামিটার টেবিলটি কীভাবে ব্যাখ্যা করতে হবে তা ব্যাখ্যা করে: "এইচএমএসি # কলামে এইচএমএসি গণনায় ব্যবহৃত প্যারামিটার বিশদ রয়েছে। প্যারামিটার 1 এস, 2 এস ইত্যাদি একত্রিত এবং পারমডিজেস্ট বা আউটপ্রেমডিজাস্টে হ্যাশ করা হয়েছে, দু'টি অনুমোদনের অধিবেশন থাকলে স্পষ্টভাবে 1H1 এবং সম্ভবত 1H2 বলা হয় session প্রথম সেশনের জন্য, 1 এইচ 1, 2 এইচ 1, 3 এইচ 1, এবং 4 এইচ 1 সংযুক্ত এবং HMAC'ed হয়। দ্বিতীয় সেশনের জন্য, 1 এইচ 2, 2 এইচ 2, 3 এইচ 2, এবং 4H2 সংযুক্ত এবং HMAC'ed। " সুতরাং আমাদের প্লেইন টেক্সট, এর আকার, পিসিআর তথ্য আকার,encAuth উপরের এবং টিপিএম_সিজেল অর্ডিনাল এবং তারপরে এইচএমএসি এই দুটি নোট এবং ওএসএপি ব্যবহার করে "চালিয়ে যাওয়া সেশন" বুলিয়ান সহ হ্যাশ করতে হবে "

এগুলি সবগুলিকে একটি ডায়াগ্রামে রেখে দেওয়া:

pubAuth গণনা

আমরা কীভাবে এই কোডটিতে "পিসিআর তথ্য আকার" শূন্যতে সেট করেছি তা লক্ষ্য করুন, যেমন আমরা কেবল কোনও সিস্টেমের স্থিতিতে লক না করেই ডেটা এনক্রিপ্ট করতে চাই। তবে প্রয়োজনে "পিসিআর তথ্য" কাঠামো সরবরাহ করা তুচ্ছ।

    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 একটি টিএসএস কমান্ড, টিপিএম কমান্ড নয়। এর কারণ হ'ল এটির কোনও গোপনীয়তার প্রয়োজন নেই (কেবলমাত্র পাবলিক কী ব্যবহার করা হয়) সুতরাং এটি টিপিএম জড়িত না করেই করা যায়। এটি বিভ্রান্তির কারণ হয়ে দাঁড়ায়, এমনকি যে কমান্ডগুলির কোনও গোপনীয়তার প্রয়োজন নেই সেগুলিও এখন টিপিএম 2 অনুচ্ছেদে অন্তর্ভুক্ত রয়েছে।

আমি টিপিএমের পাবলিক কী দিয়ে কী কী এনক্রিপ্ট করব?

টিপিএম সংস্করণে নির্ভর করে। TPM 1.2 এর জন্য TPM_CreateWrapKey কমান্ড সহ। টিপিএম 2-এর জন্য টিপিএম 2_ক্রিয়েট কমান্ড সহ।

কীভাবে কোনও বিকাশকারী টিপিমের চাবি লক করে?

হয় এটি টিপিএমে তৈরি করুন, বা এটি মোড়ানো, বা অন্য যে কোনও উপলভ্য পদ্ধতি ব্যবহার করুন।

TPM2_Create, একটি HMAC কী নির্দিষ্ট করে

বইয়ের লেখাটি বিভ্রান্তিকর। আপনি এইচএমএসি কী নির্দিষ্ট করে না , আপনি উল্লেখ করেন যে আপনি একটি এইচএমএসি কী চান ।

এইচএমএসি কীটি গোপন নয় তা সত্যতাবোধ করে

না এটা বোঝা যায় না। চাবিটি গোপনীয়।

... কীগুলিকে একটি হার্ডওয়্যার ডিভাইসে সুরক্ষিত রাখার সময় ব্যবহার করুন ... দুর্দান্ত! তুমি এটা কিভাবে কর!?

টিপিমের উভয় সংস্করণের জন্য হয় কী তৈরি করতে বা সেগুলি আমদানি করার জন্য কমান্ড রয়েছে। টিপিএম 1 এর জন্য কেবল একটি মূল কী ছিল - এসআরকে - যা থেকে আপনি মোড়ানো কীগুলি তৈরি করে একটি মূল শ্রেণিবদ্ধ প্রতিষ্ঠা করতে পারেন। টিপিএম 2 দিয়ে আপনার একাধিক প্রাথমিক বা মূলের কী থাকতে পারে।

টিপিএমের কি কোনও হার্ডওয়্যার সীমানার মধ্যে ক্রিপ্টোগ্রাফিক কী উত্পন্ন করার এবং এর গোপনীয়তা রক্ষার ক্ষমতা আছে? তাইলে কীভাবে?

উপরে দেখুন.

অসাধারণ! এটি হ'ল আমার ব্যবহারের ক্ষেত্রে এটি ঘটবে। মাইক্রোসফ্ট এটির ব্যবহারের ক্ষেত্রে টিপিএম ব্যবহার করে। আমি এটা কিভাবে করব!?

সম্ভবত ড্রাইভের ধরণের উপর নির্ভর করে। নন-এসইডি ড্রাইভের ক্ষেত্রে, ড্রাইভ এনক্রিপশন কীটি সম্ভবত একটি টিপিএম কী দ্বারা আবৃত রয়েছে। এসইডি ড্রাইভের ক্ষেত্রে, অ্যাডমিন 1 পাসওয়ার্ড (বা এ জাতীয়) টিপিএম দিয়ে সিল করা হয়।

এন্ডোর্সমেন্ট কী বা ই কে ... কোথাও টিপিএমের ভিতরে একটি আরএসএর ব্যক্তিগত কী। সেই চাবিটি সেখানে লক করা আছে - বাইরের পৃথিবীর দ্বারা আর কখনও দেখা যায় না। আমি চাই টিপিএম তার ব্যক্তিগত কী দিয়ে কিছু স্বাক্ষর করুক (অর্থাত্ এটি ব্যক্তিগত কী দিয়ে এটি এনক্রিপ্ট করুন)।

EK একটি স্বাক্ষর কী নয় - এটি একটি এনক্রিপশন কী। তবে এটি কোনও সাধারণ-উদ্দেশ্যযুক্ত এনক্রিপশন কী নয়: এটি কেবলমাত্র নির্দিষ্ট প্রসঙ্গে ব্যবহার করা যেতে পারে

তবে আমি যা করতে চাই তা হ'ল কিছু তথ্য "সিল" করা seal

উপরে দেখুন.


2

যখন এটা বলে

HMAC কী উল্লেখ করা হচ্ছে

তার অর্থ এই নয় প্রদান HMAC কী - এটা মানে "HMAC চাবি পয়েন্ট যে আপনি ব্যবহার করতে চান"

বইটিতে উল্লিখিত অনুযায়ী টিপিএমগুলি কার্যত সীমাহীন সংখ্যক এইচএমএসি কী ব্যবহার করতে পারে। কোনটি ব্যবহার করতে হবে তা আপনাকে টিপিএমকে জানাতে হবে।


তাই সেখানে সম্ভবত একটি কোড দেখাচ্ছে নমুনা কিভাবে (বিন্দু) নির্দিষ্ট করতে HMAC কী সি # বা অন্য ভাষায় ব্যবহার করা?
চাদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.