5
\$\begingroup\$

The PGP Word List is a set of 512 English words for verbally communicating strings of bytes, such as authentication codes or hashes. It is used in secure VoIP software as well as in some other important applications, such as the DNSSEC Root KSK Ceremonies held four times a year.

It consists of 256 two-syllable words and 256 three-syllable words. Bytes at even offsets become two-syllable words, while bytes at odd offsets become three-syllable words. This protects against transposition of adjacent words, repetition of a word, or omission of a word.

The two subsets are kept as alphabetical lists and numbered accordingly, so a null byte (hex 00) becomes "aardvark" at an even offset and "adroitness" at an odd offset. Likewise, the words for hex FF are "Zulu" and "Yucatan" respectively.


Write a complete program to encode a sequence of bytes (represented as pairs of hex digits) as a sequence of words from the PGP Word List.

Because the program is to be run on a secure, air-gapped computer, and USB drives are a security risk, the program should be as short as possible to facilitate manual entry. (The length of each program is measured in bytes, because if I were to use the complicated keystroke formula I came up with, this specification would be twice as long as it is now.)

Input format

The program must accept a string of hex digits as either a single line of input or a command-line argument. You may assume the following:

  • There are no spaces or other separators between hex digits.
  • The number of hex digits is between 2 and 128 inclusive.
  • The number of hex digits is even.
  • Digits A-F are either all lowercase or all uppercase (if the required letter case is documented).

Example input: 9030e74b

Output format

The program must print a corresponding line of words from the PGP Word List. Adjacent words must be separated by a single space. However, case of the letters within the words may differ from that shown in the PGP Word List.

Example output: peachy commando transit disable

Restrictions

The program must not rely on any external copy of the PGP Word List, including any data known to be largely derived from the list that may be present in a system file or library.

Test cases

A TSV file is provided. In each line, column 1 contains the input (as lowercase hex digits), and column 2 contains the corresponding output. More test cases may be added if necessary.

\$\endgroup\$

1 Answer 1

1
\$\begingroup\$

PHP – 3302 bytes

This solution uses a gzcompressed string of uppercase space-delimited PGP words, e.g. AARDVARK ABSURD ACCRUE...WOODLARK ZULU.

<?php $f='explode';$g='gzuncompress';$h='base64_decode';$a[]=$f(' ',$g($h('eNollVli5CAMRK/CVWSMbWJAhKU9zv0PMk/0R6jqsGgrySJt/0i7nWx9tt2J920GILPsLR4DmIn1OFL04BWEYzGn0LuTdGpiTfqwauFSzuqk+BgKh2tN/KuN2PnR+7RXxxUKN0cS1r8RvNtkUy2Av48Y0r7Yg2eQ8qNuC5JjOcE9Sa5guOInGPZH/oFHwx7HQzoEU1toPRDUFlOK653YzUDi3R/+YOpv2YORZ2jzF2yGLdpZzdt6RPXuFy+6rXEnds40gk+RMI3dE1da9Pe7TODC4aWzNxt+Y2SOYVbn358d8CFbTvwlsSVLLGyM0MDg7S1/xR4SoLdFC9a6thvpy2TLE715lIz1Hv0Xm2qGBSn2iEX2KMF7xW/WjFkfIKwNq/ps6wkLatenGCv3C+hzqHKiTR/FTsxM/XYj3ZLl54bNXfq1qUW0k41NEcdOAJdQgF3Pbjf2JmcJwzAWOQOEs8dMbmmKqPb2jW7HCPW1o7Pcobh9ViVN+4OTlgb2FuymvnCeS38hntfY0J2j7EqxFz6syaQWmtUhdC8V+OcDLoU3nJYtI4MwL3fICvMw+c7hjiRnVfQKGSsRR3pHk+oOUjVmC0ZyWMk9Gm+SdoSHJ7h9yh8OB3fiGmGdKa7anml6xZdTz5OOAdN+mJTOFjLxuXPGXaw+l9BSw128tyTiLgoZXhcJjAgNZyKTsXxM3YaaaILYk2X+R57N+o8r3+LcCFOPA3yiu5P8Q4poQ/DRJIJUcmhxODqrkLmM9prLeslzuzwbicnTJFaoLX0TIHXMYoilVlxZNbCOUbmXD7qNiWdYTUqRtA7u01ziqry7vK4G8RdADbtQ5Hq9Pf4yb2qS91K7XNMc6moLPk0kBznwC+iXCQQWy1j/0ScZzhqTrZV333ER5e9kctnzv5Mp0QAd4lDkiMyfJoOGG65Zt6MCDGjLwIlUAfIcuER57CCI76xD5/r1CYUitLDGU7uwyN24eRM5rp2rH5pusxtQQZ6aJAQFdomJ2gzIs9s++kTjeNx9KKSqeyVuexg2Vkp7kJViBkNA/50Jsrq5X2J6B7JZgehzMldcv2dK6B7y7jYku3UR21xm1q2G70XqmmJGvltIYF0CuUDiuyZlmeNakXZ96VKuVimMaDBIW60IS2mL5it1bRqNxNMerfwXufX6fjuvD7K05oSxIiMYie0hw5CyL0sD58haH8GmXazG2hoFfRBqNi+G1meVB9Yyt+cpXJkt66TwfeJVQU39YXxsyyLzxHQzaOXoO8jnirVaP2c3Qq6BkozVvXyvOqpkelMVbGW1LRuYtom2ely/ZxaALGQ+NDD9wTlgboQ9ZlZOz1LI13i9feJm8UwaukhMerM8lreJlknXrD2s1QrykcrlD8+asD6RCew+k8IW99inOADJ5sVKAyHsMJqJyj1xfY4fVb6WjKq/meZ/RSEoQA==')));$a[]=$f(' ',$g($h('eNo1lmuChDgIhK+Sq9AxKtsxuHnoOPc/yH7E2T9DjXlAoChalmraS2otyHJpSzXI2lM9pO9Btq2mTXoKkr+SFXPotvcnyDFy6m5aOlIBlZ5KkSDnmTWKfzktZwtSD21dI3dUTMY27jddgvTMRo2Aw9q5p8ri6Ha2J3zk82Qr2Pi9iaCC6ifFkcInZbu3aqMs4aOrRcktfGx5tiGVT2bflnL2I1aXVLMWDlnvdmR/56fK8hn1cXDJYm5/NavgrSb5yi2sDT+3dQ9hNPUEHb5hdGJZpYcoB3G4LYsuniNQsfKRnIFn1Wi1gNzJtKnLl6BiygmPfoAoR7bmiNysT4i7HB9PPtmJ5MO+icWdhG4WyF3dHo8imueqkNNoB+F1Nf94sMZzAKeUZ1orXpxoJY5a/+Cqy9/ZstqsjsP/Kw1sqbTRJhq5kwVgPe2N2Wq19vobJWqe8fCp2eWPqyPqqj8hDn9Is4MjBIitYZGvdQlLivJGAEq+zYEekrFNt+Iel9RT7FYnqJuHPtHhxVw0dpmLWqzJcFDZ7mEt2uSTfU+DKJpWR3WcXa/5kWPvPiNEv9Yj+P3lBCHtzke8p1Ih77sMsSvVpErp3yHzLEDPd7VRal4D+OphIZGEZ4E/6UdmqOkHl/Ox6ccWsrpKi1o8latmmZesWjR+n0A1/Lzbrn1w61pxxeknbLJsqVcH+UrNecn/k6obFGriS2490RsMH+4CcCntug3tUr3STrBBPqsjzX7P7gy+rX5Bv3SQEeWeZJlt5xCKvM25U57u9+5QaPreLc/eCDv88r5n7VmqDEQgKDzkJdQVlDrXKok4ZwoVn3Caw74Du4o/E5tq8e9OTZcRLc1P4R00XiYoNdkmHR2VvwsvRxSZZ0r5jBz+ERopSvhnnOoKktMJUR+sN7E/MWSFfiToIDtdISu6F/djNuohFIPChCNROMHQIHg61Pke7UwvvNkHWto4PPlkNROQwEhwFZc8MlhmCxyWpbXUHCBmvmSFcMXty0ekEHp1C0Uqb/QXlcRzBHO3N/ZQrN5pc8kyusRbyHa1YCWjfv7fyd1cZjVPTbDRV00ZNQyneIdGbFko7QtobuyZuNUFHlyRnPLaKuc+0UHL+xovKE6hM1HEikSdpMYl40wFknphuGqW+prwLSZNcO7MA6HQ5440ufYDuv25IG3Jr7X4TX2lgowQKjcJdqI673XmvR8oZeQ7IgC6oIjzDPiDkLj/8RYWm7XtfuvDA9BVmhiesERpcOMOa0IqvGigqNQVM+WsptMnCY8G+VxzW+nj6HvaVBMH6Gzz2Kq//tUhh5ougnLEeEOfgvd3Gb7v0nfpsuyOGjWQfJstQFoQQQD0UV1LGhOEdAMiVJuZd4l+tagZL3fBazZYVNZwRTK82x3CHPKBCPX9j7WtDwo1+7yN83S1IfY2J4QzhEqeGnWuP/Rw35/Q0Q0b1SWtM8Bm+UInr3K6IzgoMRqWITUrjeT7qLgBFZ6whCjpDBnkEsallfHFW/2CyjQh0CX050x3nQ3r02dWk1EvUI/V4RGuxuAd5Z2wWCYnf8lj861+ew7jZP65ll8Sp7SQQ8HZEi6XHLTn0rqhvAKAWhTy8p8SHsxljyc83N6BhUCnFNJa4d71aPAgh1uZy0yzmxH490Phfl6PT/JfOE+SGp7Bo6T8BwHcnAI=')));$f=1;foreach(str_split($argv[1],2)as$b)echo$a[$f^=1][hexdec($b)].' ';echo"\n";

Save as decode.php and run with argument in the command line, e.g.

$ php decode.php 9030e74b
PEACHY COMMANDO TRANSIT DISABLE

Because the specification mentioned ease of text entry, I guessed full 8-bit was a no-no and restricted to regular ASCII and base 64 for the encoding.

The PGP word lists on their own, no spaces, with one word running into the next, is 3919 characters long, so this solution represents a savings of 15.74%.

Another solution formatting the strings with mixed case AardvarkAbsurdAccrue...WoodlarkZulu and splitting based on the case, while retaining the delimiter, turns out to be longer at 3433 bytes, even though I'm removing 510 spaces from the PGP word list source!

<?php $f='preg_split';$g='/([A-Z])/';$h='gzuncompress';$i='base64_decode';foreach([$f($g,$h($i('eNodVdF246oO/TY7STNzejvNmLRd67zJWDGMAXFA1ON+/d30IUixQWhvbckDleWTyjbMtZVlsLY0HmzkYSn+ocPSgg6PR/BWB8e0DD4GrnUIq4QhBNmHIImHGGVI1nPSIefAQ1Ffdai1IZA6TnXQQHX4UrYjzSJpJLs9PIelOztyGCn9kZEp+rSOvASKeWR2/pNh6k5/R34UXLCMHB5UdeRSuWyjD8H3474iaECwP/iNQexGC8PuKsW6MTSePbZJnPthka06BBoLdvvqxgJswSfuztbyWLzdjh4Xdz4sVR5bmSltY1PFRe3rCy9PHIH45MiXALLgqHI5ObYIcXK+cjg52YAIJuf+qoCXSPUEfD2BAKdWb79NEYmnwJRwuAPYpWwnmQudJOIiyyfBUvQk+9yP9twX2ROctB2nIvtDRE+lWU942yIqscBWMHFqs7dnqm4WJH4G2lmCnpGpo7ScZa3Yey60JlYYn2jlcyfl0cK5K4HLuXxjOCPwzIRdLW2czi1L0vOOhIDzQtrXBXK5rGsXzMWvTmcK4ZIWQcm62S8pgIdLAa+Xainz5a9lXi4Hr50IWAUS90QdyRMOS9OnQGuWwLDacT6FQwvlJ7CgrTBs5M7YU0EkiU+lX8zpSl9Ija/sVy7X4HuFrqFZqXyVdYWYrxKWBzRwLRyB4dr8QuD5B0Hp+gNRbC/wDxSEj5/IHihgWlj5Z/rsKoSR8Mk/awCV/9A+oyOe+fhm+hk6ksfj2e/+OdBfSf8TS4GxQiIvXLy++JRkf4FYyos42reXVii8NKjiF8oDSfMvztoSDEKX9OubUYj5lbZ+4+usrfIrmlRoec3q7WuxdKNjoePGZN1xQyEqJb25o/r/Gt8CHU5w6Baayq2wDW1h2AcXrNX10t6KT9r/yx5gWvYBSz5uhzpJvxstkJ3+bujQ8ruJ0kSr+sgTqXWsU+83dRM/pMSJV0hqYp8W5jJx7HsmznRMqHTr/ienlSfuo2ByuCJOfrYQ4QQ9dalOMreKFVUoUwNYXgz5AJLV0L7gnQGxwUsylpO3xgpwIRoc7TQZpk6a4cBWDfq2d5RxBDlijQWRjZN9RS+brYUAWZrtWADPdGVXJ2owTnrDmUS5D4tuv5+jgH07TA1+YSNBDCTrOhojB9olmUwJ885kptL7Ak4IMwgx2XERD+tXhMp4FNjk47sTjIKC3qHdSaQM68tOB2xaenRFKlyMch8oPsMpPV2jwBNxrUreO9twSjxMW6mYVqK0pKbVjNHMZkc7z/0SdDHO39FR3tY7YbTf0ZzoqnjnmLnqvXfR3WOw813A8l1yFDzuowgvoIjq+78W6d6nR8R4vhf5QwlrmwPfW5RybylxuB8WH4K3ZJu+JbCi7i3tQP+WMQj1LVfuC+h9pyzlHZHAxbvHPHtvqE76oK6CDxSd9aNDRJ7LB0HiC3/4/m36EMGHpGz/ttD+D3OmxWA=')),-1,3),$f($g,$h($i('eNotVdF24joM/LZAaWHP0rJA27OPwhGJDo6VlW2o+/V3lN4XJOzYGkkzctebSkmcc9ffJbN118I2URm7YTAeqHAXbxSli5MMY2ndVCMX/GaeOJUuFU6JunmOEgj/Z41RO5skFwncGX4jdxmXqvRdifhGQlcmzfPIxl0tOue2okuLmlYUbg+EtBXZhUPlFUd9DKY19Su5aqCYV9q3oZL1K9Vb5hjxtVrPFiXxSkvRKSKdlVF/qdZg79QrzLdEobQyphs9qK2qnxgKotYsXoEJu7Ug+pXKmiaEhkm99EAEJ2m6UIxrmk2CWlqTX+2GC93Y1hz5Yv4tQNWoGQ7Sv7b1SNPFiyr9GjnrjXk9olqDrgF+aIi7Vi9GCrzW6VJROsXShI1eYWdKzY0mVHytKVSzH+8q/c+pdNWl5vD+bxu8zCnX7E6NBbmu1WZdEKqZ5iVITUGiI8BC1jvSsBrkKl/r6qCzTrwGIBh7opsWeuJAS1A47J/AykTxibMMCVGeuHAoam5tAM7FmVDiJwmFfEeSZqqwhi8B40kyXSL284Wj8BWO1bnI3ZdwYPlGQ3XGbRDz+zvyJoXRyZSGTTKQbtkDGw3tybz5V8lPwcq8bOVAM4Bv8k0m3SDR1lPbfJED23whjOe0+dK+5mfKQRLq9CyR/PCzJAm39qzGOPjsgErt+dn4X8Wx9kL9wMVg450BOL2AEuDYC1iQCetuUMEXkBK4GPYupb1UKQS0ZQuCVNTK4EjE+a3z7qF229I3qK41b5n6RRrw0OhFPFuUHAXlLVjg4bYaFyJvwQ9XI29bb1ShzB04BNAU4XCpeYdcZ6/PDnEG3SVnKu3SlZANDFvConMKJd4l6CMgHpy6dHSHOg9OJHfSzz13d+68y4XSpcZfBL4H+lVnAejfPINf7Te7vEak8lvAnNL2SL/IxHsqYZxcRXtChVHsPaMRtHcqa9pLwPGgMy/eA9/spc91Qk33EiMAELi0FyNMm73k5Hzda6ScOcNilmBdE7ARzEKkvWaQo+grGVIB9FcGbnrlR44Lzle1Bw+YGW+gM+C+jaJvKWLswJ9xYSpvFl2jb7VchSOG0IFcPOGAVbRpsVDcgWbGXT5AD5gag6bFGM2jOxNUiA1gTeDAgdESYz4gd8j3wAnUQq0PbEvT7u79tCbwYSQ4oR1GDAdMVtiiPxejKIzbNNy4XGs8gBxoFuhxgPSXa9TVeDANWFSDc0efQRJ4X5A0QtalSzBRMhh3aAAr/Z/qwivtSH43ghwZuvUuHDELZsavT5Ijzz6eU4Hjr8PRSdDXgP28yBoWMy0DytFTXEaBe8J3iu7gkcCAOEJ0qeKbuyzrd4XK7ITSUnyo9idXCAR6olINoj5hLKOO7RTAE6/oCXNwmQYnRXoYNCet2BE74XrkCzDuofmFT4XL+MO1U6kzJxffqc6zi/7Op2X0otGnmmcJ4psN4ipjO0PEWg0KPOMlmL0hZ9SMZlx/1guFoGcw0bxtZ518BD/OmMjc6xlzQRwgHB8g7Wx4B5ATThomNHD15zbzw1xM7xjm3p13FADE4f7dAV1Vy3taXiaYa8MPqpTxld8Z3+egGHXDBwXX+AcNhAD9hwt/0A+xATOOPgTUUPvwlxbBP7R5JT9dIam0T58/4P/nKFNGQ+OnhBET6BMvyM9T+tmWIH/ZH/zGZH8rwFP6Dz6ZaRE=')),-1,3)]as$p){$t=[];for($i=0;$i<count($p);$i+=2)$t[]=$p[$i].$p[$i+1];$a[]=$t;}$f=1;foreach(str_split($argv[1],2)as$b)echo$a[$f^=1][hexdec($b)].' ';echo"\n";

Save as decode.php and run the same way:

$ php decode.php 9030e74b
Peachy Commando Transit Disable

As well, using aARDVARKaBSURDaCCRUE...wOODLARKzULU as the source text, the solution still comes out at 3433 bytes:

<?php $f='preg_split';$g='/([a-z])/';$h='gzuncompress';$i='base64_decode';foreach([$f($g,$h($i('eNodVdt227oO/DaIhEVWIMHNS1TlTbIdtycnjSs5yVr76/cwDyZgiQQxgwG0UrZPlKd1KC3b1ZjceDWBV5v9qa62SV1PJ/Gmro7Jrj4Il7LKqLKK6LyKRl5D0DUaz7GuKQmvufpS11IaAlXHsaxVqKzPlc1Gg2rcyEwnz2K7MyOHjeIP3ZiCj+PGViikjdn5J4YpM/3c+JRxgd1YTlTqxrlwnjYv4vtxXxBUEOwHfpuomcgy7Fw1G7dJ48Fjm4ahH1adikOgLWO3L27LwCY+cnemlrbszbT0uLjzZKjw1vJAcdparbioPT/j5ZkDEJ8d+SwgC06tnM+ODUKcnS8sZ6cTEMGk1F9l8BKonIGvJyBwSvHm22TVcBamiMMdwKx5OuuQ6awBFxk+K5ZczzoP/WjP3eoc4cRpOWedT6r1nJvxhLctoBIWtoCJcxu8uVBxgyLxC9AOKvWCTB1Fe9GxYO8l0xi5wvhII186Kacml64Ezpf8jeGCwAMTdrU4cby0pLFeZiQEnFeqfbWQy3Ucu2CufnR1IJFrtIqSdTNfo4CHawav12Io8fWnYbbXhcdOBGwFEvdCHckLDmurL0JjUmHY2nG+yFIzpRewUFtm2MCdsZeMSBpecr+Y442ekRrf2I+cb+J7hW7SjBa+6ThCzDcVe4IGbpkDMNyatwSefxGUXn8hiukF/oWC8PIb2QMFTJORf8enrkIYlSf+XQRU/o/mAR3xyss306/QkZ5Or372r0I/Nf5fDQljhUTeOPv65mPU+Q1iyW/qaJ7eWiZ5a1DFH5QHkuY/nGqLMAid459vRiHmd5r6je9DbYXf0aRK9j1Vb96zoTstlpY7k3HLHYUoFOvdLcX/0/gutDjFobu0qvfMRppl2BNnrMX10t6zj7X/11lgWvKCJS33pTqNfxtZyK7+bejQ/LdppZ3G6gPvVI3juvd+q27nk+aw8whJ7eyjZc47h75n50TLjkq37j9xHHnnPgp2hyvC7gcDEe7QU5fqrkMrWFGFvDeAZXuQF5BcD5ot3h0gVrzGw3D05jAKXIgGp3aaDqZO2sHCph7o295RhyPIEWvIiHw4nUf08jE1EcjymBYLeEdXdnFaD4yT3nBHpNSHRbffz1HAvh2miLd8qOgBybqO5tAF7RKPRBHz7khMufcFHJEBhBzJcVYP60eESngkfKTluxOOCgp6h3YnUmVYn2daYKPt0StS4XxU7gPFJzi5p3tU4Am4tmqaO9twcliONlI+Wg7aYj1aSRjNfMxo56Ffgi7G+Qc6ypvyIIz2B5oTXRUeHBKX+uhd9PAY7PxQsPzQFBSP+yjCCyii+P6vBXr06REwnh9Zf1DE2gbhRwuaHy1Glsdi8CH4iKbVjwhWqvuIM9B/JAzC+pEK9wX0flLS/IlI4OLTY559NlQnflFXwReKzvWrQ0Se9osgcctfvn+bvlTxIcnTv03af4OkKGA=')),-1,3),$f($g,$h($i('eNotVdF24joM/DbhiEQHx8rKNtR9C5QW9iwtC7Q9+/d3lN4XJOzYGkkz8tyZSkmc89xtJbPN68I2UhnmvjfuqfAcNxRljqP0Q2nzWCMX/GYeOZU5FU6J5mmKEgj/J41RZxslFwk8G34jzxmXqnRzifhGwlxGzdPAxnMtOuW2p1WLmvYUNjuEtD3ZikPlPUfd9aY1dXtZa6CY99q1vpJ1e9VN5hjxtVrHFiXxXkvRMSKdvVG3qtZgt9QpzLNEobQ3pg3tqO2rn+gLotYsXoERu7Ug+prKgUaEhkmddEAEJ2laUYwHmkyCWjqQX+2GC23YDhx5Zf4tQNWoGQ7SX7fDQOPKiyrdATnrhvkwoFq9HgC+b4h7UC9GCnzQcVVROsXSiI1OYSdKzY0mVPygKVSzH28t3c+ptNal5vD+bxu8zCnX7E6NBbke1CZdEKqZ5iVITUGiI8BC1i3SsBpkLU+H6qCzjnwAIBh7oY0WeuFAS1A47J/AykjxhbP0CVFeuHAoam6tB87FGVHiFwmFfEeSZqqwhi8B40UyrSL284qj8BqO1anI1pdwYPlGQ3XGHRHz+TnyMYXByZT6YzKQbtkDGw3tyXz8VclPwcq0bOVAE4Af80ZGPSLR1lE7PpEDOz4hjOd0fNKu5lfKQRLq9CqR/PCrJAmb9qrGOPjqgErt+NX4V8Wx9kZdz8Vg45YBOL2BEuDYG1iQCetuUME3kBK4GHYrpb1VKQS05QSCVNTK4EjE+ZPzbqe2OdEzqK41n5i6RRrw0OhFPCeUHAXlE1jg4U4aFyKfwA9XI59aZ1ShzDM4BNAU4XCp+YxcJ6/PGXF6PSdnKp3TmpANDFvConMKJT4n6CMgHpy6dPSMOvdOJHfSzz1bd7Z8zoXSqsbfBL4H+l0nAeg/PIFf7Q+7vAak8kfAnNIuSL/IyBcqYRhdRRdChVHsC6MRdHEqa7pIwPGgEy/eDt9cpMt1RE0vEiMAELh0ESNMm4vk5Hy9aKScOcNilmBdE7ARzEKki2aQo+g7GVIB9HcGbnrnXY4Lzne1HfeYGR+gM+B+DKIfKWLswJ9wYSofFl2jH7WshSOG0JVcPOGKVbRpsVDclSbGXT5Ar5gavabFGE2DOyNUiA1gTeDAldESY74id8j3ygnUQq2vbEvTtu79tCbwdSA4oV0HDAdMVtiiPxejKIzbNGy4rGu8ghxoFuhxhfSXa9TVeDUNWFSDs0WfQRJ4T5A0QtalSzBRMhh3bQAr3d/qwivtRn43gtwYuvUu3DALJsavT5IbTz6eU4Hjr8PNSdDVgP28yBoWMy0Dys1TXEaBe8Jbiu7gkcCAuEF0qeKbrSzrW4XK7I7SUtypdndXCAR6p1INor5jLKOO7R7AE6/oHXNwmQZ3RXoYNHet2BG743rkCzDuofmF74XL8MO1e6kTJxffvU6Ti37L92X0otH3micJ4psN4ipDe0DEWg0KfOAlmLwhD9SMJlz/0BWFoA8w0bxtDx19BO8emMjc6QNzQRwgHB8g7WF4B5ATThomNHB1jzbxzlxMnxjm3p1PFADE4e7TAa1Vy2daXiaYdcMPqpTxld8ZP6egGHX9FwXX+Bf1hADdlwu/1y+xHjOOvgTUUPvylxbBv7R5Jb9dIam0b58/4P/3IGNGQ+O3hAET6BsvyM9T+t2WIP/YH/zGZP8qwFP6Dz1XnCI=')),-1,3)]as$p){$t=[];for($i=0;$i<count($p);$i+=2)$t[]=$p[$i].$p[$i+1];$a[]=$t;}$f=1;foreach(str_split($argv[1],2)as$b)echo$a[$f^=1][hexdec($b)].' ';echo"\n";

Sample:

$ php decode.php 9030e74b
pEACHY cOMMANDO tRANSIT dISABLE

What's likely going on here are inefficiencies in the compression algorithm arising from using mixed case. Good to know - you learn something every day...

\$\endgroup\$
1
  • \$\begingroup\$ Full 8-bit is OK; there is no rule limiting you to 7-bit ASCII. My system has a Base64 decoder, and for the sake of simplicity I decided on byte-based scoring (instead of my complicated keystroke formula). Also, I noticed that your submission adds a space after the last word, not just a linefeed. Though that is not what I was expecting, again, there's no rule against that. \$\endgroup\$ Jan 20, 2016 at 4:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.