Hash
PGP 散列的數據長度
我終於設法驗證了一些簡單的 PGP 簽名消息塊。但是,我發現由於某種原因,我的實現限制了我驗證 9-16 字節長的數據。不少於。不再。
是否有一些指令(RFC4880或其他地方)指定如何處理任何長度的純文字數據?也許我錯過了某種填充?PKCS1?
我很確定我將數據格式化為正確散列,因為 RFC 4880 sec 5.2.4 中的說明針對文本文件,只需將所有內容替換
\n
為\r\n
並添加預告片。由於我的測試值是單行數據,因此無需替換任何內容除非另有說明,否則所有這些值都以 10 為基數:
// DSA public key values p = 175466718616740411615640156350265486163809613514213656685227237159351776260193236923030228927905671867677337184318134702903960237546408302010360724274436019639502405323187799029742776686067449287558904042137172927936686590837020160292525250748155580652384740664931255981772117478967314777932252547256795892071 q = 809260232002608708872165272150356204306578772713 g = 127751900783328740354741342100721884490035793278553520238434722215554870393020469115393573782393994875216405838455564598493958342322790638050051759023658096740912555025710033120777570527002197424160086000659457154926758682221072408093235236853997248304424303705425567765059722098677806247252106481642577996274 y = 172935968966072909036304664996424500241381878537444332146572958203083745609400290814117451480512268901233962890933482206538294509037615827035398352528065134903071886710296983781453184598843331365336270501467458073523376152406987560592548479865116940266729198119357206749848310472131186772143408998928864559411
不工作:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 abcd -----BEGIN PGP SIGNATURE----- Version: BCPG v1.39 iFsEARECABsFAk/tB28UHGFiYyA8bWFrY21AYWFhLmNvbT4ACgkQMFIlRc933Ya2 RwCfdMyI08Iz0rDXVHOPlGA3s5Y9j/8An2He7+hHjWfGJNoOJT7gAxqJaoLo =I2rT -----END PGP SIGNATURE----- data hashed (in hex): 6162636404011102001b05024fed076f141c616263203c6d616b636d406161612e636f6d3e04ff00000021 r = 666804200764671083282351405489424949903645052927 s = 558743769080942454889260816818443017172325925608 w = 702955297882281869313155599553522395227576660460 // s^-1 mod q u1 = 190417717173929082607343542521304347388874234334 u2 = 306786785479358548892951170619047936651163362761 v = g^u1 * y^u2 % p % q = 737052148656331043521702886300418501784667890334 v != r
在職的:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 0123456789abcdef -----BEGIN PGP SIGNATURE----- Version: BCPG v1.39 iFsEARECABsFAk/tCE0UHGFiYyA8bWFrY21AYWFhLmNvbT4ACgkQMFIlRc933YYG IQCfercgPsXFnah6otgQdEMbv9OeCgIAnRIyOLirbqSlBugBT6Ex/Adz4+7L =bzab -----END PGP SIGNATURE----- data hashed (in hex): 3031323334353637383961626364656604011102001b05024fed084d141c616263203c6d616b636d406161612e636f6d3e04ff00000021 r = 700580719365380086754774917458461236187098909186 s = 103881812262595813943381509986903840453887782603 w = 178510125628083028184051840492924307896586330444 // s^-1 mod q u1 = 78831508775508876446567239486098677466912246622 u2 = 572875590470993668032596348682349224460207395691 v = g^u1 * y^u2 % p % q = 700580719365380086754774917458461236187098909186 v == r
我沒有在雜湊中包含哪些數據/我做錯了什麼?
有人嗎?
沒有足夠的時間查看詳細資訊,但我猜您正在正確應用(或不應用)填充。這將導致對某些輸入長度產生正確的結果,但對其他輸入長度則不然。
我想我會對此進行更多研究,但我想在賞金線下找到一些東西:)
編輯:好的,發現一個錯誤。不知道你為什麼會得到它,但如果它是固定的,那麼正確的答案就會出現。在您不工作的範例中,您將
w
(s^-1 mod q) 計算為w = 702955297882281869313155599553522395227576660460 // s^-1 mod q
但我明白了
w = 702955297882281869313155599553522395227576660458
減2!真的,真的很接近的價值觀。可以證明我的是對的:
s * your_w mod q = 308227306159276200906356361486529830038073078504 s * my_w mod q = 1
如果你插入這個 w 值,你會得到
u1 = 536931432138658080437983667536052790245747416035 u2 = 591698847955233800072578903940910445457030802333 v = (g^u1 * y^u2) % p % q = 666804200764671083282351405489424949903645052927 r == v
希望有幫助。