Elliptic-Curves

curve25519 中的鍵箝位在生成的鍵的二進製表示中不明顯

  • November 22, 2019

我知道curve25519私鑰secret.box被夾住了……

我知道這個箝位過程清除低 3 位以確保密鑰是 8 的倍數,確保它是正確循環子組的一部分。

但是,當我使用鈉生成範例密鑰對時,例如:

a67e2d949d00606d2b6d0d9114d3ee273f118a078151c7aad2b55694ea18bb39 // 1010011001111110001011011001010010011101000000000110000001101101001010110110110100001101100100010001010011010011111011100010011100111111000100011000101000000111100000010101000111000111101010101101001010110101010101101001010011101010000110001011101100111001

或者

b2c80def0dc392671e5143e9804c1083a39c751eec7348383eb586d708b374cc // 1011001011001000000011011110111100001101110000111001001001100111000111100101000101000011111010011000000001001100000100001000001110100011100111000111010100011110111011000111001101001000001110000011111010110101100001101101011100001000101100110111010011001100

我注意到,儘管能夠肯定地確認它們是 8 子組的倍數的一部分,但它們的二進製表示並沒有清除低三位……

正如你在上面看到的,這些隨機私鑰的二進製表示沒有000最低三位。然而,當我簽入 SageMath 時,我可以確認這兩個鍵都是 8 的倍數。

更新:我使用 libSodium->SecretBox->KeyPair()… 生成了密鑰

在內部呼叫箝位/標量乘法。

我還驗證了儘管沒有以三個零結尾(000)- 私鑰始終是有序7237005577332262213973186563042994240857116359379907606001950938285454250989的,因此屬於正確的子組。

知道為什麼嗎?

箝位作為密鑰協議/簽名程序的一部分發生。私鑰本身在儲存時不會被箝制。

(你是如何測試你提供的數字的?它們似乎都不是 8 的倍數。還記得 curve25519 鍵是小端序的。)

引用自:https://crypto.stackexchange.com/questions/75940