111 lines
3.4 KiB
Python
111 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()
|