2015-09-25 116 views
0

我想驗證一個橢圓曲線使用ECDHE接收的公共密鑰上的簽名,但我無法找到明確解釋字節將簽署的任何引用。如何驗證RSA簽名ECDHE公鑰呢?

我設置了TLS V1.2連接到google.com使用加密套件TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(0xc02f)。我捕捉交通使用Wireshark,我可以看到客戶打招呼,服務器問候,證書和服務器密鑰交換消息。我的理解是,谷歌發來的EC公鑰證書使用的私鑰谷歌發送簽署(RSA,在這種情況下)。

這裏是服務器密鑰交換消息:

160303014d0c0001 490300174104f930

e65768e0587ec7e1 b8b537ccd6ae2500

3a364b84a68ed7c0 47d18dd104afb63c

cc72e800495db3cd d629807f0d4501a4

c043c5c7c52aea45 a66692aa11b60201

01007ec0b1ef4994 30f42f3ed9a7a592

92c0f875ad7cd2f8 5b36a7aec804f602

2959549a8a3d0e5c 5825fefa4d69f360

34eaad7138e5da69 61bdfb88ddb5172c

ba64071de0764fc1 c8b895dbc52ec85c

3b7891c53e6d843b 44f80c481a9beb86

c444b32204e9bc6c 6665e6dd26887c5e

fc4e331fbdd66536 686b6b5f16072b52

ee2fee75ca65e28f a0ee0644b91fba30

783798aa83cf28f1 394b1344b43104cb

89aed55030bd7561 d13ae20d4d7bc17e

682e6c6266f04bf6 31665a547e2f15b3

c79fda548a781d39 5d64f4eea75aac96

9374ce60400fdc11 3a3d5a98b62f63b7

6e5324797c938f39 bc1cc5736b612bd7

7a1bc790841d4e25 dae648cab33273e2

588c

解析這給:

160303014d - 記錄頭

0℃ - 服務器密鑰excha NGE消息

000149 - 命名爲曲線

0017 - - secp256r1曲線

41 - 消息

03的長度的長度公鑰

04 - 不知道這是什麼意思

f930e6 ...04af [32個字節] - 公鑰

b63ccc ... 11b6的x值[32個字節] - SHA-1散列

01 - - RSA簽名

公鑰

02的Y值

0100 - 簽名的長度

7ec0b1 ... 588c [256個字節] - 簽名值

使用I在證書消息中接收的證書,我能夠噸o對EC公鑰的簽名執行公鑰操作,看起來像一個正確填充的SHA-1哈希。但是,我無法驗證這個散列值。我嘗試了許多不同的原始EC公鑰與其頭部的組合,但沒有任何我試過正確的哈希值。

這是我如何獲取哈希:

OpenSSL的rsautl -inkey〜/ googlePubKey.pem -encrypt -in〜/ googleECpubkeysig -pubin -raw |進制打印

0000000 0100 FFFF FFFF FFFF FFFF FFFF FFFF FFFF

0000010 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF

*

00000d0 FFFF FFFF FFFF FFFF FFFF FFFF 3000 3021

00000e0 0609 2b05 030e 1a02 0005 1404 3ac5 fb13

00000f0 9ff8 77f1 6a69 09af 472a 90b2 cac6 b4f8

最後20個字節看起來像是SHA-1散列,這是簽名中指定的算法。來自服務器密鑰交換的哪些字節應該散列以獲得此值?或者,在散列之前我必須執行或添加一些轉換或其他數據嗎?

+0

它在rfc 5246的第4.7節和RFC 4492的第5.4節中指定。在這些RFC中沒有工作的例子太糟糕了,在我看來,這總是一個錯誤。 –

回答

1

我錯過了客戶端隨機和服務器隨機。感謝JamesKPolk提供的參考資料以及這篇相關文章中提到的兩個隨機值之一:https://security.stackexchange.com/questions/80619/tls-1-2-handshake-how-is-the-ecdhe-public-key-signed-by-server

全值散列爲我的上述例子(在括號中的十六進制值)爲:

client_random(32個字節)+ server_random(32個字節)+ named_curve(0×03)+ secp256r1_curve(0x0017)+ length_of_public_key( 0x41)+ first_byte_of_key(0x04)+ key_x_value + key_y_value

當我使用此值哈希匹配和簽名驗證確定。