Score:1

การดำเนินการ RC6 Integer ในโมดูโล 32 ระหว่างบล็อก 32 บิตสองบล็อก

ธง us

ฉันยังใหม่กับการเข้ารหัสและฉันกำลังพยายามเข้ารหัสอัลกอริทึม RC6 (Rivest cipher 6) อัลกอริทึมต้องการการบวก การลบ และการคูณในโมดูโล 232. หากฉันดำเนินการเหล่านี้ระหว่างบล็อก 32 บิตสองบล็อก สิ่งนี้จะทำงานอย่างไร

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมเพราะฉันไม่สามารถหาคำอธิบายโดยละเอียดเกี่ยวกับเรื่องนี้ได้ ซึ่งจะช่วยฉันเขียนโค้ดเกี่ยวกับวิธีการดำเนินการเหล่านี้

Score:1
ธง ru

สิ่งนี้จะขึ้นอยู่กับภาษาที่คุณนำไปใช้ Java และภาษา C-like อื่นๆ มีชนิดข้อมูลในตัวเพื่อแสดงจำนวนเต็ม 32 บิตที่ไม่ได้ลงนาม (นี่คือเหตุผลที่ RC6 เลือกใช้รูปแบบการคำนวณนี้ เพื่อให้การใช้งานใน ภาษาเหล่านี้ค่อนข้างตรงไปตรงมา) ในกรณีเช่นนี้ +, -, และ * ม็อดทั้งหมดจะทำงานโดยอัตโนมัติ $2^{32}$.

หากคุณใช้ python คุณสามารถใช้ตัวดำเนินการ % ซึ่งส่งคืน mod ที่เหลือตามค่าที่ระบุ เช่น ก=(b+c)%(2**32).

A. Hersean avatar
cr flag
Java ไม่สนับสนุนจำนวนเต็มที่ไม่ได้ลงนาม ยกเว้นสำหรับไบต์ อย่างไรก็ตาม การดำเนินการ +, -, * และการเลื่อนไปทางซ้ายจะทำงานเหมือนกันกับจำนวนเต็มที่มีเครื่องหมายและไม่ได้ลงนาม
dave_thompson_085 avatar
cn flag
@A.Hersean: คุณหมายถึง `char`s; Java `byte` ได้รับการเซ็นชื่อ ซึ่งสร้างความรำคาญอย่างมากในโค้ด crypto ที่คุณต้อง (อย่าลืม) `&0xFF` หรือ `(byte)` ในการอ้างอิงเกือบทั้งหมด แม้ว่าคอมไพเลอร์ JIT อาจปรับสิ่งเหล่านี้ให้เป็น MOV ข. (แต่ประเภทที่ใช้จริงๆ ในเครื่องสแต็ก `int' และ 'long' นั้นถูกกำหนดให้เป็น twos ขนาดที่แน่นอน - เสริมด้วยการพันรอบ ดังนั้น ใช่ พวกมันเทียบเท่ากับ unsigned สำหรับการดำเนินการที่คุณแสดงรายการ)
us flag
@A.Hersean ฉันจะใช้โมดูโล 2^32 ใน Verilog ได้อย่างไร
us flag
@dave_thompson_085 คุณรู้หรือไม่ว่าจำเป็นต้องใช้ `&0xFF` ใน Verilog และฉันจะใช้เลขคณิตโมดูโล 2^32 ได้อย่างไร
dave_thompson_085 avatar
cn flag
@tomneil: ฉันไม่รู้อะไรเลยเกี่ยวกับ Verilog และไม่สามารถช่วยคุณได้ หากนั่นสำคัญสำหรับคำถามของคุณ ก็ควรเป็น _in_ คำถามของคุณ
Score:0
ธง ng

คุณต้องการทำงานแบบโมดูโล $2^{32}$ยกเว้นจำนวนกะที่ควรเป็นโมดูโล $32$.

ข้อมูลต่อไปนี้เป็นข้อมูลทั่วไปและทำงานใน Python

รหัส (ผลลัพธ์ใน ซี) การดำเนินการ
z = (x+y)&0xffffffff การเพิ่ม 32 บิตของ x และ
z = (x-y)&0xffffffff การลบ 32 บิต x ลบ
z = (x*y)&0xffffffff การคูณ 32 บิตของ x และ
z = ((x<<(31&y))|(x>>(31&-y)))&0xffffffff การหมุนซ้าย 32 บิตของ x โดยต่ำ 5 บิตของ

ใน C หรือ C++ สมัยใหม่ ให้ใช้ตัวแปรประเภท uint32_t กำหนดไว้ในส่วนหัว <stdint.h> หรือ <cstdint>และเลือกที่จะลบไฟล์ &0xffffffff.

ใน Java ใช้ตัวแปรประเภท นานาชาติ, ลบ &0xffffffff, เปลี่ยน >> ถึง >>>.

us flag
ดังนั้นหากฉันพยายามทำสิ่งนี้ใน Verilog ฉันจะต้องใช้ตัวแปรประเภท uint32_t และกำหนด ? จากนั้นฉันสามารถใช้ตัวดำเนินการ 32 บิตได้โดยใช้ x+y ธรรมดา, x-y, x*y และ ((x>(31&-y)))?
fgrieu avatar
ng flag
@tomneil: ฉันเดาว่าถ้ามันคอมไพล์ มันจะใช้งานได้ และมีโอกาสที่จะไม่ไร้ประสิทธิภาพอย่างไร้เหตุผลด้วยการเพิ่มประสิทธิภาพอัตโนมัติ แต่การติดต่อ Verilog เพียงอย่างเดียวของฉันก็คือการช่วยคนที่ใช้มัน

โพสต์คำตอบ

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