Điểm:1

RC6 Phép toán số nguyên theo modulo 32 giữa hai khối 32 bit

lá cờ us

Tôi chưa quen với mật mã học và tôi đang cố viết mã thuật toán RC6 (Rivest cipher 6). Thuật toán yêu cầu cộng, trừ và nhân theo modulo 232. Nếu tôi đang thực hiện các thao tác này giữa hai khối 32 bit thì thao tác này sẽ hoạt động như thế nào?

Mọi trợ giúp sẽ được đánh giá cao vì dường như tôi không thể tìm thấy bất kỳ lời giải thích chi tiết nào về điều này sẽ giúp tôi viết mã về cách thực hiện các thao tác này.

Điểm:1
lá cờ ru

Điều này sẽ phụ thuộc vào ngôn ngữ mà bạn triển khai. Java và các ngôn ngữ giống C khác có kiểu dữ liệu tích hợp sẵn để biểu diễn các số nguyên 32 bit không dấu (đây là lý do tại sao RC6 chọn sử dụng dạng số học này, để triển khai nó trong những ngôn ngữ này tương đối đơn giản). Trong những trường hợp như vậy +, - và * tất cả sẽ tự động hoạt động mod $2^{32}$.

Nếu bạn đang sử dụng python, bạn chỉ cần sử dụng toán tử % trả về phần còn lại mod bất kỳ giá trị nào được chỉ định, ví dụ: a=(b+c)%(2**32).

A. Hersean avatar
lá cờ cr
Số nguyên không dấu không được Java hỗ trợ, ngoại trừ byte. Tuy nhiên, các phép toán +, -, * và dịch chuyển trái hoạt động giống nhau trên các số nguyên có dấu và không dấu.
dave_thompson_085 avatar
lá cờ cn
@A.Hersean: ý bạn là `char`s; Java `byte` đã được ký, điều này gây phiền toái lớn trong mã tiền điện tử mà bạn phải (nhớ) `&0xFF` hoặc `(byte)` trên gần như tất cả các tham chiếu --mặc dù trình biên dịch JIT có thể tối ưu hóa chúng thành thứ gì đó như MOV. b. (Tuy nhiên, các loại thực sự được sử dụng trong máy xếp chồng, `int` và `long`, được định nghĩa là phần bù twos có kích thước chính xác với phần bao quanh, vì vậy, vâng, chúng tương đương với unsigned cho các hoạt động mà bạn liệt kê.)
lá cờ us
@A.Hersean Tôi sẽ sử dụng modulo 2^32 như thế nào trong Verilog?
lá cờ us
@dave_thompson_085 Bạn có biết liệu `&0xFF` có cần thiết trong Verilog hay không và làm cách nào tôi có thể triển khai số học modulo 2^32?
dave_thompson_085 avatar
lá cờ cn
@tomneil: Tôi không biết gì về Verilog và không thể giúp bạn. Nếu điều đó quan trọng đối với câu hỏi của bạn, thì đó phải là _in_ câu hỏi của bạn.
Điểm:0
lá cờ ng

Bạn muốn làm việc modulo $2^{32}$, ngoại trừ số lần thay đổi trong đó phải là modulo $32$.

Sau đây là chung chung và hoạt động trong Python.

mã (kết quả là z) hoạt động
z = (x+y)&0xffffffff bổ sung 32-bit của xy
z = (x-y)&0xffffffff phép trừ 32 bit x dấu trừ y
z = (x*y)&0xffffffff phép nhân 32 bit của xy
z = ((x<<(31&y))|(x>>(31&-y)))&0xffffffff xoay trái 32 bit của x bằng 5 bit thấp của y

Trong C hoặc C++ hiện đại, hãy sử dụng các biến kiểu uint32_t được xác định trong tiêu đề <stdint.h> hoặc <cstdint>và tùy chọn loại bỏ &0xffffffff.

Trong Java, sử dụng các biến kiểu int, gỡ bỏ &0xffffffff, biến đổi >> đến >>>.

lá cờ us
Vì vậy, nếu tôi đang cố gắng thực hiện điều này trong Verilog, tôi cũng sẽ phải sử dụng biến kiểu uint32_t và xác định ? Sau đó, tôi có thể sử dụng các toán tử 32-bit chỉ bằng cách sử dụng x+y, x-y, x*y và ((x>(31&-y))) thông thường?
fgrieu avatar
lá cờ ng
@tomneil: tôi đoán là nếu nó biên dịch, nó sẽ hoạt động và có khả năng nó không quá kém hiệu quả nhờ tối ưu hóa tự động. Nhưng sau đó mối liên hệ duy nhất của tôi với Verilog là một lần giúp ai đó sử dụng nó.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.