ฉันได้เล่นกับ SHA-2-256 ใน Julia และฉันสังเกตเห็นว่าแฮชที่สร้างขึ้นไม่เป็นไปตามการกระจายที่สม่ำเสมอ ความเข้าใจของฉันเกี่ยวกับอัลกอริธึมการแฮชที่ปลอดภัยคือควรประมาณการแจกแจงที่สม่ำเสมอ ดังนั้นจึงไม่สามารถคาดเดาได้
นี่คือรหัส Julia ที่ฉันใช้:
ใช้ BitIntegers, Distributions, HypothesisTests, Random, SHA
ฟังก์ชัน sha256_rounds()
รอบ::Array{Array{UInt8,1}} = Array{Array{UInt8,1}}(undef, 10000) # 10,000 ตัวอย่าง
แฮช::Array{UInt8} = Array{UInt8}(undef, 64) # อาร์เรย์ 64 ไบต์
สำหรับฉัน = 1:10,000
hash = sha2_256(string(rand(UInt64), base = 16)) # เลขสุ่ม แปลงเป็น hex string แล้ว seed
รอบ [i] = แฮช
จบ
กลับรอบ
จบ
sha256_str_vals = [join([string(x, base = 16) for x in y]) for y in sha256_rounds()] # ต่อไบต์เข้าด้วยกันเป็นสตริง
sha256_num_vals_control = [parse(UInt256, x, base = 16) for x in sha256_str_vals] # รับค่าตัวเลขจากสตริง
OneSampleADTest(sha256_num_vals, Uniform()) # หนึ่งตัวอย่างการทดสอบ Anderson-Darling
และผลการทดสอบ:
หนึ่งตัวอย่างการทดสอบ Anderson-Darling
--------------------------------
รายละเอียดประชากร:
พารามิเตอร์ที่น่าสนใจ: ยังไม่ได้ดำเนินการ
ค่าภายใต้ h_0: NaN
ประมาณการจุด: NaN
สรุปการทดสอบ:
ผลลัพธ์ที่มีความมั่นใจ 95%: ปฏิเสธ h_0
ค่า p ด้านเดียว: <1e-7
รายละเอียด:
จำนวนการสังเกต: 10,000
ค่าเฉลี่ยตัวอย่าง: 8.73991847621225e75
ตัวอย่าง SD: 2.2742656031884893e76
สถิติ A²: Inf
สำหรับฉันสิ่งนี้บอกว่าแฮชที่ผลิตไม่สอดคล้องกับการแจกแจงแบบสม่ำเสมอ ฉันใช้การทดสอบอย่างไม่ถูกต้อง หรือตัวอย่างของฉันผิดพลาดหรือไม่? ขอบคุณสำหรับความคิดของคุณ