Score:0

จะทดสอบการใช้งาน Salsa20/8 Core RFC 7914 กับเวกเตอร์ทดสอบได้อย่างไร

ธง in

ฉันต้องการทดสอบการใช้งานฟังก์ชัน Salsa20/8 Core ที่มีให้ใน อาร์เอฟซี 7914, กับ เวกเตอร์ทดสอบ ให้ และฉันไม่ได้รับผลลัพธ์ที่คาดหวังจากอินพุตที่ให้มา ฉันเดาว่าฉันใช้อินพุตไม่ถูกต้อง แต่ฉันเกรงว่าฉันต้องการความช่วยเหลือ... นี่คือรหัสของฉัน:

#รวม <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
  */

  ใน[ 0] = 0x7e879a21;
  ใน [ 1] = 0x4f3ec986;
  ใน [ 2] = 0x7ca940e6;
  ใน [ 3] = 0x41718f26;
  ใน[ 4] = 0xbaee555b;
  ใน [ 5] = 0x8c61c1b5;
  ใน [ 6] = 0x0df84611;
  ใน [ 7] = 0x6dcd3b1d;
  ใน [ 8] = 0xee24f319;
  ใน[ 9] = 0xdf9b3d85;
  ใน [10] = 0x14121e4b;
  ใน [11] = 0x5ac5aa32;
  ใน [12] = 0x76021d29;
  ใน [13] = 0x09c74829;
  ใน [14] = 0xedebc68d;
  ใน [15] = 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], ออก[ 0]);
  printf("ใน [ 1] = 0x%08x | ออก [ 1] = 0x%08x\n", ใน [ 1], ออก [ 1]);
  printf("ใน [ 2] = 0x%08x | ออก [ 2] = 0x%08x\n", ใน [ 2], ออก [ 2]);
  printf("ใน [ 3] = 0x%08x | ออก [ 3] = 0x%08x\n", ใน [ 3], ออก [ 3]);
  printf("ใน [ 4] = 0x%08x | ออก [ 4] = 0x%08x\n", ใน [ 4], ออก [ 4]);
  printf("ใน [ 5] = 0x%08x | ออก [ 5] = 0x%08x\n", ใน [ 5], ออก [ 5]);
  printf("ใน [ 6] = 0x%08x | ออก [ 6] = 0x%08x\n", ใน [ 6], ออก [ 6]);
  printf("ใน [ 7] = 0x%08x | ออก [ 7] = 0x%08x\n", ใน [ 7], ออก [ 7]);
  printf("ใน [ 8] = 0x%08x | ออก [ 8] = 0x%08x\n", ใน [ 8], ออก [ 8]);
  printf("ใน [ 9] = 0x%08x | ออก [ 9] = 0x%08x\n", ใน [ 9], ออก [ 9]);
  printf("ใน[10] = 0x%08x | ออก[10] = 0x%08x\n", ใน[10], ออก[10]);
  printf("ใน[11] = 0x%08x | ออก[11] = 0x%08x\n", ใน[11], ออก[11]);
  printf("ใน[12] = 0x%08x | ออก[12] = 0x%08x\n", ใน[12], ออก[12]);
  printf("ใน[13] = 0x%08x | ออก[13] = 0x%08x\n", ใน[13], ออก[13]);
  printf("ใน[14] = 0x%08x | ออก[14] = 0x%08x\n", ใน[14], ออก[14]);
  printf("ใน[15] = 0x%08x | ออก[15] = 0x%08x\n", ใน[15], ออก[15]);

  กลับ 0;
}

/*
ผลลัพธ์:
ใน[ 0] = 0x7e879a21 | ออก [ 0] = 0x4f027d2d
ใน[ 1] = 0x4f3ec986 | ออก [ 1] = 0x4d5b0cd1
ใน[ 2] = 0x7ca940e6 | ออก [2] = 0x3ee27bc6
ใน[ 3] = 0x41718f26 | ออก [ 3] = 0xcfbc626d
ใน[ 4] = 0xbaee555b | ออก [ 4] = 0xb577900a
ใน[ 5] = 0x8c61c1b5 | ออก [ 5] = 0x034adb4a
ใน[ 6] = 0x0df84611 | ออก [6] = 0x45cc3314
ใน[ 7] = 0x6dcd3b1d | ออก [ 7] = 0x3bdc106b
ใน[ 8] = 0xee24f319 | ออก [8] = 0x7fac24dd
ใน[ 9] = 0xdf9b3d85 | ออก [ 9] = 0x9a53c287
ใน[10] = 0x14121e4b | ออก [10] = 0x719eb5c5
ใน[11] = 0x5ac5aa32 | ออก [11] = 0x291ded16
ใน[12] = 0x76021d29 | ออก [12] = 0x2e3a5184
ใน[13] = 0x09c74829 | ออก [13] = 0xa4d4d61a
ใน[14] = 0xedebc68d | ออก [14] = 0x191ff4df
ใน[15] = 0xb8b8c25e | ออก [15] = 0xef2671d8

<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/ เพื่อให้ได้ผลลัพธ์ ฉันหวังว่าคุณจะช่วยตรวจหาความผิดพลาดของฉัน...

hardyrama avatar
sd flag
คุณได้ตรวจสอบการใช้งาน endian ขนาดใหญ่ / เล็กหรือไม่? ฉันคิดว่าคำถามเกี่ยวกับการใช้งานไม่เกี่ยวข้องกับที่นี่
Score:1
ธง in

ตกลง ตามที่คาดไว้ มันเป็น "ปัญหาความสิ้นหวัง" โดยใช้ดังต่อไปนี้ 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/.

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา