Just as a PIN is stronger with an increased number of combinations, so is the cipher. The ascii_shift cipher has more combinations.
- Change the radio_send_images_caesar_key_unknown script's project name to radio_send_images_caesar_key_unknown_try_this.
- Change the radio_receive_images_caesar_brute_force script's project name to radio_receive_images_caesar_brute_force_try_this.
- Replace the caesar() functions in both scripts with the ascii_shift() function from the Cybersecurity: Encryption Intro tutorial’s ASCII Shift Cipher activity.
- Replace the caesar(key, packet) calls from both programs with ascii_shift(key, packet) calls.
- In radio_send_images_caesar_key_unknown_try_this, change key = random.randint(1, 25) to key = random.randint(1, 93).
To crack the cipher, your script will have to examine more combinations.
- In radio_receive_images_caesar_brute_force_try_this, change for key in range(-1, -26, -1) to for key in range(-1, -94, -1).
- You could also comment the while True: statement and outdent everything below and indented from it. You can then press/release Reset and wait to grab another packet for analysis.
- Make sure your scripts match the ones below, then click Save in both micro:bit Python Editors.
You might notice an upper-case HAPPY as well as a lower-case happy. The key that generates the upper-case HAPPY is the correct answer, though either might actually work for a sniffing attacker’s purposes. This is an additional weakness of the ASCII Shift cipher. Make sure not to choose a key that will simply encrypt your upper case characters as lower-case or vice-versa.
Try This Transmitter Script :radio_send_images_caesar_key_unknown_try_this.py
# radio_send_images_caesar_key_unknown_try_this.py from microbit import * import radio import random # <- add ''' Function converts plaintext to ciphertext using key ''' def ascii_shift(key, text): # <- change (try this) result = "" # <- chante (try this) for letter in text: # <- change (try this) ascii = ( ord(letter) + key - 32 ) % 94 + 32 # <- change (try this) result = result + chr(ascii) # <- change (try this) return result # <- change (try this) ''' Script starts from here... ''' radio.on() radio.config(channel=7) sleep(1000) string_list = ["HAPPY", "SAD", "ANGRY"] # key = random.randint(1, 25) # <- add key = random.randint(1, 93) # <- change (try this) while True: for packet in string_list: print("packet:", packet) display.show(getattr(Image, packet)) # packet = caesar(3, packet) # <- change (before) # packet = caesar(key, packet) # <- change (after) packet = ascii_shift(key, packet) # <- change (try this) print("Send encrypted:", packet) radio.send(packet) # sleep(2500) # <- change (before) sleep(6000) # <- change (after)
Try This Receiver Script: radio_receive_images_caesar_brute_force_try_this.py
# radio_receive_images_caesar_brute_force_try_this.py from microbit import * import radio ''' Function converts plaintext to ciphertext using key ''' def ascii_shift(key, text): # <- change (try this) result = "" # <- chante (try this) for letter in text: # <- change (try this) ascii = ( ord(letter) + key - 32 ) % 94 + 32 # <- change (try this) result = result + chr(ascii) # <- change (try this) return result # <- change (try this) ''' Script starts from here... ''' radio.on() radio.config(channel=7) sleep(1000) while True: packet = radio.receive() if packet: print("Receive encrypted:", packet) # packet = caesar(-3, packet) # <- comment # print("packet:", packet) # <- comment # display.show(getattr(Image, packet)) # <- comment # for key in range(-1, -26, -1): # <- add for key in range(-1, -94, -1): # <- change (try this) # result = caesar(key, packet) # <- add result = ascii_shift(key, packet) # <- change (try this) print("key:", key, "result:", result) # <- add sleep(200) # <- add print() # <- add