Skip to content

Richtig Sichere Angelegenheit Mystery Cache

Hidden : 6/15/2022
Difficulty:
5 out of 5
Terrain:
1.5 out of 5

Size: Size:   micro (micro)

Join now to view geocache location details. It's free!

Watch

How Geocaching Works

Please note Use of geocaching.com services is subject to the terms and conditions in our disclaimer.

Geocache Description:


Changelog

2022-06-15 - Initial release

[english description below]

Deutsche Beschreibung

Bob braucht deine Hilfe! Er und Alice kommunizieren über verschlüsselte Texte und gerade eben hat Bob eine neue Nachricht von Alice erhalten:

WUaPSMWHPjsZ/t0MPYksZsfxH2en56TDyu+9CUirg/l4c5yqQxeUG8hmIYYsB7nU6XUaM1yzMp3gVco9w+olvw==

Leider hat Bob den privaten Schlüssel zum Entschlüsseln vergessen, nur den Source Code des selbstgeschriebenen Entschlüsselungsprogramms hat er noch. Kannst du Bob helfen den Originalinhalt von Alice' Nachricht wieder herzustellen?

import base64
 
def main():
    print('Richtig Sicherer Austausch (v1.0 - 2022-06-05)')
 
    cipher = read_cipher("WUaPSMWHPjsZ/t0MPYksZsfxH2en56TDyu+9CUirg/l4c5yqQxeUG8hmIYYsB7nU6XUaM1yzMp3gVco9w+olvw==")
    # This line asks for the key on the command line
    # key = read_key()
    # You can also directly pass in the key:
    key = read_key(17)
 
    decrypt(cipher, key)
 
def decrypt(cipher, key):
    cipher_num = int.from_bytes(cipher, byteorder='big')
 
    # Remember, e = 0x10001, Hopefully no one knows the prime factors of this number
    modulus = 10941738641570527421809707322040357612003732945449205990913842131476349984288934784717997257891267332497625752899781833797076537244027146743531593354333897
    plain_num = pow(cipher_num, key, modulus)
 
    plain_bytes = plain_num.to_bytes( (plain_num.bit_length() + 7) // 8, byteorder='big')
    try:
        plain_text = plain_bytes.decode('utf8')
        print(f'plaintext = {plain_text}')
    except UnicodeDecodeError:
        print('Failed to decrypt message. Wrong key!?')
 
def read_cipher(cipher=None):
    """
    Reads the base64 encoded cipher and converts it into a byte array
    """
    if cipher is None:
        cipher = input('Enter the ciphertext: ')
 
    decoded = base64.b64decode(cipher)
    return [bb for bb in decoded]
 
def read_key(key=None):
    if key is None:
        key = input('Enter the key (in base 10): ')
 
    return int(key)
 
if __name__ == '__main__':
    main()

 

Weitere Infos:

Brute-Force ist nicht notwendig. Das Ergebnis sollte eindeutig sein. Der angegebene Entschlüsselungscode muss nicht verändert werden, es muss lediglich der richtige Schlüssel gefunden und eingegeben werden.

English description

Bob needs your help! He and Alice are communicating via encrypted texts and Bob just received a new message from Alice:

WUaPSMWHPjsZ/t0MPYksZsfxH2en56TDyu+9CUirg/l4c5yqQxeUG8hmIYYsB7nU6XUaM1yzMp3gVco9w+olvw==

Unfortunately, Bob has forgotten the private key to decrypt the message. However, he still has the self-implemented source code of the decryption tool (see above). Can you help Bob to recover the original message from Alice?

Further information

Brute-Force is not necessary. The result should be unambiguous. You dont have to modify the given decryption code, you only have to provide the correct key.

Danke / Thanks

Danke an die Beta-Tester fürs Testen & Feedback.
Thanks to the beta testers for testing & their feedback.

  • AimyBits
  • Dementophobia

Additional Hints (Decrypt)

[puzzle] Eba, Nqv, haq Yrbaneq xöaara qve urysra. Urezna haq frva Grnz irezhgyvpu nhpu. / Eba, Nqv, naq Yrbaneq pna uryc lbh. Urezna naq uvf grnz cebonoyl nf jryy. [cache] Fvrur Anpuevpug iba Nyvpr / Frr zrffntr sebz Nyvpr

Decryption Key

A|B|C|D|E|F|G|H|I|J|K|L|M
-------------------------
N|O|P|Q|R|S|T|U|V|W|X|Y|Z

(letter above equals below, and vice versa)