#!/usr/bin/env python ciphertext = \ 'c167bb7c6f35eea57d717af50254c91a8f35351abf9f88a4fa51f89b3a5f35087905fb' \ 'e301a55e0121793f8aa697007d2b25b3bdeb849944d98d301cbb5b5f8209e093d53cbd' \ 'fb542a331bbdeb8499c6d5e8905c20160731dd84a8cd75ab666320043a2cc81905ac75' \ '20905c1bdf86828bc0bb06882171f484b576cd2e35e8905c20905cbdef021750a3a835' \ 'c921e777b883c08faea9c62403426a0f76cc7dcccf77dcc5fa794434cf497d9bc24cad' \ 'c4fa95fd797e290ec83b57cc4f8d8036ee7eccfa76a21380a638a008a9820f46eba512' \ '351cfa7eca13ba18f47c79f401a34c7eadc90d31f404fc94cb53bf98ed7dcdbe253d72' \ 'f5bde9a4f0834c0da36ee882a697007d7c79f49ec0a4119d944d1b5f828bc080a2c07e' \ 'ccfaee4cb39347a10430f4235aac94e1a47779f48be8bf821b4721e39e200942956f86' \ '9b3a5f3588d098c26e01b1171d92549790170d274624ab6e17c24c01b7256e55c9a085' \ 'fa3d663517d47671eaa6bde9a46e57e2c9dc94b8034a9f8a13c8297d7c7921f075c925' \ 'cfa904fc79bdebff2099e6bb4f49c630168b7a9de8921a8b786d35087d7c79f40aa3bb' \ '828bc07c79f4fa57eec7c213047af5f067deb433472ba39e2009d1cb55fa8026496ed1' \ 'e6ed335fee35c9078bb17433ac1d1247eba51293ee382b25b36ec55eb4b3e3731c79c7' \ '0c94a0ab6e80a638d068e0e882a69714fa76ca4c01a128ba182fbd6fdeb4a7a11c1eae' \ '31d1ef93c5267ceba62094796ed7258233f52080288b6a0f76cc7dccd97921e39e7e58' \ 'f445149ab8953cb883c08d8b847178f4e98b96828bc001b579b43128cb478d2bb72504' \ 'a681a0ab4c119f72ee35c9f015c9eecafff32799eeecc0a00ee78b7cfa3858f47940fd' \ '3d74d5d6af84c71e0ca2fed5b650dbe810fd0c8d5e7178b8803467c6a2c08bec5e4650' \ '3c31fd76fa57ee01a777174227e90f8823ca9ef0e313459494e8921a9b3a5f3508421d' \ '14c9f4ea84e98b962090e635087d8223463d72f5bdeb840db7868bee77b883c0803461' \ '76324725cdc9359a89e53a4720845ecd38f425cb4c3df47997007d7c79f4a08e6b0a20' \ 'f520829e2090138d6e3571ec267c79f499f594bbcbc051ee6bf075c9c9393c878bc001' \ 'b57917d625c93b472173b4f0f57675a36ceea313ba18f4fa4788f18562c9bd767e2f35' \ '93450385892d01217d7c79f418a57dcbc34cc8ad3899422702c438994227f097d5e104' \ '4527f1cf254f356ec39ef0e7a9947775bd7dc9eede726ec7359bac7d04fc790242b81a' \ '8f35358e77bded7d4644e70db7869b2a39c6b2e34d6db3bd6fde4d8bc09850f48f0e35' \ '7eca84e538f4eba512351e442167358b6e61c632f58b6e8ded4649fa51f80242b8c9ca' \ '9e97007d7c79f47e5cc9c626990aef38c6b0e69b50f432796d2a25d9b0ed5e21e76b40' \ '2f99187cc99b3a5f351cfa822786828bc0d61b57331b4723ce358b6c34cfd9177cfd94' \ 'c8ab9e250e9920905c20905c209017821b4711090195ebffcbc7a1caa821b427deb807' \ 'e78b7aac936e492010f49622277eaba6f07347a49a5494f786828bc03f1a479351f5d6' \ 'aba601a1d021e3a62082a697101a99c26e76b0e6c624ad64b53c8f1a5f3f8e842bb54a' \ '3508d16691ed717cd501a1288b7e44936e88e810a320845e8bee77bd6d94c16179c626' \ '88adc4fa4640fdc6b43c17c45ee7f725873dc93653b4350c34cfcd380d27decb53b46e' \ 'c735fac3ffb8953cf0857d71eaa601b179956dfdc63675fa51f8e854c9eecaff3df43c' \ '6ec384e90f8823ca9ee854c9b8953cb883c001b5796ed35405fd94a011f401b5790c90' \ '791d9494bd7dc92ba39e9714faf115fa76c8287ebf91e892ba35089380a66bc6a2c0fa' \ 'c738a4c738440a39fad7720133ac9378f801a73880a2c074a128717ed30db772c62646' \ '20905c20905c20905c0aa39ec754c97178f4255fd3829900a00cfd936e9993c5c07ea9' \ 'a420845e9786772080bfa095946ec55eb433f5174001efea4c02c0d01d96866ec39e17' \ '4001efea4cf097d569a3a4e810fd8b7af57ebd79add254a4c114bbcbc079d0e60432f5' \ '118bff01a738235cfafa51f83d70f419ac7dedcdac1d9686e5aa840c962c764aa4e5aa' \ '6ee810fd75273571f8e6cb55fa94f7863df2e331eb962010f4b0e9bf01a7380a20a927' \ 'f77d3f1af52082a697944aed23a440bd3c8bee77c56dd9200ce7bd6fde82a396bd7dc9' \ '9351f5186e4924b1e62082a69780d01d96866ec3138be828ba18f4e1003e1618db8788' \ 'bf0121790c8677cbc777b8d725717ad0ca8e6bb807358b687d7c79f4193cc994e1a420' \ '845eb8074601a55e01278ded2749e53cc98b687d7c79f47421fd45925405fd94a093e3' \ '01b579f0f77294e3848d19f480a63801b57998c2c0b6c38494e3c0192a393858f42b33' \ '4725dfc093fa54c93b47fac39e8b6c34cfcf77f061a9c8af6b43847d9bc6380c8ba6b0' \ '6b8cca3a47a4c396fa51f86e45fd0265b3ee35c99b3a5fc6b6a5078b9e9b3a5f350842' \ '0da3c08b786d350c34cf497d7c79f402e39e7e2f9994e5c397007d7c79f466855e0432' \ '9e4512b48da6358bee77b883c001b57917525d7e2f9932796d2a25d9fac7382ba3a67e' \ '2f996fc63597924a95ef0893d53cb883c06435067950f46fbe25403dd5e1003e1618db' \ '192a39765e758b6879828bff7e39f401b579f08384b815c4e8829e119f72ee35c9bdeb' \ '13200f8deea1a4f0f772764e351c0a5de5aa6e35087d96331bc6a2c004fe72fac39620' \ '9479ed4f99ca88283d70f4358e6b7cf9e66ed1cfedcbc01d82c0186e4924b1e6295cfa' \ '0121fdc83dfa7ecc7d75a5c54d0f49c634c4e800a9fdaa842ab7728219f4234e8da4d1' \ '580d339e8d24fde773f59baa84e5aa13ba18f40ab0e6364d036435067950f4a4c39617' \ '442e6615d54ac57d2ba7a92012476ec3138bee382b33470ab479dd25d9e1003e1618db' \ '20843876cea12082a6978438a0810e6e4763f0e3ff01a7778d24fd2010f4f4ec7db0fd' \ 'e782a7380aa39ec754c971fae320905c20905c20867742bf72364d03c1f3ba01358a21' \ '6534cb575e01e128c93fd717c0280436d398d494f097d5e1122ae8905c20905c20905c' \ '2173477cf9e62000fdc8af7701233b0db59436cd98cb417d7c79f4956b27cf49793588' \ '28b883c001b579bded7d9569f5bd7dc92ba39e97944a9bd6a502d476cb4179359a8994' \ '75c96e535d01217d2b25b3bdf9e6d24649a039f479d0e6330f994fb6c1b6501735d6b3' \ '16522b02d46eeda57d7779f4d100fdc83f0ca2fed56435d5842dd9f4ec7db815614d1b' \ '5f828bc0f22db301219393fc76c8af7779506d2010f48d8d7d4644d980264676324717' \ '548af314c9ed4f9979501c24a3c00d31f4350e359bd691bd7dc99b3a5f350893c92fde' \ 'ed4f4680a2c0660786351aac4d1dc921e562c62227c8af6bfac39e29ce77b807464d6d' \ 'b3bd6fdea8a384cb55fa3df494cd2e352090e6350893765e75c626468d24d94872476e' \ 'c1bf01b1790d33479b3a5f350a3bdcc384752799192a390175c97e3dd574a76b2ba777' \ '119f72ee35c96ed579464246a4c396078b8421617d7c79f44d0f492ab772b4a3a60125' \ '34cfcf77bd6fde3de45e956f99ebbe72fac3962080287954fa01a3a69e50f4234e8d80' \ 'b4796e5567f0f57675a5fa19aac066078635087d2ba7355305d90c9d940121d1cbd54a' \ '35181c2421e0e890350579f401a55e012142c6b6258b687df1017d8223463d70f44514' \ '9ab807991d82c025cb4c3d76ee119f7293ee38eea3c09850f4753347984d03e8905c20' \ '905c20905c20905c20905c20905c20905c20905c2004760a6f99eba512359a89c9bf72' \ 'a4c12825cfd5f073479465fdc6a2c004ec5e4644d901a39e1c18dd351a477cf9e6bb4f' \ '49350c34cdb8e6bdfd76eddf12f191e67e3dd5d68f6b8b6c34cf497953e73b80306d1c' \ '9c3c17d47998fbe33a9d79f0f772ed4649828bc0cfdf25f3b3e36fc635f655c9ed5fdc' \ '6ea21397829e20097d2b33476e4339764cd901a128660799078bb17421d1cbd54afad7' \ '72add4949bc028ba18f4047af5956b27b2302feba3a6995257448a13c634c49baaa636' \ '45b3ee35c97e2f99fac73801b579bdeb84a8a38479c4622177d3828b6e6e5567111dc9' \ 'b89594ed5bf5bdedfaeddd76e5bae3fac7380a2327c82f8d7cefa9a0bd76c8ad620da1' \ '5ab807358b6e8de5ba54bd6fdeb4a34cf2af354d8b13cdbae3f2ab9e01a7848219f480' \ 'a2c001b579bd6fdee90f88ddb7c98bf8171d92549790170da3c07ebd767e2f9902548a' \ '19aac00d31f40bb38931b59407e2c09704b30aa3bb821dc97eadcdb811f43f1a5f828b' \ 'c019aea9b4b1e620829e2082a62012470133b49b2a39e989141c88b7b883c004eaa635' \ '1a472b217d2b334717d0198289a4bdeb84c95acbbd7dc919aac07e5cc90db7aceddbe3' \ '80a2c001b1e6cb45b37c7bf5201257a8b576c8af77b4335dcbc76bfac39eca3cc994e7' \ '38c8af6b71fc79bdeb137e58f480a2c074b1e602c4fa01a777f327deeb335f359a89c9' \ 'bf72a4c12825593ceea36ec6a4e4364d033a9d79bdfb548233f56ec313cb45b32b2534' \ 'cf49429854c90db3722559288bee77f0033999d4940e502fbd6fde9f0a39765e75c634' \ 'c41754c921e3bbc6a2c0b4a28479468d764e8680329d20905c20905c20905c640e3571' \ '7cd54872479b3a5f821dc9eba3a67eb9e6f067def0e57ded59f4a4c3969baaa60a2786' \ 'f2ab9e2010f4a01a47fac55eeb335f4d8bc079c2a60c90533598e68b7abf9f8a8496b7' \ '72c62646e90f889bc6380b217d8024ac20866b9b28a9e882a697007de5a865fa51f829' \ '4a3b9f0a39a4473dc634c417c28496a63801b5799baaa6a08aff9f1cc97ebbaa20905c' \ '20905c20905c19ac7d9854c4eba3849b3a5f359c4a947775743121119f72821dc92006' \ 'bb99f5940d27460b2761f655c921f54a3598e697007d7c79f4cfcf3519aac08be8bf8d' \ '2699eba512350e8d5363a4829900bd3a57043247c6a2c0255d8a200993c92fdecdb8e6' \ 'c62646b4a28479407d7c79f4d61b4787838476dec98b6e8d0db786208ea1edcbc06028' \ 'fdfac396828bc080264620905c20905c20905c35c6358da29e7779f4879e25717c420d' \ '31f4e98b9693ea84edcb4c7eafd6385cc96ec38421617d7c79f4cfcbff9f8ac0b6c313' \ '200f8817c6a1422db36e556717c45eb8836ee8905c20905c20905ca4c3966ed1e680a2' \ 'bb829be36605d951ee6b295cfa0121fd3d72f517c2a6821d7d402f99eea3c004e82819' \ '3cc9ed5bf51744e720845eb801e093c5267c79f48deaa617c45e0c0434cb417d7c79f4' \ 'b847355305d90ab0e6e773473649e3bbcdfa95e928ba18f4fac738ed4649828bc038dc' \ '942006bb8d2227cc49d10135faf1078d0d35c9559f25a664d9440e463a8d5e01217d7c' \ '79f4255b5780a296f0f7723f1cc4175040c69e25a664d9e989289f1cc9b815c97e2f99' \ '20905c20905c2006613f0a607c7bf59b3a5f359c4a0db786962227970079a441a69852' \ '47828bc0a4c396bd6b393f8e8424274620905c20905c208677f0734721e3a62518f4b6' \ 'c313200f88f0e7a9c636756e55672082a60aa24c9f8ac08b68a99baa8417c0280c9be3' \ '20905c20905c2000d1cbc777bd7dc99465d980a2c0b847355305d919aaa6c8391c2421' \ 'e0e8905c20905c20905cd6826e765c8a71fe250c867707e29ec6b2aa20905c20905c20' \ '829e2016d30d35c9b807358b6c34cf497d7c79f4b433572ba3a698c6a9364d03e20cac' \ '35087d7c79f4cfcf3519aac00127863598533f18f4b27247f00327e5aac0f23b5d0133' \ '9d20905c20905c200434cbc777110fde79c2a6364d03e8905c20905c20905c20905c20' \ '905c20905c20905c2080b80a6f99024476b079f4998e352518f44d8bc0ca9c79c6a028' \ 'ba9ae320905c20905c20905c20905c20905c20160ca2fc80642503c9e284cb41792171' \ '6d2518f4fac73801b57917c21319ac7deedc941c8a6ca40a27b883c0eea3c0234e8dee' \ 'a1a436cdc93f1cc9f331f474b579ed59f4a00e86fd38f475a3a601a777201a5d01217d' \ '7cebff216179e5aaffb8073525cdcdcb417d7c79f48b786df6d576dc45b36e55672010' \ 'f40764b30121ca1d9254450699757a479b3a5f3508421d14c9f4ea84e98b962004b320' \ '829e6ec3847626351c1a282b25b3bd6fde95fd79216534cf4f8d0d23a4936e8882891b' \ '8b6c943f1a5fa0392feb335f829d94bded7d4644e70db7868b6893e909a6fa51f817c2' \ '8496a6388d24d901b5796e4339c632a2936e9902d24a71fc76f382844d8bc080a63877' \ 'c028f197d46e34c9423fd7e8866b8b7cfaf22dac3508423f9e252082a69784620da15a' \ '1c18287e58f440bd762173bfeeca9e05eba61c080ea40a27b883c0eea3c001b5796ec5' \ '7d216179a4c114078bbb821d7d957d9acb41caee335f6ec57d76a28421e34c66079902' \ '5486e5aac0edce6b7cf9199b5675c6a4c93f0e35359a4aa40e49f097d5a9a3a493c526' \ '7c792120845ecd38f4f2abbbc6a2c045149acb4142956f86119fbac6b625fa51f82082' \ 'a69792890c00424d1b5f828bc075b576a011f42b25b302c2ff5305d9b0e9bf01b57966' \ '15d5d182ffcbd34a7e5cc9bbcbc09850f4e91f83385cc9978677b883c0a4c738c6b479' \ '762239a039f4192a39c63247c8afa9a008d125cfd68f8aa6209d4afad77220829e9b3a' \ '5f35084221e7a9c634d5b0eba671f8e6c6a2c02aa384cd38f401b5799b2a392a331bc6' \ 'a2c0b84735012534cbc777cabe252a331b118bffed592ff0f7ac2fd59419aa13ba18f4' \ '01b579119d760c00d101b389fad77201b179ee23602b21d1cbc777f0734795eb9e2009' \ 'cafac3961c1a287c79f48bec5e45149a8b687d2b334717c4c3200f889b3a5f957d9a36' \ '4d033a9d792080bfe5bc942004b320947938c8a4295abfcb53477ecc7d76a213cd382f' \ 'f0f772351a477c7bf520829ef07347963357765cd5ba8e6b6ec55e01a3bbc63228f101' \ '7d7c79f4edcf84fac39ec78c380c164421e3a645847d01b579ed5dd574a1bff067de3d' \ 'e2c01928a9e7e1288219f48d24d90aa39e7ecc7d76a284a0112f32b5768bf87995eb9e' \ '35087df19389765cc995ef38795247828b139477ee2948ca2b33b42bb54a351abf255b' \ 'f5118bff01339d74a1bf3d663594f579957bcb17c2a601358a8beea1255d2d20921af0' \ '97d5a937bc7c79f4ed49a9c83b57c6a2c001b579f0f59476a21380a63880a2c0b6c313' \ '46503c8b786df6d576dc45d9fac738b4a2849f8ac080a2c02b25b32080bfe5bc94118b' \ 'ff01a73801b579bd6b39f113f5f0e7a980a66b2b35fac8af286e5567f08384e53cc97e' \ 'bfd680263ded5b47c634d58b781ccbc39e20097d2b25b3200686fdaa84cdaea9936e88' \ '118bff01a73823484207725d2165b37c7dd5d946636f4699ef4a4666839ef097d5a9a3' \ 'a4c788fe350879c6a028f655c99700d1cb478d80263ded5b47358e77b883c0e7f79196' \ '22277ea9760d2749a0bfacc8b9e6a6742df0e52ecdaaa65305d940bd76a011f4c83b47' \ '828bc02b25b3f0e3ff2fc55ea8b1e6350893c6a6a1fa57ee29487d7c79f425cd5e0468' \ '1607e6a101a39e209979821d61c93b47a664d93df019c6a638a4c396bdff720db3723d' \ '66358b6879bb4da3c6a2a61742270e5021f07347ed5b470ab4798b6c340c8fd675b594' \ '0133bfb8911993ee38b6c3134644d901a55e013578b817d39b3a5f3508d195eb9ef0f7' \ '72764e356e5567f015ddeeca4c359c4a1d826e82890e9351f5d186a923d81ea44574f0' \ '97d524d95920845e8b6e8d76ca4c6e535d01217df115fa75b594a0087d7c79f40aa39e' \ 'c754c97178f474a76b2ba77717400e956b27f23dd596d8e6bdeb843f8a6e2090e63508' \ '420d334793fc799700caee335fbdedfaa8a3849879f4ed5940c68e35fa51f82010f418' \ '35c90aa6a1c829d1987b47648ea9936e88364d034395946e47de95fd9420868423ca9e' \ '29487d7c79f477c028765cd5e1003e665dd53a9d7917c24c0aa45ecb45b379468d0764' \ 'b382890e2084758da635cb478dc82dfda08a9e200d341a1dc9a011f4235e0c0ffc8017' \ '42b839d1c877c0d0c96457303020a675d55566ad80a635f0e52e9782a61c1a281d04e4' \ '82b5e7c8af6b35089394e313765cd57cfd7671f8e62082a697907905fd942175fa71fc' \ '9421e39e208f77b883c0b6c57d042635294e61f6d3e396a2eebde00ef00339c6a4c382' \ '25d901a73582890e6ed31a350c3496b479957dd5a54cfa2e4a6b364d03e8905c20905c' \ '20905c20905c20905c20905c20905c20905c20905c20905c20905c20905c20905c21ee' \ '8d93c5c9359a899475c920866b9baa849b3a5f358e772518f480a2c08da6356cfd940c' \ '89287178f42173f5fa513c4872476ec1bf01b38996b772f0857d19aac001a55e717cd5' \ 'a4c3966ed579cdb8e620829e9b3a5f4d8bc08d349aba0e993a8d5e0121ca0d31f479c2' \ '9e35087df11578ba1c9a29cc3823ca9ef0e37eeddd940133acfad5799700caee335fca' \ 'b8cf46c24c01a3d7fad7725387c335181c24a36e1c1a287c79f4970686821b471d14c9' \ '6ed35480a635c6a2c074a76b2b21ca80306d93ee38e7e55eee4cb327e3138219f4e98b' \ '96828bc0e7e55e19aa130a20d1cb417d7c79f439516d23da4a516cfd1c88b7b883c001' \ 'b5791744e7193cc9dd25d9e90f8876ca9629487d7c79f43f1a5f828bc001a128ba182f' \ 'cabc9498fd949700d1cb417d7c79f4c754c92aa5c3ba18f480a2c0235cfafac3a62094' \ 'e771f8e617c4c3458028200f8832b77293ee38ba0a4676c8a417d6252559f47427359b' \ '3a5f821dc9364d030aef3801b5799bac7ddc539ecfcb9e358c62e53a47bd7dc9b89576' \ '01a73801b579f093544d1d611d92726e55679b3a5fc6b2aa20905c20905c20905cc486' \ '351a09fdcc4b31118d2e193cc9957b9dc8392120829e9786a1b885c5351af5f015c9ba' \ '88288219f4e98b96985247e5be12c6a2c08bea9eb0fbe320905c20905c20905c9b3a5f' \ '358c6238caa66e556717c6a1ba0e99e8921a9b3a5f350879a4c1148bee77b883c00a33' \ '5d641a5f3f0e35c634d52348421d06359bc638012786c6b2aa20905c20905c20905cfd' \ '3cc936c3ff3d72f5295aac9bc24c19aa84b811f4b0eba6a8b1e69b4635364d03ca9c79' \ 'cb4576119d949f8ac0448ac08d24d93fe63580268876daaa20905c20905c2000d1cb41' \ '7d7c79f49ec47d551dc49345e717c2b10ab625bdf9cf0db786119d768b687d7cf9e635' \ '0c34cbc53823ca9ef0e37eeddd94716e992aa384cd38f4235cfa8da63535087d2b3347' \ 'bdeb84e99f7201a777b883c06601fd979079985247765eee36c9eebfaac080263d3508' \ '7d2173f5c6a2c001a55e01b389a4c73823cc62820b39fa51f8828bc01a8f352092e320' \ '905c20905c2090179467887cf9e6f09176c1bf5feba512359879985247765eee119d94' \ 'ed59f4fac73801b579118bffb8838475210e358828b883c0a4c738946346828bc09569' \ 'fd3df0e6add254fac396e8905c20905c20905cc82dac351cfae919f8c82f35254f3536' \ 'c9ee119d768b7cfaf655c99f1cc993ee381d82c06605d9487247bded7d8b7ab4947775' \ '0c04766ed7ac820f35276327c69e2ce53a4720845e97007df10179358e77119f72ee35' \ 'c9bdeb84c94e990a6fdc2080280430f43f1a479baa842010f48bec5e3d70f4a08e6b20' \ '82a6970093e91b9d71eaa617c2843de45ea011f496a63501a73880a2c01e0f86eb335f' \ '957b5d208f38ee35c4f067de110fde95ef38c95a5d20845eeddb54403b5894e3c08d24' \ 'd9b2f625c8297d7c79f47eca132fd594956f992c8f35c634c49b2a399b52f5f0f77280' \ 'a66bfa51f817c08505eba620829e8d24d923cc62985247a44788f07347eddd76794079' \ 'ed464680b4796e55679b3a5fc624d90aa6a93508792a331b20124717c24c071d67cfcf' \ '77f0e384e98b966e5567f0e313cdb8e6f0e38446503cb0e92814ea13ba18f474b7259f' \ '1a479b2ca3fa47356e4339764cd923487921e3a60a329dc047de6e55c9bbcbc02aa384' \ 'cd38f4842dd97cfd764506993945d901a55e012576f075c9b4a7a904f8e6c6a2c001b5' \ '7917c24c0aa45ecb45b3f22f9993d3aa20905c20905c20905c20905c20905c20905c20' \ '905c20905c20905c118f8d93c1eecb417d7c79f49477756ec128200f88bdedfa8b7cfa' \ '013347fac39eeb335fa40cd96601fd9714fac7c47df39254c6a2c093ee848b687df115' \ 'fa01334735087d956b27e7f1e6255b287c79f407e29e201dfacccb9ec56dd9b0ed5e18' \ 'b100d8e828cd2e35bdfd763df479970042648aff013578cbc3bb829be374a1280aa638' \ '75b1e63598793598e6c8bd4aa4c3963d72f5119d7671f8e6b4b7258036e525c928b0f9' \ 'e625c9b7b883c02b21fddcc3133df6916ec1bfcdbe2501a34c8b68d1cb4179957d9acb' \ '55300da16598d672c6a2c09622277e3d422b33b42b21ca821dc917c6a17e39f4fac738' \ 'eb60a9a445749355bc98c26e012576bfaac00478f425cba601217d7cf9e6358e770127' \ '61fad772012534b89791e81467175406f23bcbbdfd76648a84cb4534cf4df094e34cf3' \ '31f421e3a66e535d716e994872476ed1e694e5fa9477750c0476bdfd76b431f48d24d9' \ '36d72582b3e301b579f0f7ac04eea121e39e351aacfad772717cd501b5792096259bc2' \ 'a6f075c9c9393c80a2c001b57917c0bfba18f424a7a9a4c7382bb7ac3d74d501b579f0' \ '734721e3a62598e625cfd67ecc7dfad77201a56205eba66e4339764cd9f4ae35013707' \ 'ed525f1d821353113c7cfd767e3bf56ec3842171f90db7723641fd3d702f17d2ed843b' \ '5f98502f1740e894e5c3364d8076ca4c0127868219f401b579f0f7ba828b131a8bc074' \ '33470ab47997007d7cefa96ed5940125341a0f4679521bfa51f8f0f7aced59f401b579' \ '0c16443f8ac0d61b57cc4d34ba0e9932b7ba93ee3801b579bd6fde07e635c6a2c0ed4f' \ '357eca8476583c7427356ec1bf17c0bfba9c94216193a49eac9854c97e3b287c7921bd' \ 'eb9e99521bc6a2c05375c9cb417d7c79f40aa29e7eb9e604e8bf46503ca4c39617c02d' \ '71eaa67e3bf59b3a5f359a89a4d576ffa29e3508932a331beba3846ed57974a5629bc2' \ '4c98ebff8036ee1c88b7bd6fde76ce380c1d8a1d14c94794949f8ac00ab019350c34cf' \ 'cd62eddd76b2b2e325cb4c3de028ba18f4cfcbff9f9a540c8677b883c01a8f35f655c9' \ '216534cfcd6298c2ffba1cc976a47d9f1cc42775c921e55efd38f40d31f475b725c82d' \ '34cf497d7c79f47ecc7dcdbe253d72f56e55c90da36e071d679b3a5f1d949417c47d42' \ '2dd9e90f3d3f8aa6717af56ec76b7cf9e68b68ca51fea593432736c39e208f778b687d' \ '878384e99f72bd6fde9f8a84e5aa6e6e55672080bf0121d195eb9e1c1c42821dc917c6' \ 'a17e39f401358a8b687df18562a4473dc6a4cd2167613f8ac08d24d99782a6b0fbe30d' \ '31f401b57917c45e7435fa3858f4cfcf6b364d033a9d79ed59f4eea3c07427359b3a5f' \ '4d8bc00b21ca0d31f479d0e60432f56e535d01a7778bee771199e6ee35c9ed5dd5e884' \ '5e36c39e208d62985257057dc9ed5bf520829e9b3a5f4d8bc094673d057dc90246dea0' \ '8a4c8b6c34cf4f8d820f4923ca9e17c6a1201ba2fad57925df5266876b828b130aa677' \ 'b883c0fd3cc90a2227e5382f2082a67e3dd5402f351c88eebdeb9ef651f401b579b815' \ 'd5d8fc797433bfa835c9eddf911c1a287c79f47ebd76c8ad6280b47920829e1744e720' \ '94790d27496ec384edd919821dc4eb335f3f8e842bb54a0579f40b3578b817d36ec1bf' \ '716e99ba8e3517d019828bc02bb119936e9932a1e0dcc5c3ba18f4516e86c632288783' \ '84e99f72209625c8297d7c79f4192a39c632478b7abfb8032736c39e258ed6f115a3c6' \ '8a4c012576bd6fde82a3962094790da3c001b5799baa13b4b1e68b6c34cf497d7c79f4' \ '7ecc7d1a8b130a32acfad7727e58f42348790772b4cccf77743121cadaaa20905c2090' \ '5c9b3a5f359a89c9bf72a4c128255d2d078bb120186d0c023bf3b59429de2ce53a479b' \ '3a5f351cfa9bd479eedc94e8905c20905c20905c182339351af5fa51f86e535d717a28' \ 'f101ca7cf9e635087d7c79f407e29e20097d641a573319f4f4ea84a4d5797ebbaa2090' \ '5c20905c6ec39e9b3a5f359c4afad772743121eb335f358e35118d7d19aac0b6c5fa71' \ '78f466135df331f4fac73874a3a68d269993d3aa20905c20905c20905c20905c20905c' \ '20905c20905c20905c20905c20905c2000fb0a6f99eba512821dc917525d19aac02bb1' \ '19350879c6a2a62010f47eccfa351aac0d33479baa13b4b3e30b35fa3858f401b579f0' \ '73474d8b1380a6384872472006bb45829e33c2c0edcfa9c62246820f460b2193c6a24c' \ 'f314c921617d7c79f419aa131a8bc004ec5e4644d951ee3525df729b54c9bd6fde4d0f' \ '46201d670121d1cbc3f796273580a63880a2c0235c789bc2c0cbc7a9c6a2c08f3a47cc' \ 'cb9ee806bbedcfa9c62246828bc001b579bd6fde3d66460b2193c6a24cf314c921617d' \ '7c79f418fa720c8462e91d613df2e301a55e0121ca0d31f40764b301a777b883c001b5' \ '79bdfb542a331b17c6a1cb41d1cbc136e91d6194e1bfeb23390c829e20097df115fac6' \ '367517c24c2010f4cfcb9e358c62d287a980a296f0e313ba182fe882a69700d1cb417d' \ '7c79f40a35670c9d94f0f77253e3c0fac738ca0e352ba39e8dea84b881eebfaac03598' \ '19821bf5956dfde773f56ec39e2010f479c2a6119d940da313ba18f4234879c83b57cc' \ '497d9bd2e3c6224695edc37eb9e6c6a2c074a76b2b2193c6a2c0956db3829be301a55e' \ '01257620845ecd38f40762270432f56ec38421633bcdb8e6f0e3ffeedc94364d033a9d' \ '790c9289e53a4720845ecd38f40d331bc6a2c0b431f4660786bb5b5ffa51f8e812479b' \ '3a5f3508791d9686820f460b21ca0d31f494f372ee2749c626466607863588bf75a1b7' \ 'b883c004fe72fac39617c24cf077d3e919f89b3a5f351cfa01a7a9e773f59baa13cb55' \ 'fa24334771f8e6e81257956db38b687d7c79f4cdb8e60c14fa0e513ca4c3962006bb75' \ 'a3a6012142eddd94eba3846ec313b883c0842db3c6a4e493c7a14173f520829e110901' \ '76a28421e7a1cb41792173b404a0b779506df077d3c632479b3cc92348caee335f17c4' \ 'c3dc513ca4c396f0e7a999c24c6e4339764cd9234e8dfad576ed5b477178f40ab6253d' \ '72f52010f4ebac5e4644d9ab7247e882a697023bcdb8e60c12bfeeca9e05eba6bd6b39' \ 'a4c3966e5567bdff729946dec83b47c6a0b7b883c0208f35f331f474a76b2b21798f8a' \ 'a6717e14edc2c0d68ba6f4fae3ba8e6b17d01993ee38648b4c2173b4a457ee93c1bf99' \ 'c4c3ba18f445149acb4142956f86208028208f38cbd1e6957d9a118bffb883848d9be3' \ '80a63801b57917c24c8f8a13ba18f46681bf75a5cdcf497d7c79f40aa66b0c12bfb803' \ '39358ea9c62646a4c3966ec39e9b3a5f350893f655c994f579971644217357c6a4cdcf' \ '497d7c79f4b433572ba3a698c6a94226e4f101933f8aa697007d2165fd364d033a9d79' \ '0c007d1d14c917c28496a63801b579bdedfa8b7cfa013347fac39eeb335f821dc97779' \ 'f40aa45efa5775fac1149b3a5f821dc90789bfbdedfa254f35f0734753e3c04d8bc094' \ '7775e882a6970476bf2cd974b725cccb9e20097d878384e99f72bdffba01632797129e' \ '02bbe3fac73823487dd2525f80a29eeb335f350842fad579f0e57dfac73851ee3598c0' \ 'bf9f8c7d3d7094f30239c63675234a3bcdb8e6717af520829e9b3a5f351cfa8da635f2' \ '3bcbf085c00a3467a039f4b655c94d1b5feba384cb511c24a3c0ed5bf517c45e9f1cc9' \ '957fee2090e63508794d0f49821dc97e2f9993c55ee99f72fa51f81c1828cb417d7c79' \ 'f4b433572ba3a698c6a9c7985c'.decode('hex') # # First permutation. Generated sequence is: # [ 1, 4, 7, 2, 5, 0, 3, 6 ] Permutation_A = [ (((13 - pos) * 5) % 8) for pos in range(8) ] # # Second permutation. Generated sequence is: # [ 2, 7, 4, 1, 6, 3, 0, 5 ] Permutation_B = [ (((7 - pos) * 3 + 5) % 8) for pos in range(8) ] def Permute(byte, table): val = 0 for pos in range(8): if byte & (1 << pos): val |= (1 << table[pos]) return val def DecryptBlock(block): if len(block) != 3: raise ValueError("Bad block size. Must be three bytes") # Convert bytes to numbers (a, b, c) = [ ord(byte) for byte in block ] #print "a", a, "b", b, "c", c # Permute the middle byte b = Permute(b, Permutation_A) #print "a", a, "b", b, "c", c # Pack the three 8-bit bytes into two 12-bit messages ciphertext_msg1 = ((b & 0x0f) << 8) | ((a & 0xff) ) ciphertext_msg2 = ((c & 0xff) << 4) | ((b & 0xf0) >> 4) #print "msg1", hex(ciphertext_msg1) #print "msg2", hex(ciphertext_msg2) # RSA decrypt the two 12-bit messages plaintext_msg1 = pow(ciphertext_msg1, 11, 4097) plaintext_msg2 = pow(ciphertext_msg2, 11, 4097) # Unpack the two 12-bit messages into three 8-bit bytes d = ((plaintext_msg1 & 0xff) ) e = ((plaintext_msg1 & 0xf00) >> 8) | ((plaintext_msg2 & 0x00f) << 4) f = ((plaintext_msg2 & 0xff0) >> 4) # Permute all three bytes with permutation B d = Permute(d, Permutation_B) e = Permute(e, Permutation_B) f = Permute(f, Permutation_B) # Convert the bytes into characters return ''.join([chr(c) for c in (d, e, f)]) plaintext = '' for i in range(0,len(ciphertext),3): block = ciphertext[i:i+3] plaintext += DecryptBlock(block) # Print the plaintext, converting all carriage returns to newlines print plaintext.replace('\r', '\n')