Elliptic-Curves
curve25519 中的鍵箝位在生成的鍵的二進製表示中不明顯
我知道
curve25519
私鑰secret.box
被夾住了……我知道這個箝位過程清除低 3 位以確保密鑰是 8 的倍數,確保它是正確循環子組的一部分。
但是,當我使用鈉生成範例密鑰對時,例如:
a67e2d949d00606d2b6d0d9114d3ee273f118a078151c7aad2b55694ea18bb39 // 1010011001111110001011011001010010011101000000000110000001101101001010110110110100001101100100010001010011010011111011100010011100111111000100011000101000000111100000010101000111000111101010101101001010110101010101101001010011101010000110001011101100111001
或者
b2c80def0dc392671e5143e9804c1083a39c751eec7348383eb586d708b374cc // 1011001011001000000011011110111100001101110000111001001001100111000111100101000101000011111010011000000001001100000100001000001110100011100111000111010100011110111011000111001101001000001110000011111010110101100001101101011100001000101100110111010011001100
我注意到,儘管能夠肯定地確認它們是 8 子組的倍數的一部分,但它們的二進製表示並沒有清除低三位……
正如你在上面看到的,這些隨機私鑰的二進製表示沒有
000
最低三位。然而,當我簽入 SageMath 時,我可以確認這兩個鍵都是 8 的倍數。更新:我使用 libSodium->SecretBox->KeyPair()… 生成了密鑰
在內部呼叫箝位/標量乘法。
我還驗證了儘管沒有以三個零結尾
(000)
- 私鑰始終是有序7237005577332262213973186563042994240857116359379907606001950938285454250989
的,因此屬於正確的子組。知道為什麼嗎?
箝位作為密鑰協議/簽名程序的一部分發生。私鑰本身在儲存時不會被箝制。
(你是如何測試你提供的數字的?它們似乎都不是 8 的倍數。還記得 curve25519 鍵是小端序的。)