ฉันกำลังเล่นกับรหัสสตรีมที่ค้นพบ นี้ หน้า Wikipedia ChaCha20 (ตัวแปร ChaCha) สิ่งที่ฉันหลงทางคือวิธีทดสอบรหัสนี้ ไม่มีผู้ทดสอบที่ใดก็ได้ในหน้านั้นและฉันไม่พบเลย ฉันเขียนรหัส C ต่อไปนี้:
#กำหนด ROTL(a,b) (((a) << (b)) | ((a) >> (32 - (b))))
#กำหนด QR(a, b, c, d) ( \
a += b, d ^= a, d = ROTL(d,16), \
ค += d, b ^= ค, ข = ROTL(b,12), \
a += b, d ^= a, d = ROTL(ง, 8), \
ค += ง, ข ^= ค, ข = ROTL(ข, 7))
#กำหนดรอบ 20
เป็นโมฆะ chacha_block (uint32_t ออก [16], uint32_t const ใน [16])
{
int ฉัน;
uint32_t x[16];
สำหรับ (i = 0; i < 16; ++i)
x[i] = ใน[i];
// 10 ลูป Ã 2 รอบ/ลูป = 20 รอบ
สำหรับ (i = 0; i < ROUNDS; i += 2) {
//รอบคี่
QR(x[0], x[4], x[ 8], x[12]); // คอลัมน์ 0
QR(x[1], x[5], x[ 9], x[13]); // คอลัมน์ 1
QR(x[2], x[6], x[10], x[14]); // คอลัมน์ 2
QR(x[3], x[7], x[11], x[15]); // คอลัมน์ 3
//ตัวกลมเลย
QR(x[0], x[5], x[10], x[15]); // เส้นทแยงมุม 1 (เส้นทแยงมุมหลัก)
QR(x[1], x[6], x[11], x[12]); // เส้นทแยงมุม 2
QR(x[2], x[7], x[ 8], x[13]); // เส้นทแยงมุม 3
QR(x[3], x[4], x[ 9], x[14]); // เส้นทแยงมุม 4
}
สำหรับ (i = 0; i < 16; ++i)
ออก[i] = x[i] + ใน[i];
}
}
โมฆะ main(){
ค่าคงที่ const char* = "ขยาย 32 ไบต์ k";
uint32_t ในทั้งหมด [16];
ทั้ง [0] = ((uint32_t*) ค่าคงที่) [0];
ทั้ง [1] = ((uint32_t*) ค่าคงที่) [1];
เต็ม [2] = ((uint32_t*) ค่าคงที่) [2];
เต็ม [3] = ((uint32_t*) ค่าคงที่) [3];
เต็ม[4] = 0;//คีย์[0];
เต็ม [5] = 0; // คีย์ [1];
เต็ม [6] = 0; // คีย์ [2];
ในทั้งหมด [7] = 0; // คีย์ [3];
เต็ม [8] = 0; // คีย์ [4];
เต็ม [9] = 0; // คีย์ [5];
ทั้ง [10] = 0; // คีย์ [6];
เต็ม [11] = 0; // คีย์ [7];
// ตัวนับศูนย์และ nonce
ทั้ง [12] = 0;
ทั้ง [13] = 0;
ทั้ง [14] = 0;
ทั้ง [15] = 0;
uint32_t ออก [16];
chacha_block(ออก, เข้าทั้งหมด);
printHex((ถ่าน*)out2,16*4);
// สิ่งนี้พิมพ์ออกมา:
//76b8e0ada0f13d90405d6ae55386bd28bdd219b8a08ded1aa836efcc8b770dc7da41597c5157488d7724e03fb8d84a376a43b8f41518a11cc387b669b2ee6586
}
ฉันไม่พบเวกเตอร์ทดสอบใด ๆ ที่จะตรวจสอบความถูกต้องของบล็อกสตรีมหลักแรกนี้
นอกจากนี้ ฉันยังพบความสับสนว่าบล็อกสตรีมคีย์ถัดไปหมายถึงการสร้างโดยส่งเอาต์พุตก่อนหน้ากลับไปที่ chacha_block
การทำงาน?
เนื้อรหัสนี้ใช้เพื่อ xor บล็อกคีย์สตรีมด้วยข้อมูลหรือไม่ (สิ่งนี้ไม่ได้กล่าวถึงอย่างชัดเจนในบทความ)