OK, đúng như dự đoán, đó là một "vấn đề về tuổi thọ". Bằng cách sử dụng như sau SHIFT(x)
macro trên cả đầu vào và đầu ra, tôi truy xuất các vectơ kiểm tra:
#define SHIFT(x) ((x) << 24 | ((x) & 0x0000ff00) << 8 | ((x) & 0x00ff0000) >> 8 | ((x) & 0xff000000) >> 24)
Đây là mã hoàn chỉnh:
#include <stdio.h>
int main() {
int không dấu trong[16];
không dấu int x[16];
không dấu int out[16];
/*
<https://datatracker.ietf.org/doc/html/rfc7914#section-8>
ĐẦU VÀO:
7e 87 9a 21 4f 3e c9 86 7c a9 40 e6 41 71 8f 26
ba ee 55 5b 8c 61 c1 b5 0d f8 46 11 6d cd 3b 1d
ee 24 f3 19 df 9b 3d 85 14 12 1e 4b 5a c5 aa 32
76 02 1d 29 09 c7 48 29 eb eb c6 8d b8 b8 c2 5e
*/
#define SHIFT(x) ((x) << 24 | ((x) & 0x0000ff00) << 8 | ((x) & 0x00ff0000) >> 8 | ((x) & 0xff000000) >> 24)
trong [ 0] = SHIFT(0x7e879a21);
trong [ 1] = SHIFT(0x4f3ec986);
trong [ 2] = SHIFT(0x7ca940e6);
trong [3] = SHIFT(0x41718f26);
trong [ 4] = SHIFT(0xbaee555b);
trong [5] = SHIFT(0x8c61c1b5);
trong[6] = SHIFT(0x0df84611);
trong [ 7] = SHIFT(0x6dcd3b1d);
in[ 8] = SHIFT(0xee24f319);
trong[9] = SHIFT(0xdf9b3d85);
in[10] = SHIFT(0x14121e4b);
in[11] = SHIFT(0x5ac5aa32);
in[12] = SHIFT(0x76021d29);
in[13] = SHIFT(0x09c74829);
in[14] = SHIFT(0xedebc68d);
in[15] = SHIFT(0xb8b8c25e);
/* <https://datatracker.ietf.org/doc/html/rfc7914#section-3> */
#define R(a,b) (((a) << (b)) | ((a) >> (32 - (b))))
int tôi;
for (i = 0;i < 16;++i) x[i] = in[i];
cho (i = 8;i > 0;i -= 2) {
x[ 4] ^= R(x[ 0]+x[12], 7); x[ 8] ^= R(x[ 4]+x[ 0], 9);
x[12] ^= R(x[ 8]+x[ 4],13); x[ 0] ^= R(x[12]+x[ 8],18);
x[ 9] ^= R(x[ 5]+x[ 1], 7); x[13] ^= R(x[ 9]+x[ 5], 9);
x[ 1] ^= R(x[13]+x[ 9],13); x[ 5] ^= R(x[ 1]+x[13],18);
x[14] ^= R(x[10]+x[ 6], 7); x[ 2] ^= R(x[14]+x[10], 9);
x[ 6] ^= R(x[ 2]+x[14],13); x[10] ^= R(x[ 6]+x[ 2],18);
x[ 3] ^= R(x[15]+x[11], 7); x[ 7] ^= R(x[ 3]+x[15], 9);
x[11] ^= R(x[ 7]+x[ 3],13); x[15] ^= R(x[11]+x[ 7],18);
x[ 1] ^= R(x[ 0]+x[ 3], 7); x[ 2] ^= R(x[ 1]+x[ 0], 9);
x[ 3] ^= R(x[ 2]+x[ 1],13); x[ 0] ^= R(x[ 3]+x[ 2],18);
x[ 6] ^= R(x[ 5]+x[ 4], 7); x[ 7] ^= R(x[ 6]+x[ 5], 9);
x[ 4] ^= R(x[ 7]+x[ 6],13); x[ 5] ^= R(x[ 4]+x[ 7],18);
x[11] ^= R(x[10]+x[ 9], 7); x[ 8] ^= R(x[11]+x[10], 9);
x[ 9] ^= R(x[ 8]+x[11],13); x[10] ^= R(x[ 9]+x[ 8],18);
x[12] ^= R(x[15]+x[14], 7); x[13] ^= R(x[12]+x[15], 9);
x[14] ^= R(x[13]+x[12],13); x[15] ^= R(x[14]+x[13],18);
}
for (i = 0;i < 16;++i) out[i] = x[i] + in[i];
printf("in[ 0] = 0x%08x | out[ 0] = 0x%08x\n", in[ 0], SHIFT(ra[ 0]));
printf("in[ 1] = 0x%08x | out[ 1] = 0x%08x\n", in[ 1], SHIFT(ra[ 1]));
printf("in[ 2] = 0x%08x | out[ 2] = 0x%08x\n", in[ 2], SHIFT(ra[ 2]));
printf("in[ 3] = 0x%08x | out[ 3] = 0x%08x\n", in[ 3], SHIFT(ra[ 3]));
printf("in[ 4] = 0x%08x | out[ 4] = 0x%08x\n", in[ 4], SHIFT(ra[ 4]));
printf("in[ 5] = 0x%08x | out[ 5] = 0x%08x\n", in[ 5], SHIFT(ra[ 5]));
printf("in[ 6] = 0x%08x | out[ 6] = 0x%08x\n", in[ 6], SHIFT(ra[ 6]));
printf("in[ 7] = 0x%08x | out[ 7] = 0x%08x\n", in[ 7], SHIFT(ra[ 7]));
printf("in[ 8] = 0x%08x | out[ 8] = 0x%08x\n", in[ 8], SHIFT(ra[ 8]));
printf("in[ 9] = 0x%08x | out[ 9] = 0x%08x\n", in[ 9], SHIFT(ra[ 9]));
printf("in[10] = 0x%08x | out[10] = 0x%08x\n", in[10], SHIFT(ra[10]));
printf("in[11] = 0x%08x | out[11] = 0x%08x\n", in[11], SHIFT(ra[11]));
printf("in[12] = 0x%08x | out[12] = 0x%08x\n", in[12], SHIFT(ra[12]));
printf("in[13] = 0x%08x | out[13] = 0x%08x\n", in[13], SHIFT(ra[13]));
printf("in[14] = 0x%08x | out[14] = 0x%08x\n", in[14], SHIFT(ra[14]));
printf("in[15] = 0x%08x | out[15] = 0x%08x\n", in[15], SHIFT(ra[15]));
trả về 0;
}
/*
ĐẦU RA:
trong[ 0] = 0x219a877e | ra [ 0] = 0xa41f859c
trong [ 1] = 0x86c93e4f | ra [ 1] = 0x6608cc99
trong[ 2] = 0xe640a97c | ra [ 2] = 0x3b81cacb
trong[3] = 0x268f7141 | ra [ 3] = 0x020cef05
trong[4] = 0x5b55eeba | ra [ 4] = 0x044b2181
trong[5] = 0xb5c1618c | ra [5] = 0xa2fd337d
trong[6] = 0x1146f80d | ra [ 6] = 0xfd7b1c63
trong [ 7] = 0x1d3bcd6d | ra [ 7] = 0x96682f29
trong[8] = 0x19f324ee | ra [ 8] = 0xb4393168
trong[9] = 0x853d9bdf | ra [ 9] = 0xe3c9e6bc
trong[10] = 0x4b1e1214 | ra[10] = 0xfe6bc5b7
trong[11] = 0x32aac55a | ra[11] = 0xa06d96ba
trong[12] = 0x291d0276 | ra[12] = 0xe424cc10
trong[13] = 0x2948c709 | ra[13] = 0x2c91745c
trong[14] = 0x8dc6ebed | ra[14] = 0x24ad673d
trong[15] = 0x5ec2b8b8 | ra[15] = 0xc7618f81
<https://datatracker.ietf.org/doc/html/rfc7914#section-8>
ĐẦU VÀO:
7e 87 9a 21 4f 3e c9 86 7c a9 40 e6 41 71 8f 26
ba ee 55 5b 8c 61 c1 b5 0d f8 46 11 6d cd 3b 1d
ee 24 f3 19 df 9b 3d 85 14 12 1e 4b 5a c5 aa 32
76 02 1d 29 09 c7 48 29 eb eb c6 8d b8 b8 c2 5e
ĐẦU RA:
a4 1f 85 9c 66 08 cc 99 3b 81 ca cb 02 0c ef 05
04 4b 21 81 a2 fd 33 7d fd 7b 1c 63 96 68 2f 29
b4 39 31 68 e3 c9 e6 bc fe 6b c5 b7 a0 6d 96 ba
e4 24 cc 10 2c 91 74 5c 24 quảng cáo 67 3d c7 61 8f 81
*/
có thể chạy trên https://www.programiz.com/c-programming/online-compiler/.