ชุดคีย์

Tink ใช้ Keyset เพื่อเปิดใช้การหมุนเวียนคีย์ คีย์เซ็ตเป็นรายการคีย์1 คีย์ที่มีคีย์หนึ่งเป็นคีย์หลัก 1 รายการ (คีย์ที่ใช้เพื่อลงนามและเข้ารหัสข้อความธรรมดาใหม่) อย่างเป็นทางการ นอกจากนี้ คีย์ในคีย์เซ็ตจะมีรหัสที่ไม่ซ้ำกัน2 และสถานะคีย์ที่ช่วยให้ปิดใช้คีย์ได้โดยไม่ต้องนำคีย์ออกจากชุดคีย์

ชุดคีย์เป็นวิธีหลักที่ผู้ใช้จะเข้าถึงคีย์ได้ (ผ่านชั้นเรียน KeysetHandle) ซึ่งจะช่วยให้มั่นใจได้ว่าผู้ใช้ทุกคนจะมีโค้ดสำหรับจัดการคีย์หลายรายการพร้อมกัน สำหรับผู้ใช้ส่วนใหญ่ของวิทยาการเข้ารหัส การจัดการคีย์หลายคีย์เป็นสิ่งจำเป็น กล่าวคือต้องเปลี่ยนคีย์ได้ (เช่น คีย์เก่าอาจรั่วไหล) และแทบจะไม่มีคำว่า "สลับไปยังคีย์ถัดไป" แบบอะตอมมิก ซึ่งนำมาใช้กับเครื่องที่โค้ดทำงานและข้อความเข้ารหัสทั้งหมดได้ทันที ดังนั้น ผู้ใช้ต้องเขียนโค้ดที่ ทำงานเมื่อคีย์หนึ่งเปลี่ยนจากคีย์หนึ่งไปเป็นคีย์ต่อไป

ตัวอย่าง: AEAD

ลองใช้ชุดคีย์ AEAD ซึ่งมีหลายคีย์สำหรับ AEAD เบื้องต้น ตามที่อธิบายไว้ก่อนหน้านี้ แต่ละคีย์จะระบุฟังก์ชัน 2 รายการโดยไม่ซ้ำกัน ได้แก่ \(\mathrm{Enc}\) และ \(\mathrm{Dec}\)ตอนนี้ชุดคีย์ยังระบุฟังก์ชันใหม่ 2 ฟังก์ชันดังนี้ \(\mathrm{Enc}\) และ \(\mathrm{Dec}\) \(\mathrm{Enc}\) เพียงเทียบเท่ากับฟังก์ชัน \(\mathrm{Enc}\) ของคีย์หลักของชุดคีย์ ในขณะที่ฟังก์ชัน \(\mathrm{Dec}\) จะพยายามถอดรหัสด้วยคีย์ทั้งหมดโดยเรียงตามลำดับ (ดูด้านล่างเพื่อดูว่า Tink ปรับปรุงประสิทธิภาพของการทำงานนี้อย่างไร)

สิ่งที่น่าสนใจคือ Keyets คือคีย์แบบเต็ม ว่าเป็นคำอธิบายฟังก์ชัน \(\mathrm{Enc}\) และ\(\mathrm{Dec}\) ที่ใช้ไปอย่างสมบูรณ์ ซึ่งหมายความว่าผู้ใช้จะเขียนคลาสซึ่งจะใช้เป็นอินพุต KeysetHandle เพื่อแสดงแนวคิดว่าคลาสต้องมีคำอธิบายออบเจ็กต์ที่สมบูรณ์ \(\mathrm{Enc}\) และ \(\mathrm{Dec}\) ทำงานได้อย่างถูกต้อง วิธีนี้ช่วยให้ผู้ใช้เขียน API ที่จะสื่อสารได้ว่า หากต้องการใช้คลาสนี้ คุณต้องให้คำอธิบายเกี่ยวกับคลาสการเข้ารหัสลับพื้นฐาน

การหมุนเวียนคีย์

ลองพิจารณาผู้ใช้ Tink เขียนโปรแกรมที่จะรับชุดคีย์จาก KMS ก่อน แล้วจึงสร้างออบเจ็กต์ AEAD จากชุดคีย์นี้ และสุดท้ายใช้ออบเจ็กต์นี้เพื่อเข้ารหัสและถอดรหัสข้อความเข้ารหัส

ผู้ใช้ดังกล่าวจะเตรียมพร้อมสำหรับการหมุนเวียนคีย์โดยอัตโนมัติ และจะสลับอัลกอริทึมในกรณีที่ตัวเลือกปัจจุบันไม่เป็นไปตามมาตรฐานอีกต่อไป

แต่เราต้องระมัดระวังสักหน่อยเมื่อใช้การหมุนเวียนคีย์ดังกล่าว อย่างแรก KMS ควรเพิ่มคีย์ใหม่ลงในชุดคีย์ (แต่ยังไม่ได้ตั้งเป็นคีย์หลัก) จากนั้นให้เปิดตัวชุดคีย์ใหม่กับไบนารีทั้งหมด เพื่อให้ไบนารีทั้งหมดที่ใช้คีย์ชุดนี้มีคีย์ใหม่ล่าสุดในชุดคีย์ หลังจากนั้นควรทำให้คีย์ใหม่เป็นคีย์หลักเท่านั้น และชุดคีย์ที่ได้จะเผยแพร่ไปยังไบนารีทั้งหมดอีกครั้งโดยใช้ชุดคีย์

ตัวระบุหลักในข้อความเข้ารหัส

ลองดูตัวอย่างชุดคีย์ AEAD อีกครั้ง หากทำแบบไร้เดียงสา การถอดรหัสข้อความเข้ารหัสต้องอาศัย Tink เพื่อพยายามถอดรหัสด้วยคีย์ทั้งหมดในชุดคีย์ เนื่องจากไม่มีทางรู้ว่ามีการใช้คีย์ใดในการเข้ารหัสชุดคีย์ ซึ่งอาจทำให้มีค่าใช้จ่ายในประสิทธิภาพสูง

ด้วยเหตุนี้ Tink จึงอนุญาตให้ใส่คำนำหน้าข้อความเข้ารหัสด้วยสตริงขนาด 5 ไบต์ที่ดึงมาจากรหัสได้ ตามปรัชญาของ "คีย์แบบเต็ม" ข้างต้น คำนำหน้านี้ เป็นส่วนหนึ่งของคีย์ และข้อความเข้ารหัสทั้งหมดที่เคยมาจากคีย์นี้ควรมีคำนำหน้านี้ เมื่อผู้ใช้สร้างคีย์ ผู้ใช้เลือกได้ว่าจะให้คีย์ใช้คำนำหน้าดังกล่าวหรือไม่ หรือไม่ควรใช้รูปแบบข้อความเข้ารหัสดังกล่าว

เมื่อคีย์อยู่ในชุดคีย์ Tink จะประมวลผลแท็กนี้จากรหัสที่มีในคีย์เซ็ต ข้อเท็จจริงที่ว่ารหัสไม่ซ้ำกัน2ภายในชุดคีย์หมายความว่าแท็กไม่ซ้ำกัน ดังนั้นหากใช้เฉพาะคีย์ที่ติดแท็ก ประสิทธิภาพจะไม่หายไปเมื่อเทียบกับการถอดรหัสด้วยคีย์เดียว กล่าวคือ Tink ต้องการแค่ลองใช้คีย์ใดคีย์หนึ่งเท่านั้นเมื่อถอดรหัส

แต่เนื่องจากแท็กเป็นส่วนหนึ่งของคีย์ จึงหมายความว่าคีย์จะอยู่ในชุดคีย์ได้เมื่อมีรหัสเฉพาะเพียงรหัสเดียว ซึ่งจะมีนัยบางอย่างเมื่ออธิบายการใช้งานออบเจ็กต์หลักในภาษาต่างๆ


  1. บางส่วนของ Tink จะยังถือว่า Keyset เป็นชุด แต่ควรเปลี่ยนการตั้งค่านี้ เหตุผลก็คือลำดับโดยทั่วไป มีความสำคัญ เช่น พิจารณาวงจรทั่วไปของการหมุนเวียนคีย์ด้วย Aead ขั้นแรก จะมีการเพิ่มคีย์ใหม่ลงในชุดคีย์ คีย์นี้ยังไม่ได้เป็นคีย์หลัก แต่มีการใช้งานอยู่ ชุดคีย์ใหม่นี้มีผลกับไบนารีทั้งหมด เมื่อไบนารีทั้งหมดรู้คีย์ใหม่แล้ว คีย์จะเป็นคีย์หลัก (เฉพาะตรงนี้ที่ใช้คีย์นี้ปลอดภัยแล้ว) ในขั้นตอนที่ 2 นี้ การหมุนเวียนคีย์จำเป็นต้องทราบคีย์ล่าสุดที่เพิ่ม

  2. สำหรับความเข้ากันได้กับไลบรารีภายในของ Google Tink อนุญาตให้ใช้ชุดคีย์ที่ใช้ซ้ำถึงรหัสได้ การสนับสนุนนี้จะถูกนำออกในอนาคต