Thời gian cho một số TRÀ!


8

Giới thiệu

Một thời gian trước, tôi tình cờ tìm thấy thuật toán mã hóa nhỏ ( TEA ) và từ đó tôi đã khuyến nghị nó bất cứ khi nào các thuộc tính bảo mật mật mã đặc biệt là không cần thiết và việc tự thực hiện là một yêu cầu.
Bây giờ, chúng tôi muốn lấy tên thuật toán mã hóa * tiny * theo nghĩa đen và nhiệm vụ của bạn sẽ là thực hiện thuật toán mã hóa nhỏ nhất !

Sự chỉ rõ

Đầu vào

Đầu vào là danh sách 8 byte (hoặc ngôn ngữ của bạn tương đương), đây là bản rõ và một danh sách khác gồm 16 byte (hoặc ngôn ngữ của bạn tương đương), đây là khóa .
Chuyển đổi đầu vào từ thập phân, thập lục phân, bát phân hoặc nhị phân được cho phép.
Đọc 1 số nguyên 64 bit, 2 32 bit hoặc 4 số 16 bit làm đầu ra (tùy chọn dưới dạng danh sách) được cho phép (đối với bản rõ, nhân đôi số cho khóa)

Đầu ra

Đầu ra là một danh sách 8 byte (hoặc ngôn ngữ của bạn tương đương), đây là bản mã .
Chuyển đổi đầu ra thành thập phân, thập lục phân, bát phân hoặc nhị phân được cho phép, nhưng không bắt buộc.
Viết 1 số nguyên 64 bit, 2 32 bit hoặc 4 số 16 bit làm đầu ra (tùy chọn dưới dạng danh sách) được cho phép.

Phải làm sao

Nhiệm vụ của bạn là thực hiện hướng mã hóa của thuật toán mã hóa nhỏ ( TEA ), lưu ý XTEA và XXTEA là các thuật toán khác.
Wikipedia có một ví dụ về mã C và một danh sách các tài liệu tham khảo cho một số triển khai bằng các ngôn ngữ khác, đây là mô tả ban đầu (PDF) .

Chính thức hơn:

Let k1, k2, k3, k4, v1, v2, sum be unsigned 32-bit integers.
(k1,k2,k3,k4) <- key input
(v1,v2) <- plaintext input
sum <- 0
repeat 32 times:
    sum <- ( sum + 0x9e3779b9 ) mod 2^32
    v0  <- ( v0 + ( ((v1 << 4) + k0) XOR (v1 + sum) XOR ((v1 >> 5) + k1) ) ) mod 2^32
    v1  <- ( v1 + ( ((v0 << 4) + k2) XOR (v0 + sum) XOR ((v0 >> 5) + k3) ) ) mod 2^32
output <- (v0,v1)

where 0x9e3779b9 is a hexadecimal constant and
"<<" denotes logical left shift and ">>" denotes logical right shift.

Trường hợp góc tiềm năng

\0là một ký tự hợp lệ và bạn không được rút ngắn đầu vào cũng như đầu ra.
Mã hóa số nguyên được coi là ít endian (ví dụ như những gì bạn có thể đã có).

Ai thắng?

Đây là môn đánh gôn, vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng!
Quy tắc tiêu chuẩn áp dụng tất nhiên.

Các trường hợp thử nghiệm

Các vectơ kiểm tra đã được tạo bằng cách sử dụng ví dụ mã Wikipedia C.

Key: all zero (16x \0)
Plaintext -> Ciphertext (all values as two 32-bit hexadecimal words)
00000000 00000000 -> 41ea3a0a 94baa940
3778001e 2bf2226f -> 96269d3e 82680480
48da9c6a fbcbe120 -> 2cc31f2e 228ad143
9bf3ceb8 1e076ffd -> 4931fc15 22550a01
ac6dd615 9c593455 -> 392eabb4 505e0755
ebad4b59 7b962f3c -> b0dbe165 cfdba177
ca2d9099 a18d3188 -> d4641d84 a4bccce6
b495318a 23a1d131 -> 39f73ca0 bda2d96c
bd7ce8da b69267bf -> e80efb71 84336af3
235eaa32 c670cdcf -> 80e59ecd 6944f065
762f9c23 f767ea2c -> 3f370ca2 23def34c

Dưới đây là một số vectơ kiểm tra tự tạo với các khóa khác không:

format: ( 4x 32-bit word key , 2x 32-bit word plaintext ) -> ( 2x 32-bit word ciphertext )
(all in hexadecimal)

( 4300e123 e39877ae 7c4d7a3c 98335923 , a9afc671 79dcdb73 ) -> ( 5d357799 2ac30c80 )
( 4332fe8f 3a127ee4 a9ca9de9 dad404ad , d1fe145a c84694ee ) -> ( a70b1d53 e7a9c00e )
( 7f62ac9b 2a0771f4 647db7f8 62619859 , 618f1ac2 67c3e795 ) -> ( 0780b34d 2ca7d378 )
( 0462183a ce7edfc6 27abbd9a a634d96e , 887a585d a3f83ef2 ) -> ( d246366c 81b87462 )
( 34c7b65d 78aa9068 599d1582 c42b7e33 , 4e81fa1b 3d22ecd8 ) -> ( 9d5ecc3b 947fa620 )
( f36c977a 0606b8a0 9e3fe947 6e46237b , 5d8e0fbe 2d3b259a ) -> ( f974c6b3 67e2decf )
( cd4b3820 b2f1e5a2 485dc7b3 843690d0 , 48db41bb 5ad77d7a ) -> ( b4add44a 0c401e70 )
( ee2744ac ef5f53ec 7dab871d d58b3f70 , 70c94e92 802f6c66 ) -> ( 61e14e3f 89408981 )
( 58fda015 c4ce0afb 49c71f9c 7e0a16f0 , 6ecdfbfa a705a912 ) -> ( 8c2a9f0c 2f56c18e )
( 87132255 41623986 bcc3fb61 7e6142ce , 9d0eff09 55ac6631 ) -> ( 8919ea55 c7d430c6 )

1
Khi tôi thử mã Wikipedia C, sử dụng khóa 0 và văn bản gốc, tôi đã nhận được hàng thứ hai của bản rõ của bạn dưới dạng bản mã của mình ...
Neil

Vâng, hai người đầu tiên làm bây giờ; Tôi quá lười để thử phần còn lại.
Neil

@Neil, đó là điều tuyệt vời về tiền điện tử: Cơ hội rất cao, nếu một người kiểm tra tầm thường (dựa trên 0) và vượt qua người kiểm tra không cần thiết, tất cả các vectơ kiểm tra sẽ vượt qua :)
SEJPM

2
Tôi đề nghị bạn thêm một số trường hợp thử nghiệm với khóa khác không.
Dennis

@Dennis những người bây giờ có thể được tìm thấy ở dưới cùng của câu hỏi :)
SEJPM

Câu trả lời:


5

JavaScript (ES6), 122 118 114 113 byte

f=
(v,w,k,l,m,n)=>{for(s=0;s<84e9;v+=w*16+k^w+s^(w>>>5)+l,w+=v*16+m^v+s^(v>>>5)+n)s+=0x9e3779b9;return[v>>>0,w>>>0]}
;
<div oninput="[r0.value,r1.value]=f(...[v0,v1,k0,k1,k2,k3].map(i=>parseInt(i.value,16))).map(i=>(i+(1<<30)*4).toString(16).slice(1))">
Plain 0: <input id=v0><br>
Plain 1: <input id=v1><br>
Key 0: <input id=k0><br>
Key 1: <input id=k1><br>
Key 2: <input id=k2><br>
Key 3: <input id=k3><br>
</div>
Cipher 0: <input id=r0 readonly><br>
Cipher 1: <input id=r1 readonly><br>

Lưu ý: Sử dụng số học endian nhỏ. Chấp nhận và trả về các giá trị nguyên 32 bit không dấu. Chỉnh sửa: Đã lưu 4 byte bằng cách sử dụng phép nhân thay vì dịch chuyển trái. Đã lưu 4 byte bằng cách thử nghiệm sdo đó tránh một biến vòng lặp riêng biệt. Đã lưu 1 byte bằng cách di chuyển +=s bên trong for.


Tại sao không sử dụng eval với lợi nhuận ngầm của nó thay vì trả lại?
Hạ cấp

Thay thế {return}bằng eval('')không tiết kiệm cho tôi bất kỳ byte nào
Neil

Ờ được rồi. Nghĩ rằng nó tiết kiệm một vài byte :(
Downgoat

4

Ruby, 114 113 106 byte

Vì Ruby không có số học 32 bit, nên các hoạt động mod bổ sung khiến nó gần như liên kết với dù sao Javascript mặc dù các hoạt động tiết kiệm byte khác mà Ruby có ...

  • (-1 byte từ dấu chấm phẩy phụ)
  • (-7 byte từ việc cắt xén các hoạt động mod không cần thiết và chuyển nội dung xung quanh)

Hãy thử trực tuyến!

->v,w,a,b,c,d{s=0
32.times{s+=0x9e3779b9;v+=w*16+a^w+s^w/32+b;v%=m=2**32;w+=v*16+c^v+s^v/32+d;w%=m}
[v,w]}

2

C, 116 byte

T(v,w,k,l,m,n,s)unsigned*v,*w;{for(s=0;s+957401312;*v+=*w*16+k^*w+s^*w/32+l,*w+=*v*16+m^*v+s^*v/32+n)s+=2654435769;}

Lấy bản rõ là vw ; khóa như k , l , mn ; và lưu trữ bản mã trong vw .

Kiểm tra nó trên Ideone .


2

J, 149 byte

4 :0
'u v'=.y
s=.0
m=.2x^32
for.i.32
do.s=.m|s+2654435769
u=.m|u+(22 b.)/(s+v),(2{.x)+4 _5(33 b.)v
v=.m|v+(22 b.)/(s+u),(2}.x)+4 _5(33 b.)u
end.u,v
)

Yay! rõ ràng (Boo!) J! Tôi nghĩ rằng có một cách để làm điều này ngầm, nhưng nó có thể trở nên không thể đọc được.

Sử dụng

Lấy các khóa là bốn số nguyên 32 bit trên LHS và bản rõ là hai số nguyên 32 bit trên RHS. Tiền tố 16btương đương với 0xcác ngôn ngữ khác và đại diện cho một giá trị hex. Nội dung dựng sẵn hfdđịnh dạng đầu ra thành một chuỗi hex để dễ kiểm tra.

    f =: 4 :0
'u v'=.y
s=.0
m=.2x^32
for.i.32
do.s=.m|s+2654435769
u=.m|u+(22 b.)/(s+v),(2{.x)+4 _5(33 b.)v
v=.m|v+(22 b.)/(s+u),(2}.x)+4 _5(33 b.)u
end.u,v
)
   hfd 0 0 0 0 f 0 0
41ea3a0a
94baa940
   hfd 0 0 0 0 f 16b3778001e 16b2bf2226f
96269d3e
82680480
   hfd 16b4300e123 16be39877ae 16b7c4d7a3c 16b98335923 f 16ba9afc671 16b79dcdb73 
5d357799
2ac30c80
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.