Tôi đã chơi xung quanh với mật mã luồng được tìm thấy cái này Trang Wikipedia ChaCha20 (biến thể ChaCha). Điều tôi bị mất là làm thế nào để kiểm tra mã này. Không có trình kiểm tra nào ở bất kỳ đâu trên trang đó và tôi không thể tìm thấy bất kỳ trình kiểm tra nào. Tôi đã viết mã C sau:
#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 VÒNG 20
void chacha_block(uint32_t out[16], uint32_t const in[16])
{
int tôi;
uint32_t x[16];
cho (i = 0; i < 16; ++i)
x[i] = trong[i];
// 10 vòng à 2 vòng/vòng = 20 vòng
for (i = 0; i < VÒNG; i += 2) {
// Vòng lẻ
QR(x[0], x[4], x[ 8], x[12]); // cột 0
QR(x[1], x[5], x[ 9], x[13]); // cột 1
QR(x[2], x[6], x[10], x[14]); // cột 2
QR(x[3], x[7], x[11], x[15]); // cột 3
//Tròn chẵn
QR(x[0], x[5], x[10], x[15]); // đường chéo 1 (đường chéo chính)
QR(x[1], x[6], x[11], x[12]); // đường chéo 2
QR(x[2], x[7], x[ 8], x[13]); // đường chéo 3
QR(x[3], x[4], x[ 9], x[14]); // đường chéo 4
}
cho (i = 0; i < 16; ++i)
ra[i] = x[i] + vào[i];
}
}
khoảng trống chính () {
const char* hằng số = "mở rộng k 32 byte";
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];
toàn bộ [4] = 0;//khóa [0];
toàn bộ [5] = 0;//khóa [1];
toàn bộ [6] = 0;//khóa [2];
toàn bộ [7] = 0;//khóa [3];
toàn bộ [8] = 0;//khóa [4];
toàn bộ [9] = 0;//khóa [5];
toàn bộ [10] = 0;//khóa [6];
toàn bộ [11] = 0;//khóa [7];
//Bộ đếm không và nonce
toàn bộ [12] = 0;
toàn bộ [13] = 0;
toàn bộ [14] = 0;
toàn bộ [15] = 0;
uint32_t out[16];
chacha_block(ra, vào);
printHex((char*)out2,16*4);
// Điều này in ra:
//76b8e0ada0f13d90405d6ae55386bd28bdd219b8a08ded1aa836efcc8b770dc7da41597c5157488d7724e03fb8d84a376a43b8f41518a11cc387b669b2ee6586
}
Tôi không thể tìm thấy bất kỳ vectơ thử nghiệm nào để xác thực khối dòng khóa đầu tiên này.
Ngoài ra, tôi thấy khó hiểu là khối dòng khóa tiếp theo được tạo ra bằng cách chuyển đầu ra trước đó trở lại chacha_block
chức năng?
Ngoài ra, phần mật mã này có được sử dụng để xor các khối dòng khóa với dữ liệu không (điều này không được đề cập rõ ràng trong bài viết)?