In the book Cryptonomicon, a character discovers a cipher which
uses one time pads generated by a zeta function. One
time pads are virtually unbreakable when used correctly.
So, I had this idea for a new puzzle cache that uses a function
to generate the One Time Pad for a
given day, like the one described in the book. Instead of finding a
zeta function, I decided to use a PRNG (pseudo random number
generator) that is initialized with a key and then generates
the pad characters one a time. I found the following code to
generate random numbers called Mersenne
Twister. There are several implementations there in different
programming languages that you can use (just make sure it matches
the output given below and you can decrypt the sample
ciphertext).
The key (seed) for the PRNG is a date in the format YYYYMMDD.
Once initialized, you just get next random number modulo 26 and use
it as the pad for the One Time Pad encryption/decryption.
Encryption is simply done by plaintext + pad = ciphertext (all
operations modulo 26). The decryption process is just the opposite:
ciphertext - pad = plaintext (again, modulo 26).
The encryption was done like this pseudo-code:
init_genrand(key)
ciphertext = ''
for each letter t in plaintext
cipher = ((genrand() modulo 26) + t) modulo 26
append cipher letter to ciphertext
Decryption is achieved the same way, except you subtract the pad
character modulo 26.
To make sure you have the same implementation I used, here are
the first 5 numbers generated by the function for the date this
cache was hidden (20110415):
1809408788 859169296 2049473176 2524836980
835816513
I used that key (20110415) to encrypt the following sample cipher
text, for your testing purposes:
QMEHC CTRBL ZSBTE DEBFR LBCDU ZMCRR IBESK MURMP KLZJC
AZFRS
KPTZQ OZ
Now, here's the real challenge text that contains the key to
finding the cache:
JHTYU MPXEE PGOOY YTCSA AGKTK DGYST OFBOB PMLXP TXJXN
ZIFSC
URNBG BODWR VSSIW JYZSV EPRBG JRAMF KQVVF CXPJA CZHLL BGQCJ
XSAWF XJGCC TXLIQ AXHAO TDLWL RENFY AVDXW FPGYY HRIYO XUKBE
KFEHZ XAWAL SGQZU SGKSW AEXKU SPPGO CMCBL IAXWU FJSLF GEDOA
WCPGM NSXQX CHAPV VCVVP JOEEV LPTDC ALWNG CYSME PTULG WKWLX
SWCHP FINAJ XRLQX UIVSV WGWPT MUFCR YOXIV AYKHQ BHJWZ ZLVGE
WZTOM UCTWU SIKIU KFGAW WKAOE PYRZG ZPWJE XQXTF NTWYB GPZUD
SMPBN ITNRI GLIWA ACINA RSLVK XCHDS YYOHM UJUQG CSGHW OCMAH
KZEIM MOEZB HAVBO ZZHHC URWST KPPMR TJJJH FLMDQ UKAGJ WSSCH
WUNYW FLCON AXZYU JHBUI GXAMM DABAR FMUXE RTFGN JNGLY NHRDU
JEBGT PBAIT CFOMO BHGGT QHFJY GEPZG SGOOF FDESL I
You can use the following website as an assistant
to your search if you don't want to take programmatic approach.You
can use the sample cipher text and key to make sure you have
everything correct. You need to find the right date that decrypts
the ciphertext for the cache.
NOTES:
- No Geochecker needed. Once you found the key, you will have the
coordinates.
- Cache is within 2 miles of posted coordinates.
- Programming highly recommended.
Good luck.