Puncte:1

RC6 Operații întregi în modulo 32 între două blocuri de 32 de biți

drapel us

Sunt nou în criptografie și încerc să codific algoritmul RC6 (Rivest cipher 6). Algoritmul necesită adunare, scădere și înmulțire în modulo 232. Dacă efectuez aceste operații între două blocuri de 32 de biți, cum ar funcționa?

Orice ajutor ar fi apreciat pentru că nu găsesc nicio explicație detaliată despre asta, care să mă ajute să scriu cod despre cum să execut aceste operațiuni.

Puncte:1
drapel ru

Acest lucru va depinde de limbajul în care implementați. Java și alte limbaje asemănătoare C au un tip de date încorporat pentru a reprezenta numere întregi nesemnate pe 32 de biți (de aceea RC6 a ales să folosească această formă de aritmetică, astfel încât implementarea sa în aceste limbi este relativ simplu). În astfel de cazuri +, - și * toate funcționează automat mod $2^{32}$.

Dacă utilizați python, puteți utiliza pur și simplu operatorul % care returnează resturile mod indiferent de valoarea specificată, de ex. a=(b+c)%(2**32).

A. Hersean avatar
drapel cr
Numerele întregi nesemnate nu sunt acceptate de Java, cu excepția octeților. Cu toate acestea, operațiile +, -, * și deplasarea la stânga se comportă la fel pe numere întregi cu semn și fără semn.
dave_thompson_085 avatar
drapel cn
@A.Hersean: te referi la `char`s; Java `byte` este semnat, ceea ce este o mare pacoste în codul cripto, unde trebuie (nu uitați să) `&0xFF` sau `(byte)` pe aproape toate referințele --deși compilatorul JIT le poate optimiza în ceva de genul MOV. B. (Dar tipurile folosite cu adevărat în mașina de stivă, `int` și `long`, sunt definite ca fiind exact-size twos-complement cu wraparound, deci da, sunt echivalente cu unsigned pentru operațiunile pe care le enumerați.)
drapel us
@A.Hersean Cum aș folosi modulo 2^32 în Verilog?
drapel us
@dave_thompson_085 Știți dacă `&0xFF` este necesar în Verilog și cum pot implementa aritmetica modulo 2^32?
dave_thompson_085 avatar
drapel cn
@tomneil: Nu știu nimic despre Verilog și nu te pot ajuta. Dacă acest lucru este important pentru întrebarea dvs., ar trebui să fie _în_ întrebarea dvs.
Puncte:0
drapel ng

Vrei să lucrezi modulo $2^{32}$, cu excepția numărului de deplasări, unde ar trebui să fie modulo $32$.

Următoarele sunt generice și funcționează în Python.

cod (rezult z) Operațiune
z = (x+y)&0xffffffff Adăugarea pe 32 de biți a X și y
z = (x-y)&0xffffffff Scădere pe 32 de biți X minus y
z = (x*y)&0xffffffff Înmulțirea pe 32 de biți a X și y
z = ((x<<(31&y))|(x>>(31&-y))))&0xffffffff Rotație la stânga pe 32 de biți a X cu 5 biți scăzut de y

În C sau C++ modern, utilizați variabile de tip uint32_t definite în antet <stdint.h> sau <cstdint>și, opțional, eliminați &0xffffffff.

În Java, utilizați variabile de tip int, eliminați &0xffffffff, Schimbare >> la >>>.

drapel us
Deci, dacă aș încerca să fac asta în Verilog, ar trebui, de asemenea, să folosesc variabila de tip uint32_t și să definesc ? Apoi aș putea folosi operatorii pe 32 de biți folosind doar x+y, x-y, x*y și ((x>(31&-y)))?
fgrieu avatar
drapel ng
@tomneil: bănuiesc că dacă se compilează, va funcționa și există șansa să nu fie extrem de ineficient datorită optimizărilor automate. Dar atunci singurul meu contact cu Verilog este să ajut o dată pe cineva care îl folosește.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.