Tôi đang cố gắng xoay sở để đi từ một hạt giống đến một Ký chính, và cũng có được một Khóa riêng (khóa mã hóa). Tôi đang sử dụng NaCl/libsodium.
Tôi đã tạo mã bên dưới và kết quả thật thú vị. hóa ra pk1.private_key và pk2.private_key phù hợp với khoảng 3% thời gian. Tuy nhiên, khóa công khai khớp 100%, tất cả đều được tạo bắt đầu bằng cùng một khóa hạt giống. Chuyện gì đang xảy ra ở đây?
Ví dụ về sự không phù hợp (chúng gần giống nhau nhưng không bằng nhau):
# byte đầu tiên không khớp bởi 0x01
hạt giống: f8d9e54a23971beebf2552c1a50ade6150cd051321398394f515e8d4b1ba0404
priv1: c1fd4612ee8ef24d295210a277e196e6bb4a9ae6b93f98d93f197860fe5dc048
priv2: c0fd4612ee8ef24d295210a277e196e6bb4a9ae6b93f98d93f197860fe5dc048
# byte đầu tiên không khớp bởi 0x03
hạt giống: d612a66f92ee2f42ab1f7ea9a712a47c815843d21fc988b1d202459f235b6410
priv1: f33d5e80bb556333e2961c9868b1dc7e548836ee56808689ca022f1a19fe86bb
priv2: f03d5e80bb556333e2961c9868b1dc7e548836ee56808689ca022f1a19fe867b
# Byte đầu tiên không khớp với 0x01, byte cuối cùng không khớp với 0x40
hạt giống: 10b7e1c66cf08005a22289158a088e028160f892dc6c20d43025be4690aaed85
priv1: 194898f65d117579d50e80a9b7e07bd048bfd1300d55561dac9dfaed4ef02109
priv2: 184898f65d117579d50e80a9b7e07bd048bfd1300d55561dac9dfaed4ef02149
từ nacl.signing nhập SigningKey
từ nacl.public nhập PrivateKey, PublicKey, Box, SealedBox
từ nacl.bindings nhập crypto_sign_SEEDBYTES
từ nacl.utils nhập StringFixer, ngẫu nhiên
chạy def (gỡ lỗi = Sai):
hạt giống = ngẫu nhiên (crypto_sign_SEEDBYTES)
pk1 = PrivateKey.from_seed(hạt giống)
pk2 = SigningKey(seed).to_curve25519_private_key()
nếu gỡ lỗi:
in('hạt giống: ', hạt giống.hex())
in('priv1: ', pk1._private_key.hex())
in('priv2: ', pk2._private_key.hex())
in('pub1: ', byte(pk1.public_key).hex())
in('pub2: ', byte(pk2.public_key).hex())
trả lại hạt giống, pk1, pk2
chạy = 10000
private_key_match = 0
public_key_match = 0
both_match = 0
cho tôi trong phạm vi (chạy):
nếu tôi % 500 == 0:
in(i, 'của', chạy)
hạt giống, pk1, pk2 = chạy()
x = pk1._private_key == pk2._private_key
y = byte(pk1.public_key) == byte(pk2.public_key)
nếu x:
private_key_match += 1
nếu bạn:
public_key_match += 1
nếu x và y:
both_match += 1
print('khớp khóa cá nhân:', private_key_match)
print('khớp khóa công khai: ', public_key_match)
print('cả hai khớp: ', both_match)