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)