Я пытаюсь обернуть голову вокруг перехода от семя
к ключ подписи
, а также получение Приватный ключ
(ключ шифрования). Я использую NaCl/libsodium.
Я создал код ниже, и результаты интересны. Оказывается pk1.private_key
и pk2.private_key
совпадают примерно в 3% случаев. Однако открытый ключ соответствует 100%, все они генерируются, начиная с одного и того же семя
. Что здесь происходит?
Примеры несоответствия (они близки, но не равны):
# Несоответствие 1-го байта на 0x01
семя: f8d9e54a23971beebf2552c1a50ade6150cd051321398394f515e8d4b1ba0404
приват1: c1fd4612ee8ef24d295210a277e196e6bb4a9ae6b93f98d93f197860fe5dc048
priv2: c0fd4612ee8ef24d295210a277e196e6bb4a9ae6b93f98d93f197860fe5dc048
# Несоответствие 1-го байта на 0x03
семя: d612a66f92ee2f42ab1f7ea9a712a47c815843d21fc988b1d202459f235b6410
приват1: f33d5e80bb556333e2961c9868b1dc7e548836ee56808689ca022f1a19fe86bb
приват2: f03d5e80bb556333e2961c9868b1dc7e548836ee56808689ca022f1a19fe867b
# Несоответствие 1-го байта на 0x01, несоответствие последнего байта на 0x40
семя: 10b7e1c66cf08005a22289158a088e028160f892dc6c20d43025be4690aaed85
приват1: 194898f65d117579d50e80a9b7e07bd048bfd1300d55561dac9dfaed4ef02109
приват2: 184898f65d117579d50e80a9b7e07bd048bfd1300d55561dac9dfaed4ef02149
из nacl.signing импортировать SigningKey
из nacl.public импортировать PrivateKey, PublicKey, Box, SealedBox
из nacl.bindings импортировать crypto_sign_SEEDBYTES
из nacl.utils импортировать StringFixer, случайный
деф запустить (отладка = Ложь):
семя = случайное (crypto_sign_SEEDBYTES)
pk1 = PrivateKey.from_seed(seed)
pk2 = Ключ подписи (начальное число).to_curve25519_private_key()
если отладить:
print('seed: ', seed.hex())
print('priv1: ', pk1._private_key.hex())
print('priv2: ', pk2._private_key.hex())
print('pub1: ', байты(pk1.public_key).hex())
print('pub2: ', байты(pk2.public_key).hex())
возврат семян, pk1, pk2
пробеги = 10000
приватный_ключ_матч = 0
public_key_match = 0
оба_матча = 0
для i в диапазоне (работает):
если я % 500 == 0:
print(i, 'из', работает)
семя, pk1, pk2 = запустить ()
х = pk1._private_key == pk2._private_key
y = байты (pk1.public_key) == байты (pk2.public_key)
если х:
private_key_match += 1
если у:
public_key_match += 1
если х и у:
оба_совпадения += 1
print('совпадение закрытого ключа:', private_key_match)
print('совпадение открытого ключа: ', public_key_match)
print('оба совпадают: ', Both_match)