ฉันพยายามที่จะคาดหัวของฉันไปรอบ ๆ จาก เมล็ดพันธุ์
ถึง ก เซ็นคีย์
และยังได้รับ คีย์ส่วนตัว
(คีย์เข้ารหัส). ฉันใช้ NaCl / libsodium
ฉันสร้างรหัสด้านล่างและผลลัพธ์ก็น่าสนใจ เปิดออก pk1.private_key
และ pk2.private_key
จับคู่ประมาณ 3% ของเวลา อย่างไรก็ตามคีย์สาธารณะตรงกัน 100% ทั้งหมดจะถูกสร้างขึ้นโดยขึ้นต้นด้วยค่าเดียวกัน เมล็ดพันธุ์
. เกิดขึ้นที่นี่คืออะไร?
ตัวอย่างของความไม่ตรงกัน (ใกล้เคียงแต่ไม่เท่ากัน):
# ไบต์ที่ 1 ไม่ตรงกันโดย 0x01
เมล็ดพันธุ์: f8d9e54a23971beebf2552c1a50ade6150cd051321398394f515e8d4b1ba0404
เอกชน1: c1fd4612ee8ef24d295210a277e196e6bb4a9ae6b93f98d93f197860fe5dc048
เอกชน2: c0fd4612ee8ef24d295210a277e196e6bb4a9ae6b93f98d93f197860fe5dc048
# ไบต์ที่ 1 ไม่ตรงกันโดย 0x03
เมล็ดพันธุ์: d612a66f92ee2f42ab1f7ea9a712a47c815843d21fc988b1d202459f235b6410
เอกชน1: f33d5e80bb556333e2961c9868b1dc7e548836ee56808689ca022f1a19fe86bb
priv2: f03d5e80bb556333e2961c9868b1dc7e548836ee56808689ca022f1a19fe867b
# ไบต์ที่ 1 ไม่ตรงกันโดย 0x01, ไบต์สุดท้ายไม่ตรงกันโดย 0x40
เมล็ดพันธุ์: 10b7e1c66cf08005a22289158a088e028160f892dc6c20d43025be4690aaed85
priv1: 194898f65d117579d50e80a9b7e07bd048bfd1300d55561dac9dfaed4ef02109
priv2: 184898f65d117579d50e80a9b7e07bd048bfd1300d55561dac9dfaed4ef02149
จาก nacl.signing นำเข้า SigningKey
จาก nacl.public นำเข้า PrivateKey, PublicKey, Box, SealedBox
จาก nacl.bindings นำเข้า crypto_sign_SEEDBYTES
จาก nacl.utils นำเข้า StringFixer สุ่ม
def รัน (ดีบัก = เท็จ):
เมล็ด = สุ่ม (crypto_sign_SEEDBYTES)
pk1 = PrivateKey.from_seed(เมล็ด)
pk2 = SigningKey(seed).to_curve25519_private_key()
หากแก้ไขข้อบกพร่อง:
พิมพ์ ('seed: ', seed.hex ())
พิมพ์ ('priv1: ', pk1._private_key.hex())
พิมพ์ ('priv2: ', pk2._private_key.hex())
พิมพ์ ('pub1: ', ไบต์ (pk1.public_key).hex ())
พิมพ์ ('pub2: ', ไบต์ (pk2.public_key).hex ())
เมล็ดกลับ, pk1, pk2
วิ่ง = 10,000
private_key_match = 0
public_key_match = 0
ทั้งสอง_match = 0
สำหรับฉันในช่วง (วิ่ง):
ถ้าฉัน % 500 == 0:
พิมพ์ (i, 'ของ', วิ่ง)
เมล็ด, pk1, pk2 = เรียกใช้ ()
x = pk1._private_key == pk2._private_key
y = ไบต์ (pk1.public_key) == ไบต์ (pk2.public_key)
ถ้า x:
private_key_match += 1
ถ้า y:
public_key_match += 1
ถ้า x และ y:
ทั้งสอง_match += 1
พิมพ์ ('การจับคู่คีย์ส่วนตัว:', private_key_match)
พิมพ์ ('การจับคู่คีย์สาธารณะ:', public_key_match)
พิมพ์ ('ทั้งคู่ตรงกัน:', both_match)