ฉันกำลังพยายามทำความเข้าใจเกี่ยวกับ Key Scheduler ที่ใช้ใน RC6 และฉันมีคำถามทั้งหมด 3 ข้อ เดอะ RC6 หน้าวิกิพีเดีย บอกว่าความแตกต่างเพียงอย่างเดียวระหว่าง RC5 และตัวกำหนดตารางเวลาคีย์ RC6 คือมีการสร้างคำเพิ่มเติมจากคีย์ใน RC6 ในแอปพลิเคชันของฉัน ฉันใช้ w=32bits, r=20rounds และ b=16bytes
คำถามแรกของฉันคือสิ่งเหล่านี้เป็นสองวงแยกกันสำหรับลูปหรืออันที่สองสำหรับลูปที่วนซ้ำจาก s-1 ถึง v ภายในอันแรกสำหรับลูปที่วนซ้ำตั้งแต่ 1 ถึง 2r+3
คำถามที่สองของฉันคือเหตุใดเราจึงตั้งค่า A=B=i=j=0 และคำสั่งนี้และ v=3xmax{c,2r+4} ภายในคำสั่งแรกสำหรับลูปหรือไม่
กระดาษ RC6 ยังให้รหัสหลอกนี้:
อินพุต: คีย์ b ไบต์ที่ผู้ใช้ระบุโหลดไว้ล่วงหน้าในอาร์เรย์ c-word L[0... c - 1]
จำนวน r ของรอบ
เอาท์พุต: w-bit แป้นกลม S[0... 2r + 3]
ขั้นตอน: S[0] = Pw
สำหรับ i = 1 ถึง 2r + 3 ทำ:
S[i] = S[i - 1] + Qw
A = B = i = j = 0
v = 3 x สูงสุด{c,2r+4}
สำหรับ s = 1 ถึง v ทำ:
{
A = S[i] = (S[i] + A + B)<<<3
B = L[j] = (L[j] + A + B)<<<(A + B)
ผม = (i + 1)สมัย(2r + 4)
j = (j + 1)modc
}
คำถามที่สามของฉันคือวิธีโหลดเวิร์ดอาร์เรย์ L ด้วยคีย์ 16 ไบต์ของฉันล่วงหน้า กระดาษ RC5 พูดว่า:
ขั้นตอนอัลกอริทึมแรกของการขยายคีย์คือการคัดลอกคีย์ลับ K[0...b-1] ลงในอาร์เรย์ L[0...c-1] ของคำ c=b/u โดยที่ u= w/8 คือ จำนวนไบต์/คำ การดำเนินการนี้ทำในลักษณะที่เป็นธรรมชาติโดยใช้ u คีย์ไบต์ที่ต่อเนื่องกันของ K เพื่อเติมแต่ละคำที่ต่อเนื่องกันใน L ไบต์ลำดับต่ำเป็นไบต์ลำดับสูง ตำแหน่งไบต์ที่ไม่ได้เติมใดๆ ของ L จะเป็นศูนย์
และรหัสหลอกสำหรับการดำเนินการนี้คือ:
สำหรับ i=b-1 ลงไปที่ 0 ทำ:
L[i/u] = (L[i/u]<<<8)+K[i];
เพื่ออธิบายรายละเอียดเกี่ยวกับคำถามที่สาม ถ้าฉันเปลี่ยนจาก 15 เป็น 0 และคุณ = 32/8=4 ฉันจะใช้ทศนิยมเพื่อจัดทำดัชนี L ได้อย่างไร ตัวอย่างเช่น เมื่อฉันอายุ 15 ปี เรามี L[15/4]=(L[15/4]<<<8 + K[i]);