Hash

PGP 散列的數據長度

  • July 14, 2013

我終於設法驗證了一些簡單的 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

我沒有在雜湊中包含哪些數據/我做錯了什麼?

有人嗎?

引用StackOverflow 上的原始答案

沒有足夠的時間查看詳細資訊,但我猜您正在正確應用(或不應用)填充。這將導致對某些輸入長度產生正確的結果,但對其他輸入長度則不然。

我想我會對此進行更多研究,但我想在賞金線下找到一些東西:)

編輯:好的,發現一個錯誤。不知道你為什麼會得到它,但如果它是固定的,那麼正確的答案就會出現。在您不工作的範例中,您將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

希望有幫助。

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