lasc/cypher.py
2023-10-06 17:52:09 +02:00

110 lines
3.4 KiB
Python

import argparse
def encode_shift_cipher(text, key):
result = ""
alphabet = 'abcdefghijklmnopqrstuvwxyz'
shift_direction = 1
shift_count = 0
for char in text:
if char.isalpha():
shift = int(key[shift_count]) * shift_direction
index = alphabet.index(char.lower())
# Calculate the new index and wrap around if it's less than 0
new_index = (index + shift) % 26
if new_index < 0:
new_index += 26 # Wrap around to 'z'
result += alphabet[new_index]
shift_direction *= -1
shift_count = (shift_count + 1) % len(key)
else:
result += char
return result
def decode_shift_cipher(text, key):
result = ""
alphabet = 'abcdefghijklmnopqrstuvwxyz'
shift_direction = 1
shift_count = 0
for char in text:
if char.isalpha():
shift = int(key[shift_count]) * shift_direction
index = alphabet.index(char.lower())
# Calculate the new index and wrap around if it's less than 0
new_index = (index - shift) % 26
if new_index < 0:
new_index += 26 # Wrap around to 'z'
result += alphabet[new_index]
shift_direction *= -1
shift_count = (shift_count + 1) % len(key)
else:
result += char
return result
def main():
parser = argparse.ArgumentParser(description="Shift Cipher Encoder/Decoder")
parser.add_argument("-e", "--encode", action="store_true", help="Encode the input")
parser.add_argument("-d", "--decode", action="store_true", help="Decode the input")
parser.add_argument("-k", "--key", required=True, help="Encryption/Decryption key (e.g., '1234')")
parser.add_argument("-i", "--input", help="Input file to process")
parser.add_argument("-o", "--output", help="Output file (optional)")
parser.add_argument("-s", "--string", help="Input string to process")
args = parser.parse_args()
if not args.encode and not args.decode:
print("Please specify whether to encode or decode using -e or -d.")
return
if args.encode and args.decode:
print("Please choose either -e (encode) or -d (decode), not both.")
return
if args.input and args.string:
print("Please choose either -i (input file) or -s (input string), not both.")
return
if args.input:
# Read input from a file
try:
with open(args.input, "r") as file:
input_text = file.read()
except FileNotFoundError:
print(f"Error: Input file '{args.input}' not found.")
return
elif args.string:
# Use the input string
input_text = args.string
else:
# Read input from the command line
input_text = input("Enter the text to encode/decode: ")
key = args.key
if args.encode:
output_text = encode_shift_cipher(input_text, key)
else:
output_text = decode_shift_cipher(input_text, key)
if args.output:
# Write the result to an output file
with open(args.output, "w") as file:
file.write(output_text)
print(f"Output written to '{args.output}'")
else:
# Print the result to the console
print("Result:")
print(output_text)
if __name__ == "__main__":
main()