Điểm:0

Làm cách nào để kiểm tra việc triển khai Salsa20/8 Core RFC 7914 với các vectơ kiểm tra?

lá cờ in

Tôi muốn kiểm tra việc triển khai chức năng Salsa20/8 Core được cung cấp trong RFC 7914, với vectơ kiểm tra được cung cấp và tôi không nhận được đầu ra mong đợi từ đầu vào được cung cấp. Tôi đoán rằng tôi không sử dụng đầu vào đúng cách, nhưng tôi e rằng tôi cần trợ giúp... Đây là mã của tôi:

#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
  */

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

  trả về 0;
}

/*
KẾT QUẢ:
trong[ 0] = 0x7e879a21 | ra [ 0] = 0x4f027d2d
trong [ 1] = 0x4f3ec986 | ra [ 1] = 0x4d5b0cd1
trong[2] = 0x7ca940e6 | ra [ 2] = 0x3ee27bc6
trong[3] = 0x41718f26 | ra [ 3] = 0xcfbc626d
trong[4] = 0xbaee555b | ra [ 4] = 0xb577900a
trong[5] = 0x8c61c1b5 | ra [5] = 0x034adb4a
trong[6] = 0x0df84611 | ra [ 6] = 0x45cc3314
trong[7] = 0x6dcd3b1d | ra [ 7] = 0x3bdc106b
trong[8] = 0xee24f319 | ra [ 8] = 0x7fac24dd
trong[9] = 0xdf9b3d85 | ra [ 9] = 0x9a53c287
trong[10] = 0x14121e4b | ra[10] = 0x719eb5c5
trong[11] = 0x5ac5aa32 | ra[11] = 0x291ded16
trong[12] = 0x76021d29 | ra[12] = 0x2e3a5184
trong[13] = 0x09c74829 | ra[13] = 0xa4d4d61a
trong[14] = 0xedebc68d | ra[14] = 0x191ff4df
trong[15] = 0xb8b8c25e | ra[15] = 0xef2671d8

<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
*/

Tôi chỉ đơn giản là chạy mã của mình với https://www.programiz.com/c-programming/online-compiler/ để có được đầu ra. Tôi hy vọng bạn có thể giúp phát hiện ra sai lầm của tôi ...

hardyrama avatar
lá cờ sd
bạn đã kiểm tra phần cuối lớn/nhỏ của việc triển khai chưa? Tôi nghĩ rằng các câu hỏi triển khai không thuộc về đây.
Điểm:1
lá cờ in

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/.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.