ตกลง ตามที่คาดไว้ มันเป็น "ปัญหาความสิ้นหวัง" โดยใช้ดังต่อไปนี้ SHIFT(x)
มาโครทั้งอินพุตและเอาต์พุต ฉันจะดึงเวกเตอร์ทดสอบ:
#define SHIFT(x) ((x) << 24 | ((x) & 0x0000ff00) << 8 | ((x) & 0x00ff0000) >> 8 | ((x) & 0xff000000) >> 24)
นี่คือรหัสที่สมบูรณ์:
#รวม <stdio.h>
int หลัก () {
int ที่ไม่ได้ลงชื่อเข้าใช้ [16];
int x[16] ที่ไม่ได้ลงนาม;
int out ที่ไม่ได้ลงชื่อ [16];
/*
<https://datatracker.ietf.org/doc/html/rfc7914#section-8>
ป้อนข้อมูล:
7e 87 9a 21 4f 3e c9 86 7c a9 40 e6 41 71 8f 26
บาอี 55 5b 8c 61 c1 b5 0d f8 46 11 6d cd 3b 1d
อี 24 f3 19 df 9b 3d 85 14 12 1e 4b 5a c5 aa 32
76 02 1d 29 09 c7 48 29 ed eb c6 8d b8 b8 c2 5e
*/
#define SHIFT(x) ((x) << 24 | ((x) & 0x0000ff00) << 8 | ((x) & 0x00ff0000) >> 8 | ((x) & 0xff000000) >> 24)
ใน[ 0] = SHIFT(0x7e879a21);
ใน[ 1] = SHIFT(0x4f3ec986);
ใน[ 2] = SHIFT(0x7ca940e6);
ใน[ 3] = SHIFT(0x41718f26);
ใน[ 4] = SHIFT(0xbaee555b);
ใน[ 5] = SHIFT(0x8c61c1b5);
ใน[ 6] = SHIFT(0x0df84611);
ใน[ 7] = SHIFT(0x6dcd3b1d);
ใน[ 8] = SHIFT(0xee24f319);
ใน[ 9] = SHIFT(0xdf9b3d85);
ใน[10] = SHIFT(0x14121e4b);
ใน[11] = SHIFT(0x5ac5aa32);
ใน[12] = SHIFT(0x76021d29);
ใน[13] = SHIFT(0x09c74829);
ใน[14] = SHIFT(0xedebc68d);
ใน[15] = SHIFT(0xb8b8c25e);
/* <https://datatracker.ietf.org/doc/html/rfc7914#section-3> */
#กำหนด R(a,b) (((a) << (b)) | ((a) >> (32 - (b))))
int ฉัน;
สำหรับ (i = 0;i < 16;++i) x[i] = in[i];
สำหรับ (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);
}
สำหรับ (i = 0;i < 16;++i) out[i] = x[i] + in[i];
printf("ใน[ 0] = 0x%08x | ออก[ 0] = 0x%08x\n", ใน[ 0], SHIFT(ออก[ 0]));
printf("ใน[ 1] = 0x%08x | ออก[ 1] = 0x%08x\n", ใน[ 1], SHIFT(ออก[ 1]));
printf("ใน[ 2] = 0x%08x | ออก[ 2] = 0x%08x\n", ใน[ 2], SHIFT(ออก[ 2]));
printf("ใน[ 3] = 0x%08x | ออก[ 3] = 0x%08x\n", ใน[ 3], SHIFT(ออก[ 3]));
printf("ใน[ 4] = 0x%08x | ออก[ 4] = 0x%08x\n", ใน[ 4], SHIFT(ออก[ 4]));
printf("ใน [ 5] = 0x%08x | ออก [ 5] = 0x%08x\n", ใน [ 5], SHIFT(ออก [ 5]));
printf("ใน [ 6] = 0x%08x | ออก [ 6] = 0x%08x\n", ใน [ 6], SHIFT(ออก [ 6]));
printf("ใน[ 7] = 0x%08x | ออก[ 7] = 0x%08x\n", ใน[ 7], SHIFT(ออก[ 7]));
printf("ใน[ 8] = 0x%08x | ออก[ 8] = 0x%08x\n", ใน[ 8], SHIFT(ออก[ 8]));
printf("ใน[ 9] = 0x%08x | ออก[ 9] = 0x%08x\n", ใน[ 9], SHIFT(ออก[ 9]));
printf("ใน[10] = 0x%08x | ออก[10] = 0x%08x\n", ใน[10], SHIFT(ออก[10]));
printf("ใน[11] = 0x%08x | ออก[11] = 0x%08x\n", ใน[11], SHIFT(ออก[11]));
printf("ใน[12] = 0x%08x | ออก[12] = 0x%08x\n", ใน[12], SHIFT(ออก[12]));
printf("ใน[13] = 0x%08x | ออก[13] = 0x%08x\n", ใน[13], SHIFT(ออก[13]));
printf("ใน[14] = 0x%08x | ออก[14] = 0x%08x\n", ใน[14], SHIFT(ออก[14]));
printf("ใน[15] = 0x%08x | ออก[15] = 0x%08x\n", ใน[15], SHIFT(ออก[15]));
กลับ 0;
}
/*
เอาต์พุต:
ใน[ 0] = 0x219a877e | ออก [ 0] = 0xa41f859c
ใน[ 1] = 0x86c93e4f | ออก [ 1] = 0x6608cc99
ใน[ 2] = 0xe640a97c | ออก [2] = 0x3b81cacb
ใน[ 3] = 0x268f7141 | ออก [ 3] = 0x020cef05
ใน[ 4] = 0x5b55eeba | ออก [ 4] = 0x044b2181
ใน[ 5] = 0xb5c1618c | ออก [ 5] = 0xa2fd337d
ใน[ 6] = 0x1146f80d | ออก [ 6] = 0xfd7b1c63
ใน[ 7] = 0x1d3bcd6d | ออก [ 7] = 0x96682f29
ใน[ 8] = 0x19f324ee | ออก [ 8] = 0xb4393168
ใน[ 9] = 0x853d9bdf | ออก [ 9] = 0xe3c9e6bc
ใน[10] = 0x4b1e1214 | ออก [10] = 0xfe6bc5b7
ใน[11] = 0x32aac55a | ออก [11] = 0xa06d96ba
ใน[12] = 0x291d0276 | ออก [12] = 0xe424cc10
ใน[13] = 0x2948c709 | ออก [13] = 0x2c91745c
ใน[14] = 0x8dc6ebed | ออก [14] = 0x24ad673d
ใน[15] = 0x5ec2b8b8 | ออก [15] = 0xc7618f81
<https://datatracker.ietf.org/doc/html/rfc7914#section-8>
ป้อนข้อมูล:
7e 87 9a 21 4f 3e c9 86 7c a9 40 e6 41 71 8f 26
บาอี 55 5b 8c 61 c1 b5 0d f8 46 11 6d cd 3b 1d
อี 24 f3 19 df 9b 3d 85 14 12 1e 4b 5a c5 aa 32
76 02 1d 29 09 c7 48 29 ed eb c6 8d b8 b8 c2 5e
เอาต์พุต:
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 บาท
e4 24 ซีซี 10 2c 91 74 5c 24 โฆษณา 67 3d c7 61 8f 81
*/
ที่สามารถเรียกใช้ได้ https://www.programiz.com/c-programming/online-compiler/.