概要
このブログではこれまでハッシュ関数にのみ依存する電子署名であるSPHINCSについて解説してきました12。
SPHINCS+は2024年に米国のNISTが標準化3し SLH-DSA(stateless-hash digital signing algorithm)という名前が与えられました。
今回は実際のpythonコードを実行してみて、どんな特徴があるのか見てみます。
レポジトリは https://github.com/gmh5225/slh-dsa-py 4を使います( 5 のコピーです)。
コード
署名を試すだけなら以下のコードを sign_test.py
として slh-dsa-py
ディレクトリに配置し、pip3 install pycryptodome
で依存関係をインストールして python3 sign_test.py
で実行するだけです。
実装の方のslh_dsa.py
を見てもらえれば分かると思いますが、本当にハッシュ関数しか使っておらず、非常に単純です。
from Crypto.Cipher import AES
from Crypto.Hash import SHA256
from slh_dsa import SLH_DSA_SHA2_256f, SLH_DSA_SHA2_256s
import time
def main():
# get python random bytes generator function
def random_bytes(n):
return open("/dev/urandom", "rb").read(n)
for iut in [SLH_DSA_SHA2_256f, SLH_DSA_SHA2_256s]:
iut.set_random(random_bytes)
print(f"signing with {iut.algname} {iut.stdname}")
(pk, sk) = iut.keygen()
print(f'pk = {pk.hex().upper()}')
print(f'sk = {sk.hex().upper()}')
msg = b"this is a test message"
sig_start_time_millis = int(round(time.time() * 1000))
sm = iut.sign(msg, sk)
sig_end_time_millis = int(round(time.time() * 1000))
print(f'smlen = {len(sm)}')
print(f'signing time = {sig_end_time_millis - sig_start_time_millis} ms')
if iut.stdname == "SLH-DSA-SHA2-256s":
print(f'sm = {sm.hex()}')
verify_start_time_millis = int(round(time.time() * 1000))
m2 = iut.open(sm, pk)
verify_end_time_millis = int(round(time.time() * 1000))
print(f'verification time = {verify_end_time_millis - verify_start_time_millis} ms')
if m2 == msg:
print("signature verified")
else:
print("signature verification failed")
forged_signature = sm[:32] + b'\x00' + sm[33:]
m2 = iut.open(forged_signature, pk)
if m2 == msg:
print("forged signature verified")
else:
print("forged signature verification failed")
if (__name__ == "__main__"):
main()
実行結果は以下のとおりです。
signing with SPHINCS+ SLH-DSA-SHA2-256f
pk = 30B28893901D89378AF4A669D8610E82BAB2FF6E4E12FA64BC79F35A3C7BF466C1419008BE19BB85619A0232A5AF6352F2DF2E272D01E330FACB7D4061257BE4
sk = BDC408A2AC4AF7E565E3EFE84B5A12544AFDC1208D0600A4AF6147EAFA3BB37E62A7FB35A8AA95CB563DBC8EF1FE252298FAB490BBD83C142205D6E3AE9814B230B28893901D89378AF4A669D8610E82BAB2FF6E4E12FA64BC79F35A3C7BF466C1419008BE19BB85619A0232A5AF6352F2DF2E272D01E330FACB7D4061257BE4
smlen = 49878
signing time = 2535 ms
verification time = 69 ms
signature verified
forged signature verification failed
signing with SPHINCS+ SLH-DSA-SHA2-256s
pk = 26D79E0776845840A355BC2D09FE037EBBD7A0FCBD0218E22CEEEBBB544C533CE8CD3BA3997B3433DE0D4E64046FD4241CDE56F63149492C7126B2C7084A7D1B
sk = 64D2D045FD6D1F7924E6A18E9547697841ED1411CAAA8AB6362CA7861E693BDD0A11934D237F53FE5C8A156E07A4B8FD5BAFA441CF8BBB87B12ECB1C210B417E26D79E0776845840A355BC2D09FE037EBBD7A0FCBD0218E22CEEEBBB544C533CE8CD3BA3997B3433DE0D4E64046FD4241CDE56F63149492C7126B2C7084A7D1B
smlen = 29814
signing time = 25466 ms
sm = 8a4dad5ea4f96dad1805d857c97de257321d2be1d698ac5184f2b85f3faaa44e2cd4f414879b961da098aaea267ad9fa0426d3787d57e83e2aea52dc827df6ab07c924379ae4c04f6ee987ef32e98bf250c74adbc0573dcf8f68c2e0acc64f93d6d9092da29d514457a8154742fc3a077214cbe2f07f943185b7a18836ff7beeb834e3b4cc47ab255fce0e2c06d9851b00901b79d648ac240b50cd1cbd3c5a3cee915bd0c0115400255930e05001fe6c38f8c867d8abe103cb0d9f105baa4740e86e697869c92d20eeb0a1676d0b70bc3620803af2a69b93c833be3df236aea50dd4b4eab2a2dce2211afbbcac821d272c72fdab8cf76d8fd8e3c8f21e1bf7b3813ba12fb0aadb78face510c3170245e1bd5d2f0b76460beb71cfa6633c224b53325dd3f1cf4cac31431948af78423f6f3da4602a11246306fe5a6c9a1616c2397cfb0c759e1858faa669eab990aa5d1abd2d87f35ecb9cdeac9414966938543f7d815564c1926a06d6b5dfdae671f17ced53a0c189946a044c3a1d4849c795eda117e2d7e4aa9ac00da12a26303739dd58166f9566e900deb419dac914fa6997af9083472600adad2558443b81e5c5fcafbe93b6ea6ed51261b653f5cf81901c3f5a1e52dcdaf2cc5d80ce7c63801e92dde2bd43c44218d75a8482b9a330d07d360f6f99d3bc1d9898e3e0244076fa333d607d7d5988de0bdfb830760c8736e443bdc4a6fdaa3175ef1e117fe275aa4d3dcb52ee7f190e977a03a3e228bd11d4153bc0b0adb31449514ae1867fb2f62b26a6b5af60a3062a0a27cb042962ccd58daee9a17565816fec5364b00d5c98f250208f108d9a7298315e1ea07020072b9f1b7408c12d931d2aa1c57e7b12016acdbfd8a8f9714869d2cc12937dbed908ebd4f7ddec36c6399dd881e3716d4520b5314750c7a5c6b7ba8d63d2bb8e07a5cb430ecdc99e563c40e9e09e0be4fbcb45f6328e6b1c94c25b4a2b35e2e85e89cd15cfcba7ebb407d2950db0b7e7c339e14ce0ea11ce034fe146e3368f7c23babbcd476fa7bd08a8e590ff9bd88b81096bc3984757d82628324cad9c6320c72edb2c05544eedb246d9492b483892a15b84e6fed2f4a8bc561cf0c09e506eb24e7d545ef3a85fb1aa92b6273bee528da79c8d2360e1ec728b222545265bc4acc458abbf11b464bbb6784e05592f74dd0d71eb60c4961e735b634e8db4cf6e94d2b5f311deb7c99d7f7e9d4a42620ce9a3dc137754dc9030939a7f70ad2e9cefeb825e4f39f7f07dcc00a1f214f0ff2c1f3ded63f7bf800358d26ee123fba14b7b188cdfb185b359795aef82651cb91a85dde9fd6efdbe6e28f630f44c793a10f95abccefec8d7adee9b06f7b3d248496d147cec6acab20d36bb4873cd8f202485465a72bb77ee48026e24c85e7009e01278b3b639783a1dfcc13fcfd4a9aea0e598e04a3e2afcaa0a5b01f7b8e0d0308c1be21a97c9bb898a3b3d98e35cd0ab8ccf64a3ba09df6e06f4953694c466c86dbc8d3456effc9c184c3b6c4094e9b3d7bae229c99fea7b9f7de4b3aa8447c6817c0db160d49a48b0199e980ae432146a8974a739f48823e430be5ebfc6bc0dd937a5c13fbf9d068e7dc50cf89255966fe37c3755153308a73debe71db1eabe275d3549f7b962696631190b41d78a08cb7ed72dd287d902115517f080b95e7f6003997e0ac47ce19fa1cff735d10a7273008c4ab5e0a26a3a11611d90d8a7f6e19b7a528f677ce224750da04a5b1d20901d6eac801aa608c307af41b44c16b817ff3530a0d52d8faaa6f8b29313206b0a916aeca75390c6b0f5f8fb75a7e3ebde963611319e2331fe070976b884d5c1b258bd4665a39e18e152f9bb16f24d270a030348d205a358ef2bf40ee9f319e51f585b9eea2dc49176e305496b3a16407d57046737db029b4321cb69eb0721ffc284cca66fbbe3ebe39309eedd6b9e2bb03923decae013ff883f0b9ab12e01ea359e1938128332970baa1e2cf09ff351d4f59a170702dd505fdf6a5ca405e2dbe3af7b587022fa5bb281ebed2aa595da8319ae4bbad9eb4b6063d24c5a41ac3b626149a56dae5111f9a787bdf8a0e68b490701d6cff68c0740f3c57e592e50d123a66151c6e3dd50e95835d1b228cf9ce7d2a20ecab0f4c01fc18cec9f0e360fcd52fb51c8a7f425de347ba0346dfa2292503c8e60ae7f27051ac3d7363f3a28664d3a90a9a180d1507c1647f62b840ff599f1ac05c57b759288ba41a68a15b7f2154453ce44521d56f8048a9a76061a3c25777f24617877f45a4ed17b3c063c78dbf6f9c0b2243e835228aceadcbe579f845b615ea0825d0a13a5d0d41ae069ed6215d310aa2f768c8ec63b4d7fedb2b9386fff495f6813ac9eaf2016d7afa7fdac409c5e71c4f5e25d3e2752c6f03f002723ce58714f6e8c5f6945b44fc438bfc68d6b02ec4a0e05d852b0989c522754c8f12a1808afecb2ed3b9b961d2aa6a4c4266b47814c680160b265367d7e3037257bad4711f8e1bdce4f9736d2c7e554229da8865747268b8ad0b709658f07b9edcab7e601632ae8bcea828fac01f708e81ed5a589d5584757d1036937061eb6b3ef2f210d5beb209cd1bb99ad969f42210a551a1cdc9535a4f3cb81a993d180f9445d81cfbc8ba65b22f32e3d8126b002f54cc52d9a4a561346dbe86f3dfc93117447ba8e983a6f1968d3b65daf5f41e99dd690fb6427c3afd3322555c81a21b29266b537cd14aa38ee0f193257c19016eec6db0ab24a41f4f85808f51539bccd070b5f162bf9bf7e7f11e9cd072833dafe7a64c7d9bf8cd53f57488bd792ea2903bc9c3496842a2ae5ec4a352be5e080d1432ad36aa7f721833f74c71b22d484dfd7212cc1d52ca2a13b0022ead8da8059189f69849a00b02cd142aae66dafac4ba7ce10333a667bc5f131f85ce15e0ca3520e8a84448d772d10cca6818df48d85ba87663c349de561cb22d56fd26e8592f4bb8cf05274c6a2cf1c0434a7d80fad12ed7c1ca1621d7b40a43a3afe014fb7cf40459272bdb58372b782814ee7c0265b5bc3746577c383864753a700ad1207fb504e1e59ee534707e5a43039e7e3daae60877315d483dec01ccbd8f4509f1e19bfb599e4aec27f88933fb8992de6b74b9600a15580f5f2c9fd9b08126f80f9cd3cf7ab545bcdb4de2a935a45d285e8ca9ca2a8f4ee1fbac3869b22cfc6b21b81c6896fd640d922f826914ad4e3234bef5f07f6ca9bc497ec796c8a59e8b622d298b204d1b2dd2633e1330349e58462dd728bd1f9cc5ee952d7c8539c26f9e1a9a7f34ad0d8d4bb236154d52473427dfb2b009d1379051bb47ffe74aea23280cf74023c11d040208b0c07573408caedfd24171d704b75062d04b2d8eb6354ce5b8c0ca0fdf4e38a27b316983e3baf117deb9260cf832c63903395a3b365dd807aeed22ce5adc17ecdb9dff26622e0449118fac3b052f6a4326218c5ed494c8e66b294de38c901b8f3f94fa033a62ac7a8cceb0f8f19a8ec56147cf8ed974585295fb0bac67718b787f6b049b5d625f259a9d3af344d430590954b50ca8bc6d5c6718da6869840bfcf1fcfd3cd15648c6527612020bcc3b0ba5695b5d152114c1a2c86a98192c9880a441f033e589233844d630915f8bf18a8114bd6d8691b2bf710aeae9eaf6423f502ed6a34d860708c9e93ebbbcd96b4372b8be2785e617a962327047b3599120d64519fb707da57f14b6a703e15e7f36df81426e04737735fe463019b5fda7f4ce4bf4d27ede22b06bda494026e861b9a8d887d17014f6ecabecb71868bd14245bfeccfbbc084e86d31a92d4a739564324acb10c04b75bc918c908d669fa7b699845582a7d2e94a8f613e2e503a5a02a7df76e4a62cfe39c8a051934d5ec9d23afbd83ccad976d2ff3dd27ef36e62f30c38aa02fcf4fee19a4ed816b42c7cd9c573dbbc0425fec38055a53d280c218ae8e9e7674bd72287c701468df3bf1fe6538b89ef64f737abce9586ed56ed55e9e069b9fcffa1dc6c9ac9e4b64b588aa0683f0c8844c80355564ec5871dd00bd65413e51d1e8198baceae19a64ac0b50dbbba02e9fc32d4cc67c2d65ec00038eef280d0b764e9cd2421a51ff7cec235d85b6efa8c90265911abd8f908ae0309e24732ab9464983637e7ccbb47a9a92e0317e0baef281bb458e921fd7cac2635152b22b81ff7d7874e368a419880bf302ec42988720fc24f746589d3d9f6162583d8a16be6d5c815dba4d1ad2688af8736c1ab23697503633c1d104daed01cc132edfabfde8f7c8f74b09433b216f0135824b6bf9351834ce0da0bb13d3fcc5d96d0df728e7e80ba447fa6b4a3d74e6f2afff15eb13722761b94e721f9788bab8727d87b9ce680732566f8c9b5aa13515aca3a6f62daeb4b71de084d217433ac79ef7fd63bc5db36f19ae06910aeb0cc5f40c15f274499f52734d9cac5ad062adb3aa73807ae526372ca47fa5416484357e09c8907261b622b6c6b0161170ee6c8055893b3a49db448032a9b3060f1d45a213934c1476b4b1bffdebea99399babe13ff89613de2c258b8d4aa1978c76e691f2d6fd4093ea5d100054f9507f916062e1d59ca5e4755623078397dc7e3eede85cd0f9ab210c8030e0bde297ad66916f819609b435418b503ecf4d54db5d2ab7cf90d7f8084d7a4996c38827ad8572f753287ac9be81bc9065ae10084bb42bd0e20785087afd54ea48992260d104ecbc5c36bf438dde08526512f39d43b45eb3dfce02f2387d13aafcd6aa4ce7f874438e9ee763a37f026bb1aa0533abf7ab8441838880afe9fb1750b87ed4f255019b7bad9951bda6ef52b738c84d18d658d03560e450a6d3218391cc1257aa2504d884223a2b57ea80c3e65e7ae69569c7473f5589b39f2d2cbc1a435049611812143fa42c0b42f2c4325f880817ad30bde34d9425debd0994b4f22d51f787e8c9d92ca5c41c3e0c248fe04216b1e31f0d712ee7e735726e32e7c31d66896b3b4e7bd3c0066cc11f7bbc14c599219f1430818c2b39a3d0b710b11a3faf3bbef250006a5040ed5ef4a4fd2f196a0f9efc9f988df9d269f72eccf8d37c8157634d85b9944768af22f02bd92f04bc9e0fececae9534cc94cacbad6164fdb82ecb58b6d3620e67709684959b646c45bf08254381bc11c3c3edee772c1e18fcbedeec235b6b745e5b9a882d6adcc1a6e21e5efd7f85cb4c669a5e2eaf0a71501f898b71c1049d53b2e1fce82177e9d972070fb0139d973dfad6a8078beaa2775b836ecda4fdf524cfb5e626e3f86ade836796e290456fc842fc5d2d49563445890b9cfc0e2d47da00946fc182240913a2a9bf9e94e899be511682ca927ed4a81a490e244f05ddeb53e5674daee3af616491930769fbaef46c06380aa1beb7f2d163189d7d67bd1bbfe87638dfbcb97f608a61c750dc2114715bc6e3b43a8bdb11c6797e12a8d4efcd7fa5897608eea119207f5529af98e4acbbcc9128fe11146cc16a7964af7c2925eba19b890b149abfa0c5098dbf77d70858d2fa88b8c82c4b6e511c0e97cbf18d3ba146ed94c84929d47b14c8be42a7c5164621ab52fe1f1e36a553279dde38fe229705b37fbc0b5357c90cadfce760a85bbf0ca015e61c8bb08f17e843f795b5d4e346d0f279e2b0a9fa02f9c6337e8786a641ce709f71981d4d11a5c872a9362758ab7719d1c920e1a17ff27af6a2fbd5ac1acdb7e14bfb4532f07f074df676ddf68e6ed6fa487ccdd067f3a7f349c18210b2347ae5fca70d3fb1ea5f617e4efd9d93acdaf8fb51d11ecd982f1e719e3e41b0717e45d895debebcdeffefc73e8323dff32346fbff758e104dc3b5d1253d6d417ac8a8d7fbf194b85cd906db1a7752f0e394a7ebaf552261b0f886abfe2ebb64af6b6213dc74f4a93a4935513c9930da8e6214dc7962caa8bf51777a631ca2ff8d12a40beed83cf5441a73c3611b1636b1937a56b490b53c0f5e6338573e12e1ffa629e977692b57dd34719eb1d9e7fb8d79a15727614b0b267ddc9f9aab94f1635efe89ea07faf2fb14794d2d4fd0032745baaeba98644229c0ac51288a5d1e925ddad8049d5c719a85408e9e1c56f50693fc9533e08b0b2b01455a7369b71944239b0204c7956e7eb0dbebc6ff01d3bedace4bd41a6043b44f861c5cf79462e8286dbac21c9c569ef2fef6d6070c7fd8c7a0dd7f431b74cad45eb8d256e3ab5efdfeac03730e0f0b66afdd6a78e4cb6ff7f7ed61113aa044c4fa0529761799f31e9ff0d640d941085b41361acd24e500f0cb488c92fc0dbb401306efebd512eec1cfd2d417c2ab8af8f93321cbb55fa34121637b7c9ae3c92ce3e0076d2218df05bb2cd02a1e8046ca68948af5c983eee8d9428467a5d3d2b8feb7949de15ac76986808546623c09c6c7d1b8a8fcb6c4aadca68bdc2bbbfe310ecfc2dff1a05aed61be2d36d6eb46145f5fece038bf9d7087a5777176124262baba22cf12c7cc7211137955691c85852c83aed24f5fc5e6a083eefa7a8f738702171b461e218b1fd4b57a538fb5a5b215f8f4b234436436422a7669ffd7095d38c1a8ab16a6039678610adc752ea057c49173ad41bdc560470a7780ff1231d8197bc6c4143c1831f182234e3f6702d9a17218b178528e9f88b8d1f7938f20d75310aa8509d412b5492c91a52203e5c391232176b08c4e65f0750ada88b312c0225bbbb839d7e54a765fc68bc2f1005f9308885b698a61fd2cd8ed6729de757e049b788cb633f395a2ef2615528f137befbad85234c9bf48fecdbc47ff0ecb8d6988694b90eca136893cebdc7b8884fe777fde416c6fc321e951cb0a0bc08a996d67949baab3889415867ec710c3aa8806fac5c519ba0e6f34290d486ab0cc87e019bcd7d53d6d3911241c2da0e7584b9acb873c2dd04097d6a1b50c177b48fc396533a17112459ab4e32787af804033a7af0acc3a34ebda2f604604b180e60782b1809122faea4d491e97d1a9e4167c7bb04249abda3a4068efcec9a4874a9b6a7d3e1050d005a386a52eb211074cfdd3ca01417669e0215f5b0715732134035b2d890cfb156e85e3b1245effca1ef1ebc2f5ba035ae40a9bcd14163bca814bc039ba71c069ade16fc0ba401bdd064e5f698c54ee643aebd89720973204cc00388fcfdb035bff1d703753b0c277e86b244c2b1ab019ff5302a05346631586110d6241ca4ed615ec155418c932e188fbf2cb9e2b790b76ad425d027e34e94314e44283a7acfe56f42d0f0bae4ea91652dc7dc321fda27d74ece272dd9658815e181aea65ca1b1648af5872a2948c1d3c9727b83d70f79097e7b7359a4a9d56e6aff583a4f2953c34f6f13f8f0211a776ca970171ed14cf75cfc71a4d61ba9f109db8a822aa27638806fc8da3da5b1b1cb94e33a963b28dec923cc5141a7b8b942f3f4d86a8c713b9ce1bb30b2086f5b00dbad734f69491e386d315c8da791ea41e42e2ad21aa4a89b014bb0ba245567549df28703381f98866495eb7bcb71f7a7865eb153474ad3d022bf1ec380016c40eb610b5daba9432823c9a1873419fa5e60d01a315a2c1dcacde43afb4fb87241ac69c270efdea86201d904367b2ddae549397dac4da24841bfd6195e9a3304477e6a150f1b27cb9fb771dfdd9f0034cc2c44ade60acae1c034a1671db528d1884c5991f835cafa2781e4cd6723051ed60509dc00b040c6049d248b7150c63e800f85ceb8d5c8a78f1bdbb700e542a160fd60adb7883a7139a037ed9539166befdcdee86f1550b1aa0c0d9ab7750abdf5f3fd1617253a2c1dc87a8fa4f78a0afc97c3ae7a37973116d7f1ddd48fe83a715edccfa542a5eec3f71feb1aa1427bf3eeccf21901f4355db174a73f70038eefc2b233fe9207df58a1b94fe992c21771c96cfade081baef54e38e4d2f14deae443c698ad7fe74c8ebfbab378a88a69c6b020ea5ca20246d2803590e0de327781955ff61d392050c886f9ab2eaed1dab68ee5d99e61c872ef1829ed151314babc6977a982e7e6e0d15a0fe0dc6752bab3827bbd9935ddd017baa185e7fd9dcc4aaf1f29da5a01f4d4a3fd1db40729b72e323fa4e6f94dc0d080a0521163da4664907685aaeadb9caeeebff2ba16100631700111bf61470a6a67d0f4423e3d7e19097f9703fa5b7379d92138d2103e766bb8fa1c7dc500271a27af9946cfdbd82c976bf7be33b6ae20b677a29f6c794f2a55393e4ce5591353712dfd45c624fc7f6e8e697324a9a7ae2c3a234907449881b7b7f02ec06d8dbf90156cd80972a57f2d2d87ced466fcbfefe83be1668a01094e5862181ea4f378b6f7ce1750232d46e810121973cea4dfa966215452827945bd1421ec5eb2bb0819a02ed0f91ee600b4be87d84f05a711c5ab10628cbfd4675e81db3dc7e27bcc4627cebbdff48cd2c8c17770666683530957b3a6a98bd1548cc61b57a47e47c111180b3516f09b8a85d71f570b6d60892afea765d20a0a955191441c4a766acb56cd2eeab1db53640b04138990278a9140900a33102a355e524cbcb89f7d17269aba9ebe99240e635cc0a48f21f24fcf8ef87eeb6d90b26344841215503536ab9643bd2ffce6e3f8cd24f4fadaac588e8168d4b8ca1fe5164b7054f480dfa536d4a2f5b964477ced277224f9bc21d230ee0f3a163cbae91a67acb2832f3f9da57f186075df39e75bb038913f7dfff7e95ce631d5072d7d8923cbfcbd061f1511d5e57404151edd729482f6ef46fedb13292444e46e1f4e16a703eca04944be34278c391e74d671b51cfa4e4eff362faab431f8060f223c4f7e70a75ea9f87ecc4865243306aa9c0fd884baa7a2289332b126bed17413d75ac1b95962428dda14a301d51b05cd0ccaa00327c28e97c654c2b7802354732cd0c01c99beb94d7306a211ae6eb7924d6e69d309918c50ed09cfe973ac9274ad2f39f401cb5fdafd8210eb85b990dc841e3f1f567cf9011a4437e6e0602f1c616f5cc8f2d62c35a9d59f09af50aa926b8825f274f3031837f3500f478dc00fb3a56ebc539e2e9a641de195376701451892b8e563b8834602eea5ad13964822b65c5a60e787465d81f3978476033a415f4ef9e58d72cacfbacb0ab346a647f9b0500317d9e33e4bf00cb795efba2b3c6099e98e20ca9f76fe8c572cfe3462b2bc184729dd9ff00ed6b6903536d0112a2cc93a441ea05f732b3d557d8bc88c815d45d7ceb0a262789d9189c0fb9f86a2da1009a1d02eea57f1074ea44c90b07114f87c52688446a339e33cebca96114cf5b8d01a6f621e1f1cf63b61f02db074c7ca6f9367366068ce1e33e4252ba18b6277da10a166046e8e537d0e79be32af6ce25801ee4dcfcd6d09c017aabf715e7fc2ede4abac1c2c002f42dbeff4bfeec99b793b4ef4f8b41d930df34a7b1ddc93b4297d58465757d35b32bae181e797be9faeec6a51515332e150940e283d539664a5cddb3cfa0f2bccee7ce57575bfbd4b4a8a462b6560aa72752a3548b58df420381288f812b78b0b0212c89a9a0b6cd2d6bc7b139d3b77abf2d24495dd996f7e97fe115844b04b5d453602b8a2444df9f857874929a4053ca3a596a5d3a0cb6be422015b29db9291ec9ed5ca586e51cada0c667c969f7e23dfe4d9800ad79adbdb3047a0dbe40dace6482c74e456bb01981f93297dc652fa538452c62ce76ea94b4bedbc1409e70b823bf5f18229b660fd03203107c4f7264af886521aabb3348b49a1c5de64d15d930ed06d927326320a6f13410f0cdf7599ff6448d51b56247eb332b03722eb599ef3d9a137731d64035dd60b49b09c8d0b7faf2572da943bab74be483a01f84e22ca3fe2219148b4ee18fcb20d825506c357bad9cb9508334a64c2bc07c456eeaefbeea4acef886cf153d981c4f54b796689515c9eb3181b167053d7bd8fae165822bc9dc1f7fe504e4eade78ddc5c61fb019d727436956c3303d71c37e6b9d36fbe54675bec3464964f9a2cd0880417e6e9911176cb0f6577978acc44571a970ea424322a73a5b7e1787e923e3f447a866a288a643905ffd5d31cbfd056e60c6fd883db9a0f4134d722e7937cc61bd7a786139dd373d5adc134478ace5aba7e117bbdcbcb6acc21e316fda5e666a02e8e73ca928453f63d62c20f7f8ff65ac8ed0faf50ef84e6b205e1d290c98974716452ef6334fcbc91e7955a56cc7fdd86d287a98375efc9c9eb63132383b4d5b86632464db01919ecfa5e29ded2f78f70561a72c98b84e84d1e5388a993ab32a0fbaed4e02d1a212cfa20b46e126f68198b96ee0d6d80cb64f82387e9012b809d59c7bbc015b106a99c91278b0e30433a4736cf06bdd6dbf1bb1426445a254126173080b19a0c0a75830554423c8b226e4ea1c007ffff7c12f5b488cf4349f4611828d1af1e38654f4cef8861ae5ee06bea90f4e88f06cf8209f32b049576ba7a21407b67b5e3503ace82e282607c4992f97e8b9ea9f3724331c146160fb95cf4b7b4a225ab5dba8251e19e094e96d316bc4252e1ed7ac3440be7e2d20e67890194fe6fd239125bdeff26046022b5adc989e612980d0bc89f7fd3364da6a1323222cb24fed8a2911059e4dd8de3b0d55faf73c9adfd169515c1b424c693fab2c1cd4f3ed294eefbb5703844bfde26fc73528f8dfc0ca85a0b5c49928977664747f6228b10d5f417cd80f01b8024c3135a43e924b07ead918191a9387a1d3176828937e9390a1e0bd201f0e4c98a98113ed5bf0bf3e5c0124ff84de39a1617f48eee6d941bdadafb87c0dc399cc5cf8fd3968b2dca9ebd26804bdc66d5b3d02deb9a84f250c1ee38f5eb81e1e8ad2f664297200b9c0117c88a367388e5d19fc8b7c499f9d07a8b137e53a6f37b09fb8c9355e64dcdf25bb4dd54a87751350c122ccafd7aba257c187146c7f8d2c585e295bbdf17ca3d40f3b8b86823229f99abe37a9953f7d4f94591bdb4543e65d25c0b38e30395b28833f83a3ebd2d6dca74074704419b19142bc52e5a4621c1ce497e9c0d355a799ef1aefb5876ea9f4c0cf96aab7fba29af27788314178b38a7d276035a9fffa8d6d3848b1b60d43dce602e6d434895d6b2950b477bb6b50e55ca936ae4d2972ebc4b01d31a907d9925be0333c48291657183591a044dfac19f23edd299a212a0a13dddfa8f49421261d7991facefb3cd5229f8cb51ae3d58c7d105e5c0b15f34e2d7b06f81af1ac468216a9fc15dc35c26b1572c80a25407d45ed35c6cf8a2a6ca730892c69f24e6389abf38abfa399e10a7972f43fe3493d435dda68a6cfd400107469f765345ba9a0dedb2b7cff8aa8ea0f69cf86d1bdfbd3342c6b9e4c786493b5d82750a6af0f95c803ccad23f0f1b05f38025513101f6a5ee8109dd447ab0f78663d74e32e87a70cf48fc2406db1325f784db3d703a2e1d8b26d9ca1abeac98a04210776f23ad4082dc51e8bb057fe43b0d254d30b6394960601459270d7a128e9246326b618935c961c46a7590f3a18a86c1f1038dd6615053b47e44cf94857e729db1f43b3deb44f15268215e2d8e989839304d3eda52c733e564d1454b8c0f30ce4ce39ed225ed6d40d9b2671078e1d783f3ed97376acdd5df2d708ebf730c3afa5a049a30e917f379969d3cb744ff51b7d7b056c208ea8a9ddc0ae5e6a8199899a91aac168feacfeba150db28e5981d198131563faa430e5ae374a90cb7116267f0a708cf981ed40eb4d39f05ee4d74767d44cd012771834ef9476e80b459bf0783b921c221238945000aa6c9dd7f0e1afa6d3734dd748eeab8194c0f0f25e7df2e5b00184b9291061860d5d7d89ca3785a851dc80482d2d6a19f4515e972d9edf7ff1438cecca943ab77bd8249d86616c8a9215a2b3bfcd351f5fe2cef1176d198eb05ee51dc3e89e89d420fada34f6505a3c76bcc7af5a572a99883298afa49fc028716473e6613dc6a7466cbe846b21b79a93932b41c1e179b81cae8935dd1a6e5cb5d7d8caa4e493b6a0caf3eb15913af433a0b48afba804c1263d83ee887aa9ccc3b26b5c88f7ba3769dbcd2fef7156ba472163f05073a4985881e398e02bce17adbfb1061f592054d2f69fe02f6e00237d8e0deb63e4491e86ce07640c440aa06ea03f29db2ffac14209775299d1c8f0153c28a0969685d3e206add28d78003fa52a3a763ce0557e6b1abf7bdef25a2ee285a7f8a4608d133b8acf57ebaf0adeb42922c48c086737b36bbd6f539bcdea2ce72f190df2d78160d43d2a3381111dccef68a68c30216d7dd221b06885388af58f6d9a1e00566386196a52c19c169990118600e43606a2ca7dee536da6d91372de8ebe962ee21c0bbd67605a084d0f4267845548531fffe4422f514598f841152d0b14d8682e744d0767b520682ecc37dbb36917eaeb1873c7a44eabaf6e75b778bb5e4ea7447435cf0106a1e33d1e6086a3bbd974866b11133d7155f5a657778d9b83a772208e9c80d5dbe3ecae0f9156417a8ebba16fde1ab50c1005d5c54a0821d3fcbd511493ceb13dca7828703004d19e99c0c62e4f42db1a3daf74e5539f4a63255897866e315e31d81a527a3d82a531bdf66ebe593d7a10ba60d06f72119ad6505d9972e837e1b906bceda75e5e382807a44311d0a19688d5cf4117b921805e935f4c3da88f9c3f7b8637ac8145ce2736195de5aeb4f4374d01bfd1ebdf99aa1ab3a7ea52e9c2b055684dabadea3cce85aedfdc73ac7d8616ad4e355e245c637395f1fe39f1d1df18fcc94ae95cee411e3e9b874a56a51938dff14b602816869d486a8aa316c28eb4d20ec11b5e3547415167b390858e511f109ffa6806664d7e1264fb0d67480199dfa1b0583616d6eb0af927264c33be9bc99507039c588824772edd85a021b7059d43cee39acba9fdbece32d0affd618b0fdc6fda975a4c37ace2a0d16ee34895ff6ac1c06a8630e0ad418854de657b1fbea12a4ad71e10a31e7a5227f7ee9b91713aa08a0b241a48e959c9c63c9af74399a210bff698cc7e65388155201a93a420f36e7ecaa4dc85b0725f85f6867b3157ef949d928476b6ee755c0e9e94c4132be5fbe7a23567d0a0df81dfb2c0993e42d7c14ec062d7757f02b4c9e7dd4aac647c4a49321d734ac0dca21ddac00aa3de600913222049a2186024b42c9798cfb3fbce43f858adf9e9062b946826ae8bce651f127d495ec85fdccc264b5e960c905d47e0360a2e3e2297918ba624182148c44fbb60c31e9e0de783d812f81c387290bd2a9eed04b4dba10b3e851f583bba032ce04de9272e9b79a656d2a63b98b31adea0500cc4f39ab37939336ef13db53e0043d505da2572ef9c6bc289d7297cf40b4e53489669e53001d1d58868542139cc32badd2b3a73a6f03c2de245797e914fdd476ea1a15860bd2e55bdfa8f86705c4e72745061c2611c10e4360acd9616b38d469e213520572bd5ea4fcc518d68469f6d61fa816d2e314c08f3ee5581451c35970999deb82674e3921bdad5d3e14f5aaa243aacf5cced061a2504e19ab1f4cc5b9b01611784600768a554748187c73a8efcab2f52ab1aa03f39c0945b16c2bf4467fbfef27d9cea09011a8b8c9c5a058cd7d89974e470b373db4e6f5b6d36b87e8d1185169e6bef75ad761bb809a4f71d8027ac074669ca51e9582f4f7af42324a3c61f869e92b6d748f8dfbfa17d7dac41b28bf8324b3d5b5fba9d15246cc8b4dfeb97b905bdc27b0cea3f13fc790336f891bfa92506320ce6c7d1f44f6b4aec441db1ce7d8925649e17579917cc74686f9bc49791a510e57b389d743da06f7679e24ad619d58d7e9fdf54ed0625e89192dc90d13de8691b3789ec0b376fb21251f08b929ebbd70c9a47d19ff15115e72207d00567c20aa2fc63f48af9f9e17611b391d1c0994cf7fd5ffac7332720e9330d2bd61525c84a816096563cef7feb8c5d02c2e0aa3a8bf2e46edd0c3d947699b08a89f0b2aac13e2adda590c244757963a402bc5299082d27cfe9b7b02f2c04c1b0fd623791903ad89d8c15f87cbc55b716175cda324ee11468f9d6594bc5f02eee02b43fe8aba17fa2e0d12a1f16db2fb8ad0865ac996c707a1df5fd1a36997df3a65cd64b054d357b42b513814746df37b27731a8e4f195b671176af2552dd028111f1f6e412ec4409f29b038add51135de1fcf082471f8d0123b985972cd256e4252a0ded81deb08d3abb84655e34a079cf8bf829e96d3d7fa7b8ec50ca0bb7180f90b313db924cd9707f6f813d7a267779c6b212a0f47900f742e428d8730349af42de40b88f561396bda56f357883dba9889f33beb43d2dcd16ab6d697510c57e8e9cf0d40c61cded4b7656bcd2cbc47b2a1e1e9138cf2e15708d7e3105bea4a963e44007f731470f467e758683be12e1bc704e5873b10c25a43dd60bb43a101ed6af9ed5075c43a2fe1a172625bb6e3852a615b5b3b4143df5af067678d9ec4cec728f88c48cb5b63ab28635b748b46c16fc3d5bd33ed29bbf982994ae28e9225233a1504e030352913089c962c0373b6541579964184927f3941abcc7e4c836aaa153d39c3f4db3106a37e96f983565aaa17aa40b1e6df7102d1a48dc29124735bd33d11c83be7e4cdcd18150b7934cd7bb4c29b24aa8f1ffbe29e1865f81aacc9b2d78f37743468fd064fff6cebcb431bcd75d2f83ba7e41a0c6390e98f13152f8568eda820c74644a97926d23590adbb938e31a612625208ada2f81e2345ccaa36dc17f128c82d77bfe594b226ec985ea9bdf07de604d2c1b0d08bde50c596c03f6d3882984cab7bcff7005ef6cc31021717e84fea163e83aced28bb7f091c4c76b6437c05311e2c756cad41513c231951f829d9b0261e8d7299c7c00a957f147fb4704260c579413dac191ea8e3a72f9ae8b99aa1a65ed1a8b31352da07012bdc02ab1109f10c1e392737c027bd3e73d7c4c3b969f706c98317964926f3975ca60b1ffe849a49eff63f35492bf3cc2f1babfa2f8d535071fa5eb9aa2f1435c0e9cf5f43eb42f879261eba718a7c26e31467aee94df2646c0042dcb1901a86afd8dc7269e44473375e2f49dd154e34a42538f66529667aebed80f68368209c002a0b5147204828220bdd748bab062b48925af08f15096011b5a03cfeff59e3ca5e042228e83d89f9ddf891d56321da40d73c1ed199ef4c3d284971698def36617adab50d3beb2e019be3c8c105c6a11a9ab2aa5a47289d18b300144a4ba3db514d173c527f303ca7a9433c0e0479e4996a49e03a3e069c5a0c07a49501355f60b6607c3d1f53d6621450d65219a5fd9a7f3f6ef69664e2689b7d8c014a62d82e92552b50a4b9ea2eced9617f0bca12be3b29ab264de989342fd15b392d147274a86b18c6cce027b8328562c6f8887df7ec284205412d5a3f35e248d3d73cf83624a945aa01407dfed80fa3bb52a7f6f619f54981aaa35e045bb5984fba8c9e15f1e86b57515e60f85f26ca8351563ed8643cc3d3b8b7125e1c3015d73f7b41e8c5ad4a8c1474331bfdbd929f45b57baebaa967215b1bae6c23f27e65968c53c96804ab2bde58654e839ca965175387332172c24b732636751a01994623ebb5d2869ac6a794742b767b4ed8de9eb977bbab600f4d064394d7faad42373c511a69d83941515bd1142ea34a7a07c1d6a7a250959b290628a5328c7fc8cf5396fa13d3d4c5e635470e2255e75264d2b18c238f3dd18c69c909654993b5918093076ca77268b2eef133ddb1d28961e14c8245df434bbce2ed8fe629b36bd2ab3a53d6b565c6f4716c9702f94ad516b90a1015e20492cfb49410c2836b5f7c7c51876dbad5698f4f1faeaf60795e9c44569d3a4fb44c66d1cca674757b87809dcc63f8fcd2e3b0cd36ae177968ccba9d4b2aa9906999918bcff6c5f096530e3a308ffc9d8bd522f069ad7402a1c2e8103e867c49627f12aba178d13ee71e022158c422e95ffcd93348413c9172ed8d37de2b997173e556bc7a50a4fb092cfec34b44d0b5ebf5227d804a11c63f83fbff9cc31078d6276aaf073a444757840df629b7ad7a1c7c54ed80cd0b0a97ca1de071cdfb106731f773fb0660cfc7ea5e4e7e774583c41c5e5822636d7f9c2b83a4a6a4017edf90c48550c346f80ada092756f6aed0e11151baedf683120a14c7b34cf129cf573c39c9d59515eab2b526d03c6afdb1bc7582ddca2dc332c89c396a9d373ca7ad6d8ca41cc9ff525054424ac0848d209ad48e17240dd1aa40a0bf4d2746ea5891a20b91b6445a3b199fda9a9b4e29c9449ef795f461fc1c873358909f7b042ac9d32275600f637398e767e2683cf10681d8331515985f02261d42c8523e70bf811c99bc9ad3f8eca9ac28ff82d2ce92baa432660e2056e08a6c1d91493e7d386539f796785611de997890e8c83b986c0888895efdb38312fe6424ec553df9c8984aa75c790764970079939b9f0a038df5c272844d61e22c4ed99dce424e8ed423348f03a69d5b4d65c281593e50ee7fe0ee22c5a10a5131da7748291e3693617ae94fe584851b2a9f3c226251be803d44855ccf097328782ee5a8c845d2adb8a84b160e2baf07ea21abcc9782c7c2c64b585f3423a3d3f669e2ecef67090035a65ba7fe4409271195498d6226dae2ff47c6a6f48cd791413e64cbd7c4d673f6d8d6194228d072f4bb4189179d71f86a1212261da940e1445a8a769731a7e61c0ee4c6904cfc8515d53ac6d9c20f3b6e491e8393089135e388a8d4b0c004e1cf0706f5344767884d4fb62d3188aa35ce14852829be4d8f1cbf5613392a9811a59f050b50ae13574df30a6ec69e50f39686cee702e077a35249a70652e65a71a2f719c095ae58f3da4396164b32005a7575d0f6ddc33fd3df6ad1504e41c7554ece0b56d2acd910473c3ff5209223d2d223250a215224cb319e76dd9640e9f359b355048e8b5a4f312207aaffe25f73fedb820afb3221497bd7f552964519f339b70b40ba691acc9aa6c377905115269873f64c5a47e8fec776d61d564d41c1405f316019e258275f53d351d8982528824916a7488c15289c6166903978dfa9c9c26273e0d2fea99d593e83de8879388564d4b2295b3f2fbd7b4b7d30bb83de710f05f65a3e50567ccc40fbd7cdfc2fbe061910d869c5fd50bdce9401a68ea9b4f43e28bda0d5375c907ca47b077358c34c6aefe009c1ea4fe5e864f521396dc18ecf306bf7ca147d715a28d86e54d18904abf9657b12432c9c80d11099148d5d27152a2ced1405e626545bf4af7e01bb249a05b289d9b19408d292cf024e4c5215cd026bd6ef9eadbd21a8a8aab98dd3f77ca84a4464a2c51961f25c9942312aff691ed498997f51efcfaeee0958cd529aceac499daaede9c65b670cd0da35375c8db0abd4912290cba75b46ac6e992afde5be9f6a36c12ca2d0d78a5102974aab91f46380399e547641ac272d84450c3956ea586848354f37b2f249e41c418c6d615255221cda72a0f3481bf95659075a8019b603f4732398ba33fbf64254d72e358709889df024623c5424bd66099c06366edacbc7fb6db31ee9ee0a6812feb1c31187c2039cf0508fd790b0d0a3133787db09bd9bab47a894c63ec24fbb37e7b96a2fd01413b5c9c8eccc045c5f83f0ee2d69ad93fe78a4bffd108eb5471da22ed7e131f76468e67f88e8530cceed32db3f07b8daed966aa51264a71d5e7aa037b7a53a3447bd263dc05c7b348d7ab42f9825a32fe3eb4de88f8a9c80dc16db308d754ca42a8c02f9c96e2d5c07b8f9fc172c8659ee55e7c75471377ac547d9560a8edb72ce7d5185d809a39b6dd8622b764cf781a3f1348ab205a10161434ee8f628350a3dca5115fb58d2671e1dd353fbf40af5951b608aa7bce5538a5b6ab0eb0613a6abf5ce7927cc34be0c3c3d267069e16b3fc5b4944a547a538845cd93dd17dee0938b72b9af39dcc1218e9ce00eb52fd96a449f18f84ad12e746d1db549541434c6fb9f41d54a153c00f0b3fb45707f7a8e56e471e3730b46724fff13075d55101658af5aa845bfb7ca1ff18050c98a223b5c0d311ee3ae21d229395941516fdc4feb710869c3d080db2274a07db75e3fd4ff6ac2e9f9a349352ee0d7fdf5d68b627460ddb7ad6131443c46609524abff73709abb2ddc880ba98ffefd543eb021b3dad89aff05bc2405b96755b1fa803f130b5eede74236e6c5bbb94c518241e1be50d3248b2bcecefe08f8cdbad1a7b1da4e91962a536a3b5573248fe34ec443196f6e4d7d9467e02b4d74fcf5bf718a5aa44ac0920424f0035ed16c27fb0b6ff9a49fd0ae6c1a7a2c5784cc895779c48d384102dbdd066fec3c1f7deac3ca81a9ca7b52b82406f103b9c3dbea9236c169588a146b37f2bca086eee8d6aee4e9cdbc4091c5fc4d5abea2c667f65fb7e69d84352731fdccd84cd82747908fbeb963063aa583769cabd03ee1835cc2cc6778d5aecf8a611509cbd8c075a68b9b50c24ce5d7617988ffab45b1d93659a13accab9c1822d6368e678144baafbef733b73cb583690e17838f8e719d6949f18bf189a53f8c7de5cace178fd373da19f4193c2a8ec9aee4638da00d70c276232c9aa7d5fd9ce7c13b6b3ddccff1cffb587cfd1505657fc7d08ca4d9b3d80a3d1340919ee426afc7fe775c7aa71d45c75ed5b20461af903fc647573bf9e16f501d3e1146e83a3ad45bbf5520fd2bc7b23b41a4c1dcda76217ed2d02582867aedcea5938b71e525aad7869b8d0e8f6a9e0b73853dfc42f00ed51d3d297e8e0758715bd96854d29756fffcd94c3aeebc88da536139acda10fa3f553dd6f6590654b05f304203479c1328964e1ca0abb0d4771c888c4ba3d5b67cb19d1988a64a6b21c5fab3683a8677483f282210d383a73a779d1f926dc977bc3d016a6e66d025290d298859ba1df82e09c5dc82cc75084cd9a7998d37d53c75b4ad4a695a8673ba02f4cc3bf437ed689d5d91091e82465ee4d992605c6230a86d819eae25df4b9bbf44f4276eb58ee79b86a1b1af74e9095c64e571cc6a9cc372e1cf48bfcb10b45bfc79bd42802bd96adff0a0fdab7c7eb05b79522bc385df96bd0d54095356a2d2afebf7ca3163eda83f36fbecb33b5a75504859607e75e9d896769b4dab5bb31664946db3934758ab6aaff4c3032ec78aaad64e959fcaf96437d0b8314293fd09558303b9dd6278c38385c69f5f63484abd87249580a51ec31bdd5622b59a973b6dd73426daee346dcdae9f665050483dac72f64d8a5dd92e73739bfe0d4bde767c67a133b559587ac00095b39c409ca9c4e7cb09e95eeb8c445a18ef6e36f5fdeb9ef3fbbfd564680baa2117ebb940de8748716dc93245984f943d4316698bdae958aba0b1df1516ac912469503214d4a85605f5545a93e16b49bf2552af63f956c95ae4e91fd42d46a06131b470a272d0dae8ea0611e14609cdd29055256f97bcb4586d978c22c7f4f38cf1d80b8054e379066e36fabc2748b173f4485deb578c7b3f979075386f2d81beac1e906ed0f27d602d3953f61908da8f97bb0849a989228f3c5ee59e95218808b6755020605f4b9984f89b83043813731acbb3d20ac2cfa765d70b8861cbac8b3e88c3d002702c89692dd7eac7d6ac796a1e7a9cfbf310c756de3fd9c61d5e57477ec42b76e987e783b6b573fe7653fe35770376ff8172a2e66fb0158932cf2e9490555f1d1b55e08d9d0d529a803ac58add6ef767913332ab4df511b4c696d1fee75960a788659cb3da4ceeb8ced94ce857924786101bd42d691305e3484b9e2c49aef57986c6db69fd6ba21891d39a53cb52c0084ea3733ea44ffcb02008310566cea6699ce633138e5adf3e4ac2bfd8855666ebf0169ef11146ad48bba585dc0ca73f62a584344c7b226ba95df76c8efa455425019aec5ca016ffa363d28858eed672dbdcb907289a46db333a31d73d21b9a847bcc51edda3a2285a5d45b574dfb7ab3bb816de33f1b26eb077881589fd67e7b653f45804d2affab560990746db21037aab5abe3a3488fd7d37433bc7047cbf993cc9c14d3577daa2eba8f92300420829ea37b5fe8ecdcf99572978c09c2f1504520252d5a7617e498c7ae174fd80f27810f340fe81e1d39709be160e86e4a358f8ae7bf6d69668eed7f4778deb74e30325d0b17edcdf10079e3784316429b1fe40fcb673cd3b33173603b67d5da57bd5029f2190630e7841164fb55706775538b69a22809ca3a362de3e13e370ef8294f4a65195a807e04a54bb4b12ce7db760b78cb64c5f63634e73cd934c53682f57fcffa14e2d5d87bd094b2021b8dd73d64d5a4b83b9edce237796475070b06b5afb0f53e9da50166adf94e3fafbbe0a6d44cb9ad90d9231ba93f2f0d69ad7ecf8dba414569629221b9c674832dce1766d27e5cbfae16c3801876df5da537db9c7ef5d4afdb840d79be14bd656f337e55f1c0346dedab04655c784fa26df2a60cbe985017050d650d0009194fc7bd8f26ec804e09770c60a7a5c06f41b4b77c966486dacc74be0f214e322061e86e9894fe12847fda479443eb21290d1d4fe0e23330fd620da313cdd85822ec5fbc4084150bc9b2b0b8af5f43d70a47fa27060f53cbbd35ec15981f3ed96d52947f07719163a19abe6d6e07bd9c422d6ac239df259f176d70586cc5dba93f573129774a1b5ddba5fd957023284c33a3a94fcb3de63d80823b8099eaa32a909b54e96860dea737dbc27e95fa7a1c883dc4a89b0aaba22533ad6aa5c0eb8da500e296140595fd215f175f9cffd61dcd759b54ca24cb93877cd9851b17248d01969850b1094403bd45755e12bbbbeb78fb6cbc1c6a191315b9a81cc1d70848b99ce2d810ef51dce624f5fbbb35a5503999b753d78aaf5804c4836d76f7eedfc448f572e28d2ed438394d616f442a90dba0310595db4282cc2325747797a6564753567b39bb541e8610b6c1c0c6c32417c766743f433dc25207d604044ab20e9a26cf284bf47ad5b64c60a66e37ac6881b6c06d1ed8a460094536db8d755ef19e41e4165411fd4059ae56383ee048bd8a2e20828ac91840dcf22f85b01612ba1570b48944241db19060c148204f80041f8a940200522b90d620e31bc3077fd890478c18a7b8e21fa6005ef0d9ba16b8a2d89a5e37e13c8008803ab8e22830630b560374115098b18f4f2ae150a8c562548ac0dc1cfcf27b88f09e64dfff4be32a1031b2b0e1c292fb19f18be72b92a1da58356e6676919874a7b465d47aee8ec1fdf39e74a97c1c0f1bbe49c902474d6ca07089f2d80c1ded571e5806076a97f7a65943e4b94d8bdc9ea7c1c60889c62016cac32a281450531cd8c8a652a0523bb4493e26bfbd3329c1998bfe2ac7321ccaa70bd80c78c0316721869b43e95e78cf25eddef92b1923f425a139b37ccc8555cfaaa5371db86440c370edcdeed0f2018acbfb633790e34df4cd9a99ed2e7d713ff0569fc3aefe76b56b561b804f792e808c254eb96e079a410662ae291cabc52da7617562ff9a0e932ac6311ef7d9194dbfe5b50f3f370394498f8715bb276079bb5f846fbba37b09a342d1e60c378ebce58cf8bab935b4454eb84150add75c54fb9928f7be0ac3c67ae8f512f88ad55e6dab1fa3eef293fdacb2eac17e5f7b01efd22334f016341c8378236e9c51e6e16bc2c90667a182c50c26076b733324d96e56c526bddf857b7437784a1bef09999453d6d57210b4adf515d1c29cfe9bf1331f38cf615be0f0c745da5c28084c507671542021cba13ce659851ade56987973100a255131780c58cffc31ce79e3dcc88db835841d759caf79fe62a0fb044b3530256d2824e027ad4ac478cb8c664e4a6e2cd09d2edbfad045aa650b5d62e96446748aa4a223ef3298835c89902d0c6259f49d7fdaed2adb0771092598bec33b34e386998159c80374bde99940923d6abf9e20d9d174617791781ab2ac41688226c195a8eaa595a4021a7d844a6d9bcef8bb57f61d19e7389124cf8ba847610e483b434b3d086af4b956647c9fc4e5ba411d625409117c1c6897b069c88239fcb86e12de577a67df627ccd09b4f3ea8a59c2792338109c88576f9e26d32758ca3ca07afc441de67c67c69117cf9b8db54e6966565fb6533931f254f87fb9c2e91c8106e2f4f27045fd9cda6c5f39bbfbbd65d05d6b1bd41f7282a6eddc07caf07d9b415381a53d64a76f4b5799dd66a7165fb80bc74d30fba892a6adbdd8ec355592eb543a29eadcf3325ee5556101366f7ff8a4214792d64a2a2455e6bac00c2f02e3d4842bd3f4c1a0e8371316d8f41dc542893997caacb3d3f3dc44a26c07504952449121b9b98a993df609cb1907d2f09added3bde2be30c33fa17f9b01b9b7abe162f1688a871d81c257147cbfbd1359a607ecd631cb253cf13b1861ce582de6d9954f12e9e1f3aba60558827a57f4a11edfb51e90ec18f82b5f2bc055b09ff2bbb0660ee095cc0e27f60cb113641da0a149db5ff2cbbdc2c149eaf03d58414d02edf825358f834370319fccee5bb8e220dac9124577c389943937aaee97857c69e2f07a0c8e7079ead759f74cefc5a1cf18c3642a6e992c528f25d041dad68e012bb27804d5c1103d49ca3e76839f7982a1a91081ca157e602d4ffcbeb0a70f183db37533b2f4e6e04132b5f701be25c8b2b25ea6863be86f465ee4ed2965aa067827ccd584cfc16297530ea73e6d8667f807473e8e4a2a10febd3c2c36371201f2f0f804d1221b9dccf85043cfc95442fcc6d83466bd516feaba8bbf1e5ec8763cf7987fa72c1ca6f0400cc211e3a0f49838d73d2bdf3accd196e4b48ce0ed7c6c505ba6bcef0e054af64c775fa30fc1b5eb6ce91085a35aaa3ffd4d25f0d48a079d701967fadee2168851c3a885ad7b3da75fec27076ebfeedbec50202dd9290b097dcaeef35e1018d7411233570cf782fe147064bf4581a64dc9f2848b9f725a9c23245a025fb6947b4004502a9c6b37fd2e8ab49ad910007858a12955fb43f367b83cf8f0589074548ef47aa4a0d81cbf8e38361112194de96b2e4441f403254673d005b7b576df71ea283867ef947106105c0b71ad5c6823aac9b2038cd766913a384f45c9f31d183585b624540a9232c69611d6ff5872a0e0e6c4a0d9dced7a534374b2806245f65bafac79b6ed73f836a399e9dc241f12bac86f9d3108d7c1290c1177229fe1c34df7c82e8431dfa4ecddc6fa1bcea29259af44a0af28f3e556c97a6de250ea3c3ce0d94938693019079e820ae123801594874fb34c07df4ea066181c95741ac269def7ea904428fb31d2c8526a7e2c82c2db5a5dd8a2527a62da128743d7b7321a13cf3942b9013b5fc5ef6d7cefbd21e0414344ad6dac4280a838704087632185487cb31fd18c63077b5e9ce6e9cfe9066ce9fad7cd659f187c86d981caa8aa0522b7f740c8204fc5090df1e28fec506d121db9470485c09be4362eaa84b863abee0a78ae542b89ae387de9268942a0a0dbeeef5acf1d30daa6e7cbbdf25595c807f995564e1999c0cd77811a3b1250d9ee6facbd50baff1a2d05adcc10e909a4f1955a6593fa386e5e2d339ad700e2082fe2f295bc57cf94c3de0e39d59db98140e450d6437dc71a7b3701bd7e2f4df2bc0a9ac3899236e8436a7511d4fd66a8525f908b323342ab486846bacfe39c40784324b33992b92609cc1d69b5a95d66249b77d8f7a70586fc2c0f22a95dfea5373de46bffa347a3c2394c33afc9158f7cee876de68543810f227582fecef0dd01599cce2c5ea24c734422f7ee88d79cf3be3f57ee8baa83eae1d770158568a0d9a0b76d06e36f700ac6637260454d446089782516c34d710c080e67d4d1bf1975d80f9ed200e51b4ca1a89a462105f1770de92a83f2c62cf2960400b3ccf66dd6cc762a0a676c0ad9a37b130756eac88a9108551d63b3845d636cb1e6fcd0fab6ef33d80639c811f945b28ea7ddce0b436a968223ddfcf09edbae685ead8397357fd60ec9114f9a1e78ab56357542909db35b18e4d78b5ce89ef7d270d1589d26ce7e4493d11da5561399dccf3cf0656c97062e8270f8852efab368367706e7f58905195b2d8bcb78393c14f8e93d34801e9588cbbdbc329e6478711c6be1a6584c9b5b0c51ff652b911b2fb08cd515d899ecf2aef0459aef743e310f29e76eef82de3737dd5e2d9db440469e70d1b4e6a0e4547350b1318860b495eba25bbca71b65c3e520d17c7508f579195965a53d8e907c583b33836d008ed347e8de87e7226821bfaaaf69b13bbdd949f28991437e906be74952543e5318d3b7c0ddae7185baf09cb8e484004302fa04e3cdd1896db1420c96f65c0e79aa093de9af27e67bcfd48731f41c2bc0ddbc0a05d410a4b042336deaeeb129fc9249e7c97ff059827d3d139b947fa974b397c5136b0e4c1ab5230ed6ccf55653dd9410294e82de8b1393ea5659bfa86434ea96326a9a559d8da070415c4b253ab92c403132950f8453bc5d5746cbf72883d2405172b874aec7a86983592bc88c5da64ec4de4f2b9d2b22f6fd99b9d91f523ac7c94c8b45282b92e33d23fec7e3a665e27e6c420b5b5ed9824699bf639f0b931c2d3a6ae5ce2f96d73e3da25159bd17e196914d951a44372495b7fdad7aa243c15b48256eb773d659b46eea59718e273bf780941a4fa49485f71375a4e65a3f1306563057cdea22665689f74f46d0e4abc97a1ea42b12f036a2b99bc73ab5139fc25e0f0b233b964ef04a8c38c8e9ed37c4d3f8925d713e09a780219b7e1b67c78bb47a0ba366c7eb9b653f44d694919de1c521c5a3a470adaebbb25a7a2c6afc6eb72cb0279ecfb1922a6a4aac77a04672e3b1a1199cb1e4d555d0d2cfbaa97d90f356e65b65c4fe3c8aee2836f1b4d768f6344644dfa106b9707ec8513b481ea1607fd43079680062aeb8dae2f7f919658c6ba66788d596b1d1b0836bd85d4329355de6b797a08772c4d93d3482cda860afdfcbb383ac0c6a0f37d2f9c7fa5b2a1778862a48d8e38f4d115e2a8109fbf56840f2b6a94897f55890807dbf0042497ee5dd2c90717ef44ac86e8f8bd399505e4a22343ea2a3be280a9fab3c97eb9de69020efe49ef4950fa19dcb7683942d41a23bb5659505059a853c9a3a49b588aecb18cbde9dc996afd726114b172790c2c78d70e6078dffd71517eabce1234105b854e88c0dacce5c20b28440065213a3fad65a5f06468be09b21d627ddf94a456ea367ef1c4cf03f2395c3e9e48d125a752e91713facfebf083ccd82ebb2a47577e3e8da5fddb5f3ed4c89b94e9e5abea9c792664120889262360340bf0df892256e7dc3eca33a6731937d19894c98f068f78f663c67d26f96f1ce3facf42d52fce5756f41132556a79903503cc6763d1b3f9ca431e6554f1d388bef282138b876f0a261c6ea3ec90f326713611f2a5f9e936042fd2f150872926af0309fbae55b99349fd7d214ebfe2eff60276fb6e2a1408276d110ec480bb833e3934a8dbb574fecf840ad48cc3d2a2b40d6ab802aad7ea2311f18e42f69a855b733633659714a4493bd9b640c5ce50c4215c0608887c9126e047bd1625c8713efb5b48e08b3980ce7ff9fe9619366e4700b074511d6ecbf490cc3ee5563994c27957dd1c05ce645f08b529de030a2358f347bb27723a6f82676a9404e36ce373e71dfb82ff65db4ee729d83f55d5788381fe1633c3eefc6dbb0c0d39c377fbd439f9d82a748ff9ab5ab06dbe7b64f26476c15caac6bfdcfa06a19a5471afca68bd3e1d38575f552ee6e04a6d7e92e63013a48ec1155784814c6f091f407b332d07bc33e4b4f9e255764e53ffe51eda2d2833618b836865aa58dbcef246ebdaaf7bafc8d0e2a93fc418ed04a3f4cafa5595dcc7978406cbab28101f9c5d13a1e95bc99d9d324f9cbd5845c90359d9362768c74091117405d94ec503d2854e6c2253c81741fb777a59be1a2648a48289bd98ed10130d4ff4e1ae2d2ee6fe35722937a80281108f3b26f0552e53ca5e88648621c60ef5a0e6f527ec39e2a61ff9d5d363fbb1ecb488f2a8bd58e3a02fe47b7173c63ab22f00344477d25be12dc91ee64217160a1a49bc6c50a76364cfee44e47c8691bdb9e3a0838601d83804d545e8b5a4981f246ab8b0177d798723f25569dd1c23cd3e236b315ad4e7921112ab037a2ace4e3b46092e28dfaf9db25459d04548edc843e7e60217933d02d9a843b51f65e544b4f2dd74fa8962cf04c4d0c1838d8acfed08a6d9ad3bd7615e208bb3fb23b07030d2be9cf32c1b5899795f921d0f14a6075566bd6a8914cabbc1160b6ec882069e48b6b51a66731360b028a86e61c67d0d65271b41511f5227c8c0b42b77d030fa83dc8b3a6eb5591f67d74fb593921ea05573e606e48082777a1cdb04decb3ce7e610f8a6c68837c69d099db8b5bb4ad9eca7fe919aadc9073179e6187bebdb7828394b34b5fcb6de6dcdd1d4fbf96f9f42cdb42f09404f745dd9a7152ac260330408954cbe910aa75587ae7c8c5eedca562f7fa791419816988de304c2caa6d3e24a670d06ed400f046af79dfc5ec8f0947ce5a72de8adf2e143f33640ad634681df9daaca443f1dc0d497fe83c6c2230d7543a2cd62c76a574bea9e9efd35bdacd33f1d777b63904db3ea105f7357bef11d812a39328b2b0052191ec924cf3b69ac285fa86b0af7cb7fea0f3aab7b9b3a9a6f88fa3989602861cd6d9b44904a388d930955e7ee33c6f5c2e397dfb546cfe76dd9778db8e13e95c90eb7c7c3cbc886337519475f427bb235a1dee7a38bc76c112a22f2efc11306471b04deb61a784bf41d9f0f8d64fa2605430ae3da873710f01fd4703818bf636493c0f335f85993f47a63b755191bacbff0631dd2c0d3e4a18b8a74b8fe1266877449b9e0ab4ea3db3b1183357a7e7f4fa8bf9e08eafe2929fc9f139fd973cf00004acdb38f5479a0a11d25de6fef69d471f4b776d2215b1b6866fd434ee1fa337cc8c59670386021092592a073654bed80df6dbaf5ea57531ffc595c9603e46860a9735ee5abab63fd96391cd465145ebecbf2e4118117c63abccedd369ae2772344fdc043866feb760a739ffcf908490325021e3e0477652e9e94f4c03bb8b1911c6695e580a9f5b88b2067e398ca13cf03e4da0ea8911bbec4701da1bdda8c8c829099afb8726acedd3e175f1f6571a6f0c0b9b916432cb9467cfccfb83346a592329e162b24ef4d13942d25dcdff32925c46b3ee9557a32c905b66f8c960abf89d19fe3c69b95548366418cd5c1285c1fcbda6e48803195753e726034b1026d3ef515a0f84bebad36ff1fc58e5f328024eb2b9f26258cc5eb3e76d969f24a7e7d1a14d0f25b6f986d6c7b50a596dea40dd39a0779146552d3553b6ce461e296f2e2fbdca8084c1eaa07a29c33cd5677e75dae990f3c010d0ea66dc13c7b4d7a7f76a472c43b52302bcdade54449240f70c227d50b0510b85bd8b230e811bd456e8a0da0adc9eda80556085a258451350c8fa08e4a26976422ede2c5f458b8c830a79c82237c8805c89d4ad0f848fc453a44e14e06d6299b17358bff2e56442b3b4a9392d6117ba200a49e108f7fb26a7378266c72f7882e8ef4a30f28f3d22d896a39eb93f14bb0dfd8d1edd1a5148753750863f9db01b15a7b95c7e74b20c1a4ac52cc3b6a4346a269dd0b37d374707fce2a9096a24e86b7dd70ab895c31ec903631f908c752209f9f955cbbf4fdcd724d9a32cc29e2c5c50bcb08dd9535470d236e234128827e28d73fdb24c2cdbec5d07992ba9704f421c3e27b1b59676d789d56260e336bc2b73da6fdfedb6fbcbd6e4b38191b8725f38eb9e3395fcc56313efef7cea8facca7a4a9de767d10da6b5c91c14b5ca2a50ba42999572c7bc5fa3294d7033f3f840cebe36470de25f74f0f1dea045720da6fa6079b7faed9f34bf549dbaa38d732e0687bce3f044a15220aba1894804b047c5293214f06ef83bf45a5cfd416f4e2863d0ecbed862fa4b52bd1c5f8eb010e7b5a9e6eef6874f5f5b5f62fb25b2c7d252e6e730635ce9d52bb1f28dd3810d2ec0e3a1dfc9d8a6dde177e3e6265dec79da05d8caabefe921aefc79ed0be5d30b19d29d60dd32e55804a4375488c37a4de10f04be3ed8a08d0c14b10bcd0aa70c8402a4a23ac055d7294492b9a205f9d5c38ce8c255c1be034405e6f4eac59d7a7f9c8441aef8f870b572a760b7d9fdff6e86a3ddde8b5de836a38cf062012362000b0a8d5275092c09f78523dd09fe9323647c2b6c23ea303c6af3a6c57e6725b86902ff83d41552053ff523c8ea1fd41e6372060190a0e8527ecc0b417d80a12c1933c4ff1f1d53cfd18795056192443a21d7496eca342197ea373c0c37853b23fb0614df3230a9c7b3e54861a787b9bf80f942378afe2b4249de26a1357c1da9c81b7823a77cb70ca2ec5e3e7cbd01feadca07f87e6af8a79a523419a7c52e59030e4f979262dc7a6dab4c705c1bccab9269111d7b3f4773eb21c9682ba0ca9c4beed1df424d4fdd1c0f9748e3f6af0a2355966b34d4c92f541c4bd9d0985c7e3753f6ca884c4ac279c95a59bccdcb5718ce5e6dce09cd3d01c7d8ba1b5aa4159c7543a999cea4914a323a117760cc4862367f9ae131388945702fdf8cecb3e39e9884816529e2d19604c65d24de5f01f562a0b21340baa9c1226cf4d396905796781b0f7d3934150a85bfb0f89847dcec1b76b6f3d59e2abd6cd4e01eba6c7e07e0c41b97c7adc1970e5791f61c6f26d4053674573a2d57abbfd0fa18658f20576781433bf23d191cb34c3118c25b845c6739c1046da89c0de3fc73ae3496a083e1e7497278bcb887605ab48f796142fd3e2e6be3c4e84281518aea3c8fb64b1d9ac30545cc93a480b895cb396400b5cfe3eded0c670ebebb8e4125fc5b612001a8a4ff092918a3d8fbc6c3fb1474481f3868c123f86dff9deb085986d056b4179ce66820f91318adf23386eee7058835fbe137079bc14151cead0147d58eff9cfcc91493e3cbabf5891885de0ca8d55662c232e64eb86434aabf420d1eb7f7d9c0b484e4e8c7770f5f10cf60578247ed2424ea34cbb738e77fa9a1db108e44746a7019d12f2ee82ecf1be58ca1f55861dbb2afdf1f02926a4e3122c3f80ee4fc3858531823632b9bc1f4180a2cb31211177b4e4420df8ac21e12311f50603733935c39708cda4dbcc5492e15be7208ed7c3ef63fb58d5388e634aec8bcea347f8098896418dd8513656f725450fc64cae4070ef85bb677ace81b4bd81740eadfa5e80b8b7433f55cc7a76e8b432031c0240532615985e9fec3493556af4b6b584b2612afd28e01d754f1e359c3afb11a0dcf7eaa2118b379e87349a3c6b5f30572bf15155b8bd86d012617276115b4061a745e352380bf6551e62271d5b23e766b36934a51e74186fc4d0055b156be019189de7d8451b652dd150b326cbdc923249bce66ba18065e8e453ed912c431f8a98820941fc3c6eaff6b5f3a41b3fcce8506e59ce350bd1093b6b8eece8850a4153e936768510ea52016a4c72ec111ec82f02f64124da334d89aed3e360c2224f9cf097cc808d2f6b9b7d2316d086aa23715cf34923412fad2328c7905d21bf3b868fd063fb6119af625dc394bd86d2e16bbfd80e25e62840b71a29bd57bafd6ae452749a7516181541aa9c453a096daa88abc1d69415329fc9a6e1557aca6857d0bd922370d3ba86655655a58837c21321a17409a1e1fd8f35e770ebb1db433dd295afae0b432cf25567f4aa7e2e8785289e56f94daaf2a43841ffd479aac188806c1225801f43c7bb2c311370342135be1fd5c558e6177288c952d3e332804cae01ebcdfac7aad3ce3cf63ed3407ab3cb71c267e0c14f9719975e0e2e8286a37d3d33925c4e78a607982f573b4012cd95cb7def2a4d96e0ab33bccd76b694379f1b320c2c6cdde907124dd9544b2bd90e1b70816b8d8f03dc320b3a9aacbfe97dad47809cfa99c287d75d55c1122a80c8f434a48e46a3ba3fb319eec81ac0b3aaaf25e36e0d7aeccdb12f56db06928c1bda88b0651913e785632ddebaac7a2feace8e8cf42f7a40dbc49c6d5ece9d50da3ea7353bcbee2d7687645bc2e8686a6847eea1027d22a743588bf51c978a3b5e68a5fd582bc41a1a2c5003388fd012f8aed644266d6e47dec3eb41867e05c727f9441f9c136ab83c65749b1dbb9ce91749a6a03a798c56a2cfaf34c3b626400fc594313eadcc0faa079e670f40650b49c91ba4c00eb66aa11e3f6139410616f7ea49ca0514b34e575787bbbf91e1cb5c9e5db7767501f190f62dd628f976490e709a6bc6a10a3d6a56fa0252a81ae44a3d75c586a0df91c84a5acfac57f49746fb20f8ab04b147c9d815f997c37b6120158817a354f33f001cf38d78772af8e16c511d77cab9daf16fd74eeb714efc713cc036f9b45e547a677ac5e530207a11e3c80b6f6fe281880c2d030b3d944c9485eec765ad5dc5ee3b6086c7f3389c94eecb70110d57100a43fce4e15802be9ea25247e896fd975fde50accab2ae1efc475f6bcf067358c529ad8b03baaa025f8c756ae4bb6129d49b17e2209fa273f6c68e3202567b123372b77911f911e479393cc757fc015ac538fc84046c5fe85fafd9b4d52423a0b4aaae00f535697863ae046e1fd3ceac43e57fb72b72c0812fdd6806a63dfabe679db25bb22bf76e26d792998b82d02f7f7ed19fddddbf9c9cea7d7aad047bd28d3696f323d4face0aca67e3009d4e2ebe1b211ed79f6252e6f72628ca0152a8ca20c2553cd01a522196345cf991ebc4b53c535d1a79b1eb04d8f88ca8626447bec39b401cc245a42f1cdfb5b52d4ec8ee2eba43b47bd0cc47e2514ae14f0cafb78cb9f5ed81b0be8db999fe2e12159b6b494f587da319b52b3b52c29d04b4c7afd9b96b89e620ad8b2809407b31a7437340de6612f6503cd052fe12b214302057d0232446c325943a15ab409912f6e47dffee1a724f4e8edf1ded1016013e65cc305072e1bf09c9b57e67beb9c0ff788c0ea8ceea3d225a3e063d2e08ff12285ac264a57431d58b76463da17e02b79c63b71a1cd40ef0905bc583e2d1a4ffb0f95d84617f8a99b59032e7f807fec23aa6807869c42b2f86fc58bbcd27cbc74b081b6dbad1c5650fea2b9e1d24d92fc1877d383c64f743d592cdde1d32a6c3bc468a681157f9fddf6c1374019eb0e74872cf82266c95a83d21ff5ebc4551b4cac6e2cb176c0a340ceb9dd1f27eecc42af6952e4fe4ad769b0c32aae6ce23020f44ef26bf2c6633fc29c806a7e04405155acd87a521324b8eac4a757c47b08d76b29665c4f9d608238b9b0e7a4f79d3f6388780475400d98fed1b2a2b019b5cad5ee539a525da6c81d75ba60017ce3ba5d2fa3ae38d6da5296cd075dcb893d42c971589c046ea6bd41757c881c4f01b77eeed77957b425679f73b31712dc1f2cf128031b3de288e1cbf7dae42b8165d14651bb4f9320106a004f952fd84a252b98f6292296da507de83842cd4177a9e0b176b5594774c7d6102c237601527db0e43cf82a45bfe348ad4251456fe81eb1fae65661e412093d427876e7ef65352c294c6bfbce31c3ad36f44feaa80ba48aba4ab259c3a54da7d7df349ce38d52095e0dd6361a98099afa63ba6ad99ff0e2e346ab9befd6f3f0ea6f6168625c7b8c28ffe3c908eafdeb64b8cececb9834484ba99b904c71250ac357c6b6766372148126fa349634b2152df765d1c1e749b13414cbc0e72dbcdc0fe72a8d8fd58ce5bf4524d9582227f833f8b8719997644541b25671c80e0eed56cb76e15042d642e2e1ba3ebdf153d082b63595093bb86b1dc7a845beb56a907dba0415f55bef91e16ac6638eaea3e93a549a035bac38d140e1953ee10e2089f13dfc2bd6b19b4390e9b66c4728a3bcad1c2c618aa0276e8a0185b906b0262d3dc27ac9cff988c82e76e89abd0cbe25d3251f125a6f5685c8e23505ad63c09e68ae293f4856cbbadbba8ad31e9fdeb405e6d3c30e0950f6bccf50d7f0bc4e00ce7ce8b2b16ba5363d4bcc24db950238b22fe0c2c4a4d87763b76d308f25fcecd29c7bd4958bd1bfe8523baed2b64620c81cbf5ed713e775735e5d966f480f2efd19c773887f31e36d27bb0533c4e9ca170f1962362ae81bd6fbbbf230bdc440e4bf3cfc0c300360b2f0ecf0737a82b2281b664a920c7f556dbd0e91ceb92f362ef1ea3a6cda930fccdad1f4dc90f7cecd9fb4bbf1fab52aa7861a48073dd2c8da509a83022550bb2b6e1e231b0f7bc067f235dc4f66b8ba430a78969e9392262bb6de15f6d97fb8ae0d589759bfb826377e19423d9daca18630263b1a77a372df8a4885890c15711dd20c1147cb0e61760871a30a67e4f543d513fc42d2256fcf56c7ba5a6bae72e676a6765d0dfc5f5bfcae140a905f7c17be0bc0895f65f2bebd882b60aa6dbfdaef8fb0aecbd1f69451c0cda9ab8574e256f5254a5775200eed0ff342221d24b355de6d12c8f1f792e20c92005d3cf38e31b64db27599bee2d5aeca570882694fa29bce3504be4ba53d4e3a884634e0390800b4a7d0fc0a0166ee5130d8da5fc4bf3cc95fc6d62cbc4b56335fa52588eb424a0d121715a4219e611120f315de573f369f6a40204093cac39c364fc9865c92dfddacf2b08d42926cfc77a28de1f7543ba0517fc15602b0867134c1c1163b1e227b8f07a22ad47e7b95f5d20957c0682636ffbf2b0a067bed257b19f47be81991e9bf6a0065cb683edfff5fd6cf5dd38cdcb251b0dcb5cbbde5c06ed70d7da8da5b1138179a3c17c7ad09c10896fa24e8fd43203fc4a717bb0ad949cc1a99b2b8a7be5d6835eb17831d17fbfdcc0122d1453f7e74d207ee11ca729c1685a11809bc24d3aabca078c4f3251ca710a72bdefc205e1faa095da04318dfb7c46702bdc121587dca8bb5bf6cdc3258b53eebd10e73f2b06d0ced88ee277626bc0e2feb2d560066693f6c7145f057c46fbccc8554b65ff01ed9af42dd9825a90ec66981f3ab6f1e96c7f908ae432cadfb1638f0f84f35312489300e79cabac7c5bc18a54cd2874b4cbe638b17b3515ae2e154cc643e33560964c0983134209399f86dc60b4cd3b352c01db3516d2f17f62b5505a9c3b71206ad11a2cbfab6b992d99bf6f089ebe1a44b5a78091a02c8dc4a4656d941674b45da35da59de1ceeedb2866cead51196a8c225c03995f6a35a422c0183e7260ad8cfc5b3b244483f5c0faae49473d7f10268f1ee3cb70f58bd1532f655715dea142b3f179d4dd596edca13b74c2202f0c580c0e1da6594615be8ffebf0f5ee87c9cbac3e613a5f9ca900f459269b4efa1beb105a767d1fbe8a3a89563deac257d4fe267a6774834ef8d382a322432762db92603eaed8cd62c3372fd127d4e603ec6af508b6f501bb59cf73121330a5b672ced2ad5cf2391a8d16440b5fbdd5f5c06eb08528056e4d494ce3fdfa451685168236aac19ae788b023e601a3e7b68bcd1181a3e40fb14b502618a1581bee1187d23392a0fb9225192708a55684ca3bc2a5a2848540d4bcb597dfad2d8ddb3533eef7f8876ec7f2f4e73b7dba971412e3bf46729bd18160228f7f77dcd519efd4af1ba1211d6b21d68c1b528f575c2bdd2ff62ce9ea541c7b8037101d1b349fd352721a96c79253d4471a41ebf2b8d19ab745747def83dacc0de52013f0b7865867e608d4be36496d49ca2aa75c6c1aebd9d53f7195b68610d541879ccd7284c4752e5c8e029f5cc5bb025810de4f3c808bf9c1c514da701fce1dc8efe3f16f6cab493df170570dc35394e45854ff7c0a08757f682aa2c211010525f41af853c49a48bb03aa36e99cbcc273cf9f20c2dfaa3b89cd2a8b416085e1480ed70cdd00cdbc19e98becdf8c23a1cb5f4985d0fee32beabea7dddb6fceb1571fa79dded02fed8bca11eb3e8848bf435150ff5438d5ea2bb5d9772f3837ebc0da71576f701ecab18ad5af7b55f9841a2050c631539b9df5dfa62b2fdee364d3808bb763bd5e50f38c5d59278e695a3f42e3c85c90961239055a206807ca21b98e732138fc7d2ccceef7f35bda3711ab58683ef9696e9b9db300eb07df3e6ae63b37595cbda1bfe58dd6ba452bfc917a558d635c89d88248b09bc9cb63b3f5bfde6858424e77c3a7118fa469e52fd23edadd5325d71f27e9a4e7a9361cd39cf3f8dfdf489b53221fef74dec08e8b88ce9e2237de2f9684ecd66d9e0844f50bdc59514834e5656913a918a139207340b7bf788b93e9e1105acea17d4377179c2401c871f9c42d6c0c1182346104a7f6c013a30afc99c3f8167ed8655bef4f8310a6699ed911b1d3d189fdf243893ebd96ee985a44a7292ecb299bf9b11e0123263317ccf80780fe33589c1c403c2a72b541e7229ea309e5ea0ccbd7570bf701163e232f1b4e770f10b6f0e611bd5c25f0d34be2080edb294f760938e5e36d2be0a1a5a920a6a0d840f0462daa127f3cb4d6a9fd434ddf28bf8ca72411e4629b5bec57fe300d653b0132c2c2a5040bc120be7374844e21380f5d1380c9f8b8313d7a72e29dbafa00cf44b56658ceb36eddff9f86b1f3576995507f91a4f6355f7cc4bb65c8b2d2c171b2e60b5755a5031a6750d8ef8ff2bcab9138da34ce8abe898541c70cbd9f00b181958df4fd3ed5301b964cb4dc50346b1a7e73faeb5ff193b34c09f45942bf1770cc086b74513510a53df18977c20c3ef0bbae23bfc3de3b5e338484467900891146a87aa51d8a218b57392f66fe9faef42c9dc73178f1b4b6c6c505322e27b38cb2c1832ef366ddacfd08adbb786817d176153a24656bdf1d22df2654c4c168c1eb05218779cee5b69bcfe8f799226e5dee6c24efc6a7e7d92d4473186a92a594b84f65495a2ca6372548832cc6db9e56f6a252365cb65392ce3ab079cb1c040f3bfdb5b63b880dc37f50347489c80a828d3d140dd6443c5aa4a606c1273150458dcd172f688ba4f36bc3ce1f9df62e86486df45b547e9addd23215fd38e5859ce346c148ff65f2ab62cc646b3189367225b89ac0276b16b6828f5dae98e9806758b119772eec13a51340ee51d166d52477b645f1d77222b1946930bcad8f68ef3b303b4cb8669371a07df07fc826df2d17eb812b19e89b8dc9545c84c1521fa5ba2a13c0a98c03e7ac1fc97c7b8db0020db73cabb9019a8852e77dacfaa38fe3cffc50c394e3dc117ec53a5df45b0a1e847669ac8c34860118465428b26be7e97794fa6b0609b34c7b913e5c143db47492b5fd3c5b7e4811a28e4b2bac877106c5dc20675a26f9f2b4c252a7554c1a3620637294aa018bafdf6b88f0ec37be6ecd90fdbe93de1491cada6f35254a916a61334dd9cf433c3fcc9b58a6b13bbe2634636df9b34f5d87940436568edc6de86cf292d1979ab7c685974a0cdd9b752eb49e6243d42fb888426896430e7225afaa24704e428e3b378422008a3c13c5735e90da613db0b5cb9dfc0a0ff978ff4077a657d1dd7c63512ead6c2de06934e3994a71815ae79287ab0d7d562b4eae77313cc6077e47723e9289f527aa56dc61c73e02d8dd54399f70fb5bd52006f02b160944bd7838edafde2436dcc66aec1f03ca70f16fe86b9a0280e356aaef4f614ff1b5de86353d72708bd426c795b5e4f42733bf23d45cb8047cd71676d0c434092e8cc1e571969b28c45eb0afc10a2010c9702cbec48928f632bb408d34b9277d65ef4c716f386bdb4c7259b08cadc345cdd74b8c182363b0f27d97c5fd346a4a6c1a869f2bc2f2e49ca228e8b136494927515493cca94b3d19539ee7425da8c727d9f9e91d35fd1cb3a656ed6dc2f8a8b414f0051c3a26877c3ecfac739ed47e4c179b6fbe8e56e4db97bf2aa5e36207bf2afa314e78b219d8bf0ba8e768bf97e106ea2219120e0cdb8b7634ebc68573b920efbe76de100f61085ebdaae78dd859ea0efed44951f1e763fd9c418a32de5e8afb2d6f093e7b06d1d8ebb0d58073213936b4850783fb20fd87d2fe9e81dd58f3b65363a1ce6df649afa2ebf6945e1fa99ce63e888d9b1ce4e2d72925b29ca828b7e3b15f85a4b1d76902988925bdb8400ede6001378585d6a98a83fbaec108444b3188e167fd36679353422a60092f81e874a7f643e744d9f1fbbe3f73129ca9e7426e5f61d000ef064b6e0383d59b580e7839c0df4a26cfd528548049ab3004f9a71ba261549e3e7a8a2f785f9f62d8ce6ac75c0605b44b43447ec0d35a9e49f080b3844caf6be7bbc9e0fe9909fd4113dc871a6126b6ad5b869ababfc85a890b8bbba850b2a0eeb7ea418ee7c8c6c4a79bc23702a49620f5838ae572f8b734cfd53b1940a81cdfdc6eed22132a74e1423f4df36885ddbf92b16ccaa4b25fca6ee2e1542f6267b7abc5ce973cb2c98c00e44a33ff301ffcb43957797bfa067ea5ca2b111d4f983209c7bbc86b089262d0b5d19db79441c72fba86b60998c51c9c7c373c7578522119f160322e7894b0fee911ebe3e593a081fe8a4b01ebd63c0c5d93c0e54addf517a2ed9aaf42dcf91588eb212c312c808060b92e028620da78b2b10ed83d678d7d4d044a14c686c40b6a476c023281ae2706fcc059af735d9e39c6bfaefc309cfae389cad38982a967f803282fdde55b7fae42a921eb3d4ac7d9428818732d5565b9a6fff286f0c369f79ffc305900800bb81bbc4ae5ddcf2c6f66d450e10b58270adb8ec673aac6a5fa2dae650a832c8acad52640653d0cf5842ef35bf3af919467f2aeb065c34c973ea88532b3ac6d124ed6901da70421678004b106ac17e3115fa0db5c403201fc2da39b3217f2c3795cb427725171f74cba8e6a66c6fecbe9f7a5ab8bebbddb66831b655e57b646415c71a670da8ed1f29de141daba85715367a519295dd5954745f1ab7df146eabea4ea98adfb74593d26747ebfba4541f5a5422a6ac023ca7208164569f6fca48445e81d6bb8e0c0c078501605aa344eb0a7afaf5e9776223cf3325d8d63053f6cd92a3f9f3a80cf79c53b99d6f2f40a53b597f56e4950137bcaa8a6a36dfe7ea9811b893127788509828609e5abb88fafe8cfb25fda01d2b7deb47b37a2f7448340039164bf20e86e8fd7c4f6ac04e0fcf20bcf03c7350543becf6ecaf9493b8de6861690ad729560d67da59adbb5bdc37bc8ef795493e41845d4398380e47a50cc896e5e6809860c9d0e167ef9ac6b1dc7668be921bc9413f0a75fcc29e16ba775c8dd24edefbccc27cc89c46ddd3dbc4f298b13806029d25d257288ed4123f6ba01d1ea2f775b1ae479bce0dcc183db62e2daffbea17504867b73264c6db5aaeab6d3a173d8261408fa1b2b8b89390736a74ed36879942c8efcdc5c7cde2ceece940236c1759f5fd91a83a1e5d9ba4e521c822e7af1638cd800039b7b5b95d063fa2cb18a43770d380d7c3938dfc7afb9118922b1fc43effae3c41af8dc74e5de5d022f9e3b3cc829736866f10530f36bb1efc1b8e8464f583ddd808f70d38cceedb756fb9a9dc8627b017b3bcbb3ed6308325bd2030f4c06925f43be6b23dc0acdb1614dac6f0678f1cec478132f8f11aa18e2759988557ff007d597f5b2c966b21214e8b7a2f3de2c5b6f9780f64206808939c896587e7ad4dcf6a67106d4d6af2a794e3eb540ee4d675d2b2efb572aa4ea717493f2589f0260c679f90d1a800cc8bce5d20297da6c1c33b85759d8a16037262ba89a07bb620dec8b87dcf1868c16a0d90ec55462e596551c1eb64b8b3c4be083c5d8783a49c8590aa130a610b9061e5a47e2b768f3bc9cd05d035581da98489febc87535ed6c830f5c21966f31ea2ff4d42a5c988a261392ae35ceb052f7ecd22ac85c7b154d8d651b97a5a584bbb32bfaa996b203a5841f36d37ecd42a7fdfcea3a2ce2495f3d75aebdbfaeef005055c2e4269b6b3bd1e7e7087839509b28c0420857da3bf293e87a405f3bc04ed8499685fe5a5790e79ff33a277c79d163d9e0d6a4dc640ce69935b0eba92594d63228c6aa401f883296c4441d6e82e1f06d4b47f039319aef17b80b4ad729752f49a5bb4f5ef1202628c163a37adce02dd111b4441021121620bcf8c246ec4bd82fbd7989d903b11d02274274512ba24f700709dbb8ac7812188606921371cb27dda9295aaedf83a85759d84f03f541b777b0e4390c848347a0d647715dddc702dea3c418669d0f81df24040eeb82ffb128e378d52e96496570a434fff4def0f06e8fd5e615ee543b86d7ad915dc4b02881505f60517bca32a4a52cfe13f5d4cdaf3bbf7bc858f6ba07c582f44d80f2a6abd384be5b6fe3d7c0a53a3bcf3cf424767e8ff4b291cb5b8707ba763bc1bd138440861ed6f209e78603c50146790551071b185f85a1cb93c71461d0502064f1a2026f32127409c4e36c2787869d821daed901d163e299982121900b9f5944bb69c30591a6471ab9f0df4d3df3fa2f26e0e2b06712c92a18b13e1f2d3c62b7b94327c459a1777d5e2fed45997411c56e09db62d8eee78dfcb208d4d3258534f176d410c0a654a825403c170e23d4330e816696571345e79d465e40afb3ada31dd7244598e463338bb05e747c4012c0e62c63786a3eb9652ac50435b7edaa742f417b251093b1bd592044e71233ab6ba8c43de06573d0165766ac32799ac5a2f3662b626568133c8bede15f668efa39d32b04852b9c753e8c65c0968889eeee634fc529703ed34436fe1ad53760265c7b4bba8f3b87c6d8d24e254c2eb4ea394ba77a17ec3ad10663fdd1ce82d934fd17ead75a2c1ed7e2f116a3b0f784b3e06e6f40cd854124cecb5daaf132ff0d1b01e51f19db91edba151000dc78da31942cb00f1c8c027ac325aa3dd62df887375701bc570acf3853953eb8ff0d28d5abca6fcb158f3fd6b19d507da08316ae2cf958dfe2d500bc6b5fd9a23bda227da2084cdfdd081e2c128b357e74a8c613f9ba26e4bbf411fecb2019fcff091193f068d0025bc876fc900112e49b551cbb26180b59d8936ba986ab7a6b14e55e12408482ffd6c05b3987564da8542078b52236025eab95806262e21902c273e4b3fee708a719628af6341ccb36ca23338ce9dab73bf28c1c7b22cf24135b17bc3acb588948a16a5f6c791e5474a654521da48090244c611e4e64df053ab395a73aa8eca2d549ab0e5f7172e2e739e724e7bd6ef4ef9c406591d4112697407ed01a3b2e29f2f3615578cff47eb41603bec526f5e38c4b5e7560cc83b9f23ee365c32a8bcdf2c8eb4feff2ab27bb47789d536eaafda5d8dd310f73f86796a1af47a7f6795ac13373f430ee70de06ea3b06f0c3959584f00333428e612358ddd0acc9a77dda38eeb514d3fccbec658961b47ea63acdcd36338e8b13aeebb1795b49ecb630246cc8b0240bebd88915625f94aeb2424b9c2a689a30a8cf16a6e0b52d0158765d7afa68aa5ffa39becec7b95d1c7e46cf309fe8f4e7d6259ab9b19a4e65fab864d2ff07ba5b18e4accf6d10deccdf6341c5c37ef9288e38feb5d9f342bab2ecc69458fd1d45bed81f11f16c480b5b76dc4f967d8519622983feef8524cf211b4e2ca25c5012ace5677fba80edce178d87ce4136e288d01d03799a33cc4fc5b8dd9c8f4b741dcf1dcb65984fe35614fc13fb329b0addf084d80d35577c6e7aea332f4eeb4f817d30d479312659850de724ca62d8ae48688b5da4955cd69eb22a0c3c4edd272f41696438cbba6bf88c325e5936546d100f1836d6bf891a07b20f75f463cc77b641648279bfaba7d7bef1acd22dc2ccb6bcd0b498799820390fcf837bfcf79328ea371b3af9ab04773cd000ffd38f39e20bfdc258d14c380437cc7983e4a5a2c0a84439071b8f63546237f8bacd70f594dbf0323c199df7d5e65ee4c98c472ff45911bbb2833412d1cbf86ac8cf1799e5573e3acd6aeecce8431ad5a134ca66bce390270a1fa86566547c5df198d24f65afa8c24085f3f6cce92c3f777056835ca02927baf17623f33a03987ef27e40999d218a06c9c072edd8a9b18ffeb71685fa38edad7e8afa9bb91f97904a84fb2c380c6ead1c4fc9eb4d132400d9bf2e88ca56067e7c41f24f101fdec6bc7967cdbf30c5412da3a3e75dae275f0b63ecfe6f56bf60523090a7a82fa12f57a09621809d9c1d6a6810688b657660b36041a36b9acd8c384790658b7a30552301d91beb4d38ddf219c20bd21610a74416f0094064e0b69c13091d0d8c8f82217f42f06af2ae17007b81f0e68bb9694a2b26baac29fca0525d3d7576f46ad74f3abea91491fe0c742922d27a7de12fd50d0341ae3e39252fd7e8739a5b3d30cbc29a712da7e387935c5505285a4e26881beadbe75314d128d8891a0ed340db5dbf89fa0b3f04a44d67835b11e1f8df19641157287b21b958471d40403690b473d58a56625cfc67599d1167979dc67f3d08f80ea2adbfe57d633b5450cd33cd9d84b802abd3d7c0df09a904600cf42b14fb38ecdacb559c7aef1afc09229c63727b9e533e73b58d089bd029f98770da78d550471fc357ae2466a7757b4967ae4c16790592cbb4d046ef7a54edfd8899d55f2c896263c664a4ae2220cff58400b44689f1dd76027c403420394bd4ad46e6766fd374377d73b3efa91f808c66afee6b05c0826acfefec2235781686fbd9467bd79c9c60eb8cfce5c2d7faf2693eef59ef35e4e9c397e7f9ac784991a3b447e19c8a470bbdb6d1dc548e77280003bbfc745da2ea9c71ea97a7bd3fc72e11b2a136012e7eb6753bab9a05c6f497b5597c241ef46f07bee56c9674d310826f8d9179561d8f4929189a0b201266ede244bf807258681afba5a4fa7dde269e40ffe7a8fa219943cf6c5f25acf234b87a6fd4448827b0c74897bf1e45ec63dc9d0e55ee24277d17ff70c134347f209e802db5225d3f2c38a5bf3b021ce9a6c27887dc9f124d35c5cacbb115a040d0aa9b23fe584aa59de2fe887b41c84d7fadb3957f7c2d27ee3ad2614371b5c4e05449359a721da42fb1b1b5d982c1e6552bf088e3677e8cb6bf2b37690c93ff1c3aec319cc1a355ceb859541079c24bd42944a271845c35cb034e1bb909814fe1024f3b8715d4fabd46f670a4fbc976b9192dd3972c6439187d7add61ce52c1f3ba418268b22ab5d5561354b18bf95ff04fc229fb31b8809420ccaecfb3f9d4ac6cc950e57230acfd653c4f36cf779a0ad80cb412d0e4511eac55562b82e488c648875b5a0a213e22d489b6a9a2b5c553a02b0d7fe9e0fa2c7b19438df71f383cb0105ff59e3eabf465bd142121db742b5cf66f9f640757c4d71704b02635fb6a277eeebe8571cf139c0cd86f341cfbaa41eef1ea33c0d3114049762098e602b86fa34ae05b5c9b99355cdcc14da3aec65287b038aa9f1aaa88eaff0c4c02847d873e64a63082c8ae5e2df0c8eb67e365f75594b37b9492c7bcbe718e17d59f0d757e8762df7453d02e05232246492e28bde0ad0c9be42aeff130c86fde6efc57733dc3a13dd8c201e3f815eca4ee504f2bfd92e228cd542c3b7d94804bce4e8383cee1812f98eb08d2cff2b50ed58797b3356067c50c4d2977ecf7a8e5f0452538af914c8f540b2a90ede00bdf2eba7a67b955cf25e664ed982bff16a8df14500c23de0ddc2a894550ddd16f905ddcf01604d37853fbbb29554be0c69894a5e427dcb6073a027443ba2b82936a296906401a4b89775feb22fd7f46bbfff9cb51361cecfedbbd223f606c02f4231be2102a57128abb25fa492de1efb3c636376eba026e4ced4e7acbc5857bcedd96eabea601e75a6c0bf2f901edd0cc1e77d7db728b52630c274f726c4fd952633b589948901d225b85921882ad65e614add9846917b502d7ca940f4f145d66c27bf37c16f954478d1b947cce9e68d8c3b05e69784b36d2e3e9ea6daeaff10fb5939a1108ce64754c470dab47e190a949ed0d69891ee0efb2dd7ddba0b9f43b642262d7e5cdc7b5a7c5194d7f82539bac312f7be015b18ee58cb48beaf3c9e73e4cd9181325afc9340e88244ab5ce5342b42dfd00a3d466b553ec6d23b9ee4fe61968c66542b83e22dfcd82a5109a59814f5ef6ee7aab6708d188747468697320697320612074657374206d657373616765
verification time = 34 ms
signature verified
forged signature verification failed
考察
上記結果からまず分かるのは、pythonのような単純な実装だと s (=short) の署名アルゴリズムでは数十秒もかかるということです。一般的なIntel CPUのノートPCで生成した結果ですが、Trezorなどのマイコンで実行するのはだいぶ厳しそうです。
なお f(=fast)の署名アルゴリズムでは署名時間が10倍速くなっており、その代償として署名サイズが1.6倍くらいに増えています。
今後これらのアルゴリズムは徐々にSSH6, PGP7, X.5098などに取り入れられる予定とのことです。
X.509についてはS/MIMEやソフトウェアの配布その他で使われており、導入する意味はありそうです。
PGPで使うのは理解できますが、SSHでは結局内容を秘匿するために鍵交換の部分で離散対数問題に依存することになるので9、わざわざSLH-DSAを使うメリットはあまりよくわかりませんでした。(内容を盗み見られるのは良いが改ざんはダメ、というのはあまりSSHを使う場合の現実的仮定ではない気がします。他にもSSHに関連してDNSのレコードに公開鍵を入れておくユースケース10などはあるみたいです。)
もし鍵交換もハッシュベースでできれば理想的ですが、現状ハッシュ関数のみに依存した安全な鍵交換アルゴリズムは知られておらず11、マークルのパズル12と呼ばれるものくらいしかありません。マークルのパズルは量子耐性がなく、現実的なアルゴリズムとしては採用されていません。
鍵交換と署名の本質的な違い
鍵交換については、むしろハッシュ関数だけからは構成できないという否定的結論が出ているようです。離散対数問題に依存した鍵交換、暗号化、署名はなんとなく同列のものとして見てしまいがちですが、本来署名は鍵交換や公開鍵による暗号化が属する「cryptomania」の世界とは別の、ハッシュ関数だけで構成可能な「minicrypt」という可能世界に属するものです。ECDSAなどの短い署名は本来minicryptの世界に存在しない飛び道具を使うことでデータサイズの短さや計算時間の短縮という結果を得ていると言えます。
図: 計算量理論の現在の知識と一貫性のある五つの可能世界。ちょうど一つが我々の真の世界に対応する。(13より)
最近はこの5つに加えてさらに「識別不能難読化」(indistinguishability obfuscation)が可能な世界である「Obfustopia」の存在も提唱されているようです。14
参考文献
-
ハッシュベースの署名アルゴリズムSPHINCSを改良したSPHINCS+(C)の解説 https://tech.hashport.io/4624/ ↩
-
ランポート署名を改良した耐量子署名アルゴリズムSPHINCSの紹介 https://tech.hashport.io/4535/ ↩
-
米国 NIST 耐量子暗号化標準の最初の3つ (FIPS 203, 204, 205) を確定 http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/08/post-15b135.html ↩
-
Simple Python implementation of SLH-DSA ("Stateless Hash-Based Digital Signature Standard") as described in FIPS 205. https://github.com/gmh5225/slh-dsa-py ↩
-
FIPS 205 SLH-DSA / SPHINCS+ implementation "from the spec"; findings https://groups.google.com/a/list.nist.gov/g/pqc-forum/c/n4J9zH0yo4Y ↩
-
Stateless Hash-Based Signatures for the Secure Shell (SSH) Protocol https://datatracker.ietf.org/doc/draft-josefsson-ssh-sphincs/ ↩
-
Post-Quantum Cryptography in OpenPGP https://www.ietf.org/archive/id/draft-ietf-openpgp-pqc-04.html#name-performance-considerations- ↩
-
Internet X.509 Public Key Infrastructure: Algorithm Identifiers for SLH-DSA https://datatracker.ietf.org/doc/draft-ietf-lamps-x509-slhdsa/ ↩
-
SSHの公開鍵認証における良くある誤解の話 https://qiita.com/angel_p_57/items/2e3f3f8661de32a0d432 ↩
-
SSHFPを設定してみる https://skubota.hatenadiary.org/entry/20100304/1267660727 ↩
-
ブラックボックス構成とその限界 https://tcc.c.titech.ac.jp/yasunaga/talks/crypto_school_BB201309.pdf ↩
-
マークルのパズル https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%AB%E3%81%AE%E3%83%91%E3%82%BA%E3%83%AB ↩
-
「メタ計算量理論」について https://researchmap.jp/shuichi.hirahara/misc/31537816/attachment_file.pdf ↩
-
Breaking the Sub-Exponential Barrier in Obfustopia https://eprint.iacr.org/2016/102 ↩