Stream-Cipher
我在哪裡可以找到 ChaCha20 的測試向量(試圖理解 Wikipedia 範例)?
我在玩流密碼,發現了這個維基百科 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 協議規範中使用的參考。該文件包含一些測試向量。