Score:2

การคูณแบบไม่ต้องพกพาเทียบกับการคูณใน $GF(2^k)$

ธง tf
Tom

ฉันใช้การคูณแบบพกพาน้อยโดยใช้ชุดคำสั่ง CLMUL นี่เป็นการคูณแบบโมดูโลอย่างง่ายและรวดเร็วในทำนองเดียวกัน แต่การคำนวณผลลัพธ์ mod พหุนามบางตัวยังช้ามาก ฉันทำแบบนี้:

สำหรับ (int ที่ไม่ได้ลงชื่อ i = 32; i-- > 0; )
{
    ถ้า (c & (1L << (i + 32)))
    {
        ค ^= 1L << (i + 32);
        ค ^= (uint64_t)p << ผม;
    }
}

โดยที่ c คือผลิตภัณฑ์พกพาน้อย 64 บิต และ p คือโพลิโนเมียล 32 บิตที่ลดค่าไม่ได้ ฉันไม่แน่ใจว่ารหัสนั้นถูกต้องหรือไม่ เราสามารถทำได้เร็วกว่านี้ไหม

ถ้าฉันคิดถูกที่เรายังคงต้องทำขั้นตอนที่ค่อนข้างแพงนี้หลังจากคำนวณผลคูณแล้ว ฉันก็เริ่มสงสัยว่ามันจะสมเหตุสมผลหรือไม่ที่จะทำการคูณแบบไม่ต้องพกพาเพียงอย่างเดียวเพียงแค่ม็อด $2^k$. ไม่ mod การคูณพกพาน้อย $2^k$ ตัวมันเองยังมีข้อได้เปรียบที่คล้ายคลึงกันกับพหุนาม mod การคูณแบบพกน้อย?

อาจเป็นเวลาคงที่ แต่กระจายอย่างสม่ำเสมอหรือไม่? โดยทั่วไปแล้วการคูณแบบไร้การพกพาเป็นทางเลือกที่เหมาะสมแทนการคูณใน $GF(2^k)$?

kelalaka avatar
in flag
คุณต้องการการรักษาความปลอดภัยช่องทางด้านข้างหรือไม่?
Tom avatar
tf flag
Tom
@kelalaka ฉันไม่แน่ใจ ฉันกำลังทำงานกับ PRNG ตามการคูณ ทางเลือกสำหรับการคูณ mod 2^n ผลิตภัณฑ์พกพาน้อยดูเหมือนจะดีพอ โดยเฉพาะอย่างยิ่งที่ฉันกำลังตัดทอนหรือผสมบิตต่ำ แต่ PRNG นี้มีศักยภาพในการเข้ารหัสเนื่องจากทำงานเป็นแผนที่แบบสุ่มที่ไม่สามารถเปลี่ยนกลับได้ สามารถกำหนดพารามิเตอร์ได้ด้วยพื้นที่ว่างขนาดใหญ่ของคีย์สำหรับสตรีมอิสระ ในกรณีนี้จะเป็นการดีกว่าถ้าเป็นแบบกันช่องสัญญาณด้านข้าง
kelalaka avatar
in flag
เป้าหมายของคุณไม่ชัดเจนทั้งหมด มีหลายวิธีที่จะบรรลุ เคล็ดลับแรกคือเลือก [low weight irreducible polynomial ($p$)](https://www.hpl.hp.com/techreports/98/HPL-98-135.pdf) ตามที่กล่าวไว้ [ที่นี่](https:/ /crypto.stackexchange.com/a/77958/18298)
Score:2
ธง ru

ประการแรก รหัสของคุณเกือบจะถูกต้องสำหรับการคูณ $GF(2^{32})$ โดยมีเงื่อนไขว่า $p$ แสดงถึงค่าสัมประสิทธิ์บิตสำหรับ monomials $x^{31},x^{30},\ldots,x^2,x,1$ ในระดับ 32 พหุนามลดไม่ได้ มีปัญหาเสารั้วว่า $i$ ควรวิ่งจาก 31 ลงไปที่ 0

ตอนนี้ mod การคูณพกพา $2^k$ ไม่สอดคล้องกับการคูณในเขตข้อมูล แต่แทนที่จะเป็นวงแหวน $\mathbb Z[x]/x^k\mathbb Z[x]$. นี่ไม่ใช่วัตถุทางคณิตศาสตร์ที่ดีที่จะทำการเข้ารหัสด้วย ตัวอย่างเช่น บิตต่ำของเอาต์พุตเป็นเพียงฟังก์ชันของบิตต่ำของอินพุตเท่านั้น โดยการเปรียบเทียบคูณด้วย $GF(2^k)$ บิตเอาต์พุตทั้งหมดเป็นฟังก์ชันของบิตอินพุตทั้งหมด คุณสมบัติอีกอย่างของการคูณฟิลด์คือมันกลับด้านได้สำหรับอินพุตที่ไม่ใช่ศูนย์ แต่ในวงแหวนของเรา ฟังก์ชันนี้ไม่สามารถกลับด้านได้สำหรับอินพุตที่ไม่มีการตั้งค่าบิตต่ำ

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

ในแง่ของคำถามก่อนหน้านี้ อาจมีการเพิ่มความเร็วบางอย่างที่เป็นไปได้ หากคุณคำนวณรหัสล่วงหน้าสำหรับ $ค$ รับค่า 1<<32, 1<<33,..., 1<<63 และเก็บค่าเหล่านี้เป็น $x[0],\ldots,x[31]$ จากนั้นรหัสจะถูกแทนที่ด้วย

สำหรับ (int i = 31; i-- >= 0; )
{
    ถ้า (c & (1L << (i + 32)))
        ค ^= x[i];
}
ค %= 1<<32;

หากคุณต้องการบางสิ่งที่เร็วกว่า คุณอาจต้องการดูวิธีอื่นในการแสดงฟิลด์ เช่น ฐานปกติที่เหมาะสมที่สุด หรือ ลอการิทึม Zech

Tom avatar
tf flag
Tom
ใช่ p แทนค่าสัมประสิทธิ์บิตของ monomials อย่างที่คุณเขียน ในกรณีนั้นถูกต้องแล้วใช่ไหม?
Tom avatar
tf flag
Tom
ฉันอ่านเกี่ยวกับอัลกอริทึม Gueron และ Kounavis ซึ่งแนะนำวิธีที่มีประสิทธิภาพโดยใช้ pclmulqdq สำหรับการลด mod 128 บิตใน GCM: https://www.sciencedirect.com/science/article/abs/pii/S002001901000092Xและตอนนี้ชัดเจนมากขึ้นสำหรับฉัน - การคูณ GF โดยเฉพาะอย่างยิ่งหากไม่มี pclmulqdq นั้นมีราคาแพงเมื่อเทียบกับการคูณปกติ แม้ว่า pclmulqdq จะมีราคาแพง แต่ก็ยังต้องการการวนซ้ำ 32 ครั้งสำหรับ mod polynomial ในกรณีของตัวเลข 32 บิต นั่นเป็นเหตุผลที่เราใช้กลอุบายบางอย่างเพื่อทำให้เร็วขึ้น เช่น อัลกอริทึม Gueron และ Kounavis ด้วยพหุนามพิเศษ GF(2^128)

โพสต์คำตอบ

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