Stream-Cipher

我在哪裡可以找到 ChaCha20 的測試向量(試圖理解 Wikipedia 範例)?

  • August 15, 2021

我在玩流密碼,發現了這個維基百科 ChaCha20 頁面(ChaCha 變體)。我迷失的是如何測試這段程式碼。該頁面上的任何地方都沒有測試向量,我找不到任何測試向量。我編寫了以下 C 程式碼:

#define ROTL(a,b) (((a) << (b)) | ((a) >> (32 - (b))))
#define QR(a, b, c, d) (            \
   a += b,  d ^= a,  d = ROTL(d,16),   \
   c += d,  b ^= c,  b = ROTL(b,12),   \
   a += b,  d ^= a,  d = ROTL(d, 8),   \
   c += d,  b ^= c,  b = ROTL(b, 7))
#define ROUNDS 20

void chacha_block(uint32_t out[16], uint32_t const in[16])
{
int i;
uint32_t x[16];

for (i = 0; i < 16; ++i)    
   x[i] = in[i];
// 10 loops × 2 rounds/loop = 20 rounds
for (i = 0; i < ROUNDS; i += 2) {
   // Odd round
   QR(x[0], x[4], x[ 8], x[12]); // column 0
   QR(x[1], x[5], x[ 9], x[13]); // column 1
   QR(x[2], x[6], x[10], x[14]); // column 2
   QR(x[3], x[7], x[11], x[15]); // column 3
   // Even round
   QR(x[0], x[5], x[10], x[15]); // diagonal 1 (main diagonal)
   QR(x[1], x[6], x[11], x[12]); // diagonal 2
   QR(x[2], x[7], x[ 8], x[13]); // diagonal 3
   QR(x[3], x[4], x[ 9], x[14]); // diagonal 4
}
for (i = 0; i < 16; ++i)
   out[i] = x[i] + in[i];
}
}

void main(){
   const char* constant = "expand 32-byte k";
   uint32_t inwhole[16];
   inwhole[0] = ((uint32_t*)constant)[0];
   inwhole[1] = ((uint32_t*)constant)[1];
   inwhole[2] = ((uint32_t*)constant)[2];
   inwhole[3] = ((uint32_t*)constant)[3];

   inwhole[4] = 0;//key[0];
   inwhole[5] = 0;//key[1];
   inwhole[6] = 0;//key[2];
   inwhole[7] = 0;//key[3];
   inwhole[8] = 0;//key[4];
   inwhole[9] = 0;//key[5];
   inwhole[10] = 0;//key[6];
   inwhole[11] = 0;//key[7];

   //Zero counter and nonce
   inwhole[12] = 0;
   inwhole[13] = 0;
   inwhole[14] = 0;
   inwhole[15] = 0;

   uint32_t out[16];
   chacha_block(out, inwhole);
   printHex((char*)out2,16*4);
   //This prints out:
//76b8e0ada0f13d90405d6ae55386bd28bdd219b8a08ded1aa836efcc8b770dc7da41597c5157488d7724e03fb8d84a376a43b8f41518a11cc387b669b2ee6586
}

我找不到任何測試向量來驗證第一個密鑰流塊。我還發現令人困惑的是,下一個密鑰流塊是通過將先前的輸出傳遞回chacha_block函式來生成的?這個密碼肉是否也可用於對密鑰流塊與數據進行異或(本文未明確提及)?

ChaCha20 密碼已被“資訊性”RFC - RFC-8439指定為 Internet 協議規範中使用的參考。該文件包含一些測試向量。

引用自:https://crypto.stackexchange.com/questions/93561