ฉันจะเข้ารหัสไบต์โดยใช้โมดูล TPM ของเครื่องได้อย่างไร
CryptProtectData
Windows มี API ที่เรียบง่าย (ค่อนข้าง) เพื่อเข้ารหัส blob โดยใช้CryptProtectData
API ซึ่งเราสามารถรวมฟังก์ชันที่ใช้งานง่าย:
public Byte[] ProtectBytes(Byte[] plaintext)
{
//...
}
รายละเอียดProtectBytes
มีความสำคัญน้อยกว่าแนวคิดที่คุณสามารถใช้ได้อย่างง่ายดาย:
- นี่คือไบต์ที่ฉันต้องการเข้ารหัสโดยคีย์ลับที่อยู่ในไฟล์
System
- คืนหยดที่เข้ารหัสให้ฉัน
หยดที่ส่งคืนเป็นโครงสร้างเอกสารที่ไม่มีเอกสารซึ่งมีทุกอย่างที่จำเป็นในการถอดรหัสและส่งคืนข้อมูลต้นฉบับ (อัลกอริทึมแฮชอัลกอริทึมการเข้ารหัสเกลือลายเซ็น HMAC ฯลฯ )
เพื่อความสมบูรณ์นี่คือตัวอย่างการใช้งานรหัสเทียม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.
}
จะทำเช่นเดียวกันกับ TPM ได้อย่างไร?
รหัสด้านบนมีประโยชน์สำหรับการเข้ารหัสข้อมูลสำหรับเครื่องภายในเท่านั้น ข้อมูลถูกเข้ารหัสโดยใช้System
บัญชีเป็นตัวสร้างคีย์ ( รายละเอียดในขณะที่น่าสนใจไม่สำคัญ ) ผลลัพธ์สุดท้ายคือฉันสามารถเข้ารหัสข้อมูล (เช่นมาสเตอร์คีย์การเข้ารหัสฮาร์ดไดรฟ์) ที่สามารถถอดรหัสได้โดยเครื่องภายในเท่านั้น
ตอนนี้ถึงเวลาที่จะก้าวไปอีกขั้น ฉันต้องการเข้ารหัสข้อมูลบางอย่าง (เช่นคีย์หลักสำหรับการเข้ารหัสฮาร์ดไดรฟ์) ที่สามารถถอดรหัสได้โดย TPM ในเครื่องเท่านั้น กล่าวอีกนัยหนึ่งฉันต้องการแทนที่ Qualcomm Trusted Execution Environment ( TEE ) ในแผนภาพบล็อกด้านล่างสำหรับ Android ด้วย TPM ใน Windows:
หมายเหตุ : ฉันตระหนักดีว่า TPM ไม่ได้ทำการลงนามข้อมูล (หรือถ้าเป็นเช่นนั้นก็ไม่รับประกันว่าการลงนามในข้อมูลเดียวกันจะให้ผลลัพธ์ไบนารีเดียวกันทุกครั้ง) ซึ่งเป็นเหตุผลที่ฉันต้องการจะยินดีที่จะเข้ามาแทนที่"อาร์เอสลงนาม"กับ"การเข้ารหัสหยด 256 บิตพร้อมคีย์ฮาร์ดแวร์ผูกพัน"
แล้วรหัสอยู่ไหน?
ปัญหาคือว่าการเขียนโปรแกรมเป็น TPM ไม่มีเอกสารสมบูรณ์ใน MSDN ไม่มี API สำหรับดำเนินการใด ๆ แต่คุณต้องหาสำเนาของSoftware StackของTrusted Computing Group (aka TSS)ให้หาคำสั่งที่จะส่งไปยัง TPM โดยมี payloads เรียงลำดับตามลำดับและเรียกใช้ฟังก์ชันTbsip_Submit_Commandของ Windowเพื่อส่งคำสั่งโดยตรง:
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 ไปยังฮาร์ดไดรฟ์ของคุณ
ทำไมไม่ใช้แค่กางเกง
ของ Trusted Computing Group (TCG) ได้กำหนด API ของตัวเอง: TCB ซอฟท์แวสแต็ค (TSS) การดำเนินการของ API นี้ถูกสร้างขึ้นโดยคนบางคนและถูกเรียกว่ากางเกงขายาว ผู้ชายแล้วรังเพลิงโครงการที่เป็น Windows
ปัญหาเกี่ยวกับรหัสนั้นคือไม่สามารถพกพาเข้าสู่โลกของ Windows ได้ ตัวอย่างเช่นคุณไม่สามารถใช้งานจาก Delphi คุณไม่สามารถใช้จาก C # ได้ มันต้องการ:
- OpenSSL
- pThread
ฉันแค่ต้องการให้รหัสเข้ารหัสบางอย่างกับ TPM ของฉัน
ข้างต้นCryptProtectData
ไม่ต้องการอะไรนอกจากสิ่งที่อยู่ในตัวฟังก์ชัน
รหัสเทียบเท่าในการเข้ารหัสข้อมูลโดยใช้ TPM คืออะไร? เป็นคนอื่นได้ตั้งข้อสังเกตคุณอาจจะต้องปรึกษาคู่มือ TPM สามและสร้าง blobs ด้วยตัวคุณเอง มันอาจเกี่ยวข้องกับTPM_seal
คำสั่ง แม้ว่าฉันคิดว่าฉันไม่ต้องการปิดผนึกข้อมูล แต่ฉันคิดว่าฉันต้องการผูกมัน:
Binding - เข้ารหัสข้อมูลโดยใช้คีย์การผูก TPM ซึ่งเป็นคีย์ RSA ที่ไม่ซ้ำกันซึ่งสืบเชื้อสายมาจากคีย์จัดเก็บข้อมูล การปิดผนึก - เข้ารหัสข้อมูลในลักษณะเดียวกันกับการผูก แต่นอกจากนี้ยังระบุสถานะที่ต้องอยู่ใน 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
LSA ถูกล็อคใน TPM?
จุดเริ่มต้นของการวิจัย
ฉันไม่รู้ว่าการผูกหมายถึงอะไร แต่เมื่อดู TPM Main - คำสั่งส่วนที่ 3 - ข้อมูลจำเพาะเวอร์ชัน 1.2 มีการกล่าวถึงการผูก :
10.3 TPM_UnBind
TPM_UnBind รับข้อมูลหยดที่เป็นผลลัพธ์ของคำสั่ง Tspi_Data_Bind และถอดรหัสเพื่อส่งออกไปยังผู้ใช้ ผู้โทรต้องอนุญาตให้ใช้คีย์ที่จะถอดรหัสหยดน้ำที่เข้ามา TPM_UnBind ทำงานแบบบล็อกต่อบล็อกและไม่มีความสัมพันธ์ใด ๆ ระหว่างบล็อกหนึ่งกับอีกบล็อกหนึ่ง
สิ่งที่ทำให้สับสนคือไม่มีTspi_Data_Bind
คำสั่ง
ความพยายามในการวิจัย
เป็นเรื่องที่น่าสยดสยองที่ไม่มีใครใส่ใจในการบันทึก TPM หรือการทำงานของมัน ราวกับว่าพวกเขาใช้เวลาทั้งหมดในการคิดหาสิ่งที่ยอดเยี่ยมนี้มาเล่นด้วย แต่ไม่ต้องการจัดการกับขั้นตอนที่เจ็บปวดในการทำให้มันใช้งานได้กับบางสิ่งบางอย่าง
เริ่มต้นด้วยหนังสือฟรี (ตอนนี้) คู่มือปฏิบัติสำหรับ TPM 2.0: การใช้โมดูลแพลตฟอร์มที่เชื่อถือได้ในยุคใหม่ของการรักษาความปลอดภัย :
บทที่ 3 - บทช่วยสอนด่วนเกี่ยวกับ TPM 2.0
TPM สามารถเข้าถึงคีย์ส่วนตัวที่สร้างขึ้นเองได้ดังนั้นจึงสามารถเข้ารหัสคีย์ด้วยคีย์สาธารณะจากนั้นจัดเก็บ Blob ที่เป็นผลลัพธ์ไว้ในฮาร์ดดิสก์ ด้วยวิธีนี้ TPM สามารถเก็บคีย์ไว้ใช้ได้ไม่ จำกัด จำนวน แต่ไม่ต้องเสียที่จัดเก็บข้อมูลภายในอันมีค่า สามารถลบคีย์ที่จัดเก็บไว้ในฮาร์ดดิสก์ได้ แต่ก็สามารถสำรองข้อมูลได้เช่นกันซึ่งดูเหมือนว่านักออกแบบจะชอบการแลกเปลี่ยนที่ยอมรับได้
ฉันจะเข้ารหัสคีย์ด้วยคีย์สาธารณะของ TPM ได้อย่างไร
บทที่ 4 - แอปพลิเคชันที่มีอยู่ซึ่งใช้ TPM
แอปพลิเคชันที่ควรใช้ TPM แต่ไม่ควรใช้
ในช่วงไม่กี่ปีที่ผ่านมาจำนวนแอปพลิเคชันบนเว็บเพิ่มขึ้น การสำรองข้อมูลและการจัดเก็บข้อมูลทางเว็บ ขณะนี้ บริษัท จำนวนมากเสนอบริการดังกล่าว แต่เท่าที่เราทราบไม่มีลูกค้ารายใดสำหรับบริการเหล่านี้ที่อนุญาตให้ผู้ใช้ล็อกคีย์สำหรับบริการสำรองข้อมูลไปยัง TPM หากทำเสร็จแล้วจะเป็นการดีอย่างแน่นอนหากคีย์ TPM ได้รับการสำรองข้อมูลโดยการทำซ้ำบนหลายเครื่อง ดูเหมือนว่าจะเป็นโอกาสสำหรับนักพัฒนา
นักพัฒนาจะล็อคคีย์ของ TPM ได้อย่างไร?
บทที่ 9 - Heirarchies
ใช้กรณี: การจัดเก็บรหัสผ่านเข้าสู่ระบบ
ไฟล์รหัสผ่านทั่วไปจะเก็บแฮชรหัสผ่านที่เค็ม การตรวจสอบประกอบด้วยการใส่เกลือและแฮชรหัสผ่านที่ให้มาและเปรียบเทียบกับค่าที่จัดเก็บไว้ เนื่องจากการคำนวณไม่มีความลับจึงอาจมีการโจมตีไฟล์รหัสผ่านแบบออฟไลน์
กรณีการใช้งานนี้ใช้คีย์ HMAC ที่สร้างโดย TPM ไฟล์รหัสผ่านจะเก็บ HMAC ของรหัสผ่านแบบเค็ม การตรวจสอบประกอบด้วยการใส่เกลือและ HMAC การใส่รหัสผ่านที่ให้มาและเปรียบเทียบกับค่าที่จัดเก็บไว้ เนื่องจากผู้โจมตีออฟไลน์ไม่มีคีย์ HMAC ผู้โจมตีจึงไม่สามารถทำการโจมตีได้ด้วยการคำนวณ
สิ่งนี้สามารถใช้ได้ หาก TPM มีคีย์ HMAC ลับและมีเพียง TPM ของฉันเท่านั้นที่รู้คีย์ HMAC ฉันสามารถแทนที่ "Sign (หรือที่เรียกว่า TPM เข้ารหัสด้วยคีย์ส่วนตัว)" ด้วย "HMAC" แต่ในบรรทัดถัดไปเขากลับตัวเองโดยสิ้นเชิง:
TPM2_Create ระบุคีย์ HMAC
ไม่ใช่ความลับ TPM ถ้าฉันต้องระบุคีย์ HMAC ความจริงที่ว่าคีย์ HMAC ไม่ใช่ความลับก็สมเหตุสมผลเมื่อคุณรู้ว่านี่คือบทเกี่ยวกับยูทิลิตี้การเข้ารหัสที่ TPM มีให้ แทนที่จะต้องเขียน SHA2, AES, HMAC หรือ RSA ด้วยตัวเองคุณสามารถใช้สิ่งที่ TPM วางไว้รอบ ๆ ได้อีกครั้ง
บทที่ 10 - คีย์
ในฐานะอุปกรณ์รักษาความปลอดภัยความสามารถของแอปพลิเคชันในการใช้คีย์ในขณะที่รักษาความปลอดภัยในอุปกรณ์ฮาร์ดแวร์ถือเป็นจุดแข็งที่สุดของ TPM TPM สามารถสร้างและนำเข้าคีย์ที่สร้างจากภายนอกได้ รองรับทั้งคีย์แบบไม่สมมาตรและแบบสมมาตร
ยอดเยี่ยม! คุณจะทำอย่างไรมันได้หรือไม่!?
ตัวสร้างคีย์
จุดแข็งที่ยิ่งใหญ่ที่สุดของ TPM คือความสามารถในการสร้างคีย์การเข้ารหัสและปกป้องความลับภายในขอบเขตฮาร์ดแวร์ ตัวสร้างคีย์ขึ้นอยู่กับตัวสร้างตัวเลขสุ่มของ TPM และไม่อาศัยแหล่งที่มาของการสุ่มจากภายนอก ดังนั้นจึงกำจัดจุดอ่อนที่อาศัยซอฟต์แวร์ที่อ่อนแอซึ่งมีแหล่งเอนโทรปีไม่เพียงพอ
ไม่ TPM มีความสามารถในการสร้างคีย์การเข้ารหัสลับและปกป้องความลับภายในขอบเขตฮาร์ดแวร์? เป็นเช่นนั้นอย่างไร?
บทที่ 12 - การลงทะเบียนการกำหนดค่าแพลตฟอร์ม
PCR สำหรับการอนุญาต
ใช้กรณี: การปิดผนึกการเข้ารหัสฮาร์ดดิสก์ที่สำคัญสำหรับรัฐแพลตฟอร์ม
แอปพลิเคชันการเข้ารหัสแบบเต็มดิสก์มีความปลอดภัยมากกว่าหาก TPM ปกป้องคีย์การเข้ารหัสมากกว่าที่จะเก็บไว้ในดิสก์เดียวกันซึ่งป้องกันด้วยรหัสผ่านเท่านั้น ประการแรกฮาร์ดแวร์ TPM มีการป้องกันการตอก (ดูบทที่ 8 สำหรับคำอธิบายโดยละเอียดของการป้องกันการโจมตีด้วยพจนานุกรม TPM) ทำให้การโจมตีด้วยความดุร้ายในรหัสผ่านไม่สามารถทำได้ คีย์ที่ป้องกันโดยซอฟต์แวร์เท่านั้นที่มีความเสี่ยงต่อรหัสผ่านที่ไม่รัดกุม ประการที่สองคีย์ซอฟต์แวร์ที่เก็บไว้ในดิสก์นั้นขโมยได้ง่ายกว่ามาก นำดิสก์ (หรือข้อมูลสำรองของดิสก์) และคุณจะได้รับกุญแจ เมื่อ TPM ถือกุญแจแพลตฟอร์มทั้งหมดหรืออย่างน้อยก็คือดิสก์และเมนบอร์ดจะต้องถูกขโมย
การปิดผนึกอนุญาตให้คีย์ได้รับการปกป้องไม่เพียง แต่ด้วยรหัสผ่าน แต่โดยนโยบาย นโยบายทั่วไปจะล็อกคีย์ของค่า PCR (สถานะซอฟต์แวร์) ปัจจุบันในขณะปิดผนึก สิ่งนี้จะถือว่าสถานะในการบูตครั้งแรกไม่ถูกบุกรุก มัลแวร์ที่ติดตั้งไว้ล่วงหน้าใด ๆ ที่มีอยู่ในการบูตครั้งแรกจะถูกวัดลงใน PCR ดังนั้นคีย์จะถูกปิดผนึกให้อยู่ในสถานะซอฟต์แวร์ที่ถูกบุกรุก องค์กรที่มีความน่าเชื่อถือน้อยกว่าอาจมีดิสก์อิมเมจมาตรฐานและประทับตราเป็น PCR ที่เป็นตัวแทนของอิมเมจนั้น ค่า PCR เหล่านี้จะถูกคำนวณล่วงหน้าบนแพลตฟอร์มที่น่าเชื่อถือมากกว่า องค์กรที่มีความซับซ้อนยิ่งขึ้นจะใช้ TPM2_PolicyAuthorize และจัดเตรียมตั๋วหลายใบที่อนุญาตชุดค่า PCR ที่เชื่อถือได้ ดูบทที่ 14 สำหรับคำอธิบายโดยละเอียดเกี่ยวกับการอนุญาตนโยบายและการประยุกต์ใช้เพื่อแก้ปัญหา PCRbrittleness
แม้ว่ารหัสผ่านจะสามารถป้องกันคีย์ได้ แต่ก็ยังได้รับความปลอดภัยแม้ว่าจะไม่มีรหัสผ่านคีย์ TPM ก็ตาม ผู้โจมตีสามารถบูตแพลตฟอร์มได้โดยไม่ต้องให้รหัสผ่าน TPMkey แต่ไม่สามารถเข้าสู่ระบบได้หากไม่มีชื่อผู้ใช้และรหัสผ่านของระบบปฏิบัติการ ความปลอดภัยของระบบปฏิบัติการปกป้องข้อมูล ผู้โจมตีสามารถบูตระบบปฏิบัติการทางเลือกได้เช่นจากดีวีดีสดหรือแท่ง USB แทนที่จะใช้จากฮาร์ดไดรฟ์เพื่อหลีกเลี่ยงความปลอดภัยในการเข้าสู่ระบบระบบปฏิบัติการ อย่างไรก็ตามการกำหนดค่าการบูตและซอฟต์แวร์ที่แตกต่างกันนี้จะเปลี่ยนค่า PCR เนื่องจาก PCR ใหม่เหล่านี้ไม่ตรงกับค่าที่ปิดผนึก TPM จะไม่คลายคีย์การถอดรหัสและไม่สามารถถอดรหัสฮาร์ดไดรฟ์ได้
ยอดเยี่ยม! นี่คือกรณีการใช้งานที่ฉันต้องการ นอกจากนี้ยังเป็นกรณีการใช้งานที่ Microsoft ใช้ TPM สำหรับ. ฉันต้องทำอย่างไร!?
ฉันจึงอ่านหนังสือทั้งเล่มและไม่มีประโยชน์อะไรเลย ซึ่งค่อนข้างน่าประทับใจเพราะมัน 375 หน้า คุณสงสัยว่าหนังสือเล่มนี้มีอะไรบ้าง - และเมื่อมองย้อนกลับไปฉันไม่รู้
ดังนั้นเราจึงเลิกใช้คำแนะนำขั้นสุดท้ายในการเขียนโปรแกรม TPM และหันไปหาเอกสารจาก Microsoft แทน:
จากไมโครซอฟท์ TPM แพลตฟอร์มเข้ารหัสลับของผู้ให้บริการเครื่องมือ มันกล่าวถึงสิ่งที่ฉันต้องการทำ:
คีย์การรับรองหรือ EK
EK ได้รับการออกแบบมาเพื่อให้ตัวระบุการเข้ารหัสที่เชื่อถือได้สำหรับแพลตฟอร์ม องค์กรอาจเก็บรักษาฐานข้อมูลของคีย์การรับรองที่เป็นของ TPM ของพีซีทั้งหมดในองค์กรของตนหรือผู้ควบคุมแฟบริกของศูนย์ข้อมูลอาจมีฐานข้อมูลของ TPM ในเบลดทั้งหมด ใน Windows คุณสามารถใช้ผู้ให้บริการ NCrypt ที่อธิบายไว้ในส่วน“ Platform Crypto Provider ใน Windows 8” เพื่ออ่านส่วนสาธารณะของ EK
ที่ไหนสักแห่งใน TPM เป็นคีย์ส่วนตัว RSA กุญแจนั้นถูกล็อคไว้ที่นั่น - โลกภายนอกจะไม่เห็น ฉันต้องการให้ TPM เซ็นชื่อด้วยคีย์ส่วนตัว (เช่นเข้ารหัสด้วยคีย์ส่วนตัว)
ดังนั้นฉันต้องการการดำเนินการขั้นพื้นฐานที่สุดที่อาจมีอยู่:
เข้ารหัสบางอย่างด้วยคีย์ส่วนตัวของคุณ ฉันยังไม่ได้ขอสิ่งที่ซับซ้อนกว่านี้:
- "ปิดผนึก"ตามสถานะ PCR
- สร้างคีย์และจัดเก็บไว้ใน memroy ที่ระเหยหรือไม่ลบเลือน
- สร้างคีย์สมมาตรและพยายามโหลดลงใน TPM
ฉันกำลังขอการดำเนินการขั้นพื้นฐานที่สุดที่ TPM สามารถทำได้ เหตุใดจึงไม่ได้รับข้อมูลเกี่ยวกับวิธีการทำ
ฉันสามารถรับข้อมูลแบบสุ่มได้
ฉันคิดว่าฉันเป็นคนกะล่อนเมื่อฉันบอกว่าการลงนาม 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;
}
สิ่งแฟนซี
ฉันตระหนักดีว่าปริมาณผู้ใช้ TPM นั้นต่ำมาก นั่นคือเหตุผลที่ไม่มีใครใน Stackoverflow มีคำตอบ ดังนั้นฉันไม่สามารถโลภมากเกินไปในการหาวิธีแก้ปัญหาทั่วไปของฉัน แต่สิ่งที่อยากทำจริงๆคือ"ปิดผนึก"ข้อมูลบางส่วน:
- นำเสนอข้อมูลบางอย่างของ TPM (เช่นข้อมูลสำคัญ 32 ไบต์)
- ให้ TPM เข้ารหัสข้อมูลโดยส่งคืนโครงสร้างหยดทึบบางส่วน
- ในภายหลังขอให้ TPM ถอดรหัสหยด
- การถอดรหัสจะใช้ได้ก็ต่อเมื่อการลงทะเบียน PCR ของ TPM เหมือนกับการลงทะเบียนระหว่างการเข้ารหัส
กล่าวอีกนัยหนึ่ง:
Byte[] ProtectBytes_TPM(Byte[] plaintext, Boolean sealToPcr)
{
//...
}
Byte[] UnprotectBytes_TPM(Byte[] protectedBlob)
{
//...
}
Cryptography Next Gen (Cng หรือที่เรียกว่า BCrypt) รองรับ TPM
Cryptography API ดั้งเดิมใน Windows รู้จักกันในชื่อ Crypto API
ตั้งแต่ Windows Vista เป็นต้นมา Crypto API ได้ถูกแทนที่ด้วยCryptography API: Next Generation (รู้จักกันในชื่อBestCryptย่อว่าBCryptเพื่อไม่ให้สับสนกับอัลกอริทึมการแฮชรหัสผ่าน )
Windows มาพร้อมกับผู้ให้บริการ BCrypt สองราย :
- ค่าเริ่มต้นของ Microsoft Primitive Provider (
MS_PRIMITIVE_PROVIDER
) : การใช้งานซอฟต์แวร์เริ่มต้นของสิ่งดั้งเดิมทั้งหมด(การแฮช, การเข้ารหัสแบบสมมาตร, ลายเซ็นดิจิทัล ฯลฯ ) - Microsoft Platform Crypto Provider (
MS_PLATFORM_CRYPTO_PROVIDER
): ผู้ให้บริการที่ให้การเข้าถึง TPM
แพลตฟอร์ม Cryptoผู้ให้บริการไม่ได้รับการบันทึกไว้ใน MSDN แต่มีเอกสารจากเว็บไซต์ที่ 2012 Microsoft การวิจัย:
TPM Platform Crypto-Provider Toolkit
ผู้ให้บริการ Crypto Platform Crypto และ Toolkit ของ TPM มีโค้ดตัวอย่างยูทิลิตี้และเอกสารประกอบสำหรับการใช้ฟังก์ชันที่เกี่ยวข้องกับ TPM ในระบบย่อย Windows 8 ที่อธิบายไว้รวมถึงผู้ให้บริการการเข้ารหัสลับแพลตฟอร์ม Crypto-Next-Gen (CNG) ที่สนับสนุน TPM และวิธีการที่ผู้ให้บริการรับรอง สามารถใช้คุณสมบัติใหม่ของ Windows รองรับทั้งระบบที่ใช้ TPM1.2 และ TPM2.0
ดูเหมือนว่าความตั้งใจของ Microsoft คือการแสดงฟังก์ชันการเข้ารหัสลับ TPM กับMicrosoft Platform Crypto ProviderของCryptography NG API
การเข้ารหัสคีย์สาธารณะโดยใช้ Microsoft BCrypt
ระบุว่า:
- ฉันต้องการทำการเข้ารหัสแบบอสมมาตร RSA (โดยใช้ TPM)
- Microsoft BestCrypt รองรับการเข้ารหัสแบบอสมมาตร RSA
- Microsoft BestCrypt มีผู้ให้บริการ TPM
แนวทางต่อไปอาจเป็นการหาวิธีการลงนามดิจิทัลโดยใช้Microsoft Cryptography Next Gen APIAPI
ขั้นตอนต่อไปของฉันคือการสร้างรหัสเพื่อทำการเข้ารหัสใน BCrypt ด้วยคีย์สาธารณะ RSA โดยใช้ผู้ให้บริการมาตรฐาน ( 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 4F 40 9F D2 D1 69 FB 995D 85 0C 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 A9 AC DF 08 22 04 9D 2B D7 F9 4B 09 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 55publicExponent
: 65537
เมื่อรหัสนั้นทำงานฉันอาจสามารถเปลี่ยนไปใช้ผู้ให้บริการ TPM (MS_PLATFORM_CRYPTO_PROVIDER
) ได้
2/22/2016: และด้วยการที่ Apple ถูกบังคับให้ช่วยถอดรหัสข้อมูลผู้ใช้จึงมีความสนใจในการทำให้ TPM ทำงานที่ง่ายที่สุดที่คิดค้นขึ้นมาเพื่อเข้ารหัสบางสิ่ง
มันเทียบเท่ากับทุกคนที่เป็นเจ้าของรถ แต่ไม่มีใครรู้ว่าจะเริ่มต้นอย่างไร มันสามารถทำสิ่งที่มีประโยชน์และเจ๋ง ๆ ได้ถ้าเพียงเราผ่านขั้นตอนที่ 1ไปได้