首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在巨蟒凯撒密码中保留标点符号

在巨蟒凯撒密码中保留标点符号
EN

Stack Overflow用户
提问于 2022-11-21 12:29:16
回答 3查看 54关注 0票数 0

我读过关于如何解决相同问题的多个相关线程,但我无法将解决方案应用于我的代码。

此外,代码应该接收到文本文件的路径,该文本文件必须包含仅由英文字母和标点符号组成的文本和加密数据的目标文件。

有什么建议吗?

代码语言:javascript
复制
    def check_alpha(m_string):
        list_wanted = ['!', '?', '.', ',', ' ']
        for letter in m_string:
            if not (letter in list_wanted or letter.isalpha()):
                 return False

            return True and any(letter.isalpha() for letter in m_string)

    while True:
       string = input("Enter the text to be encrypted: ")
       if check_alpha(string):
        break
       else:
          print("Please enter a valid text: ")
       continue
    while True:  #  Validating input key
        key = input("Enter the key: ")
        try:
            key = int(key)
        except ValueError:
            print("Please enter a valid key: ")
            continue
        break
    
    
    def caesarcipher(string, key):   #  Caesar Cipher
        encrypted_string = []
        new_key = key % 26
        for letter in string:
            encrypted_string.append(getnewletter(letter, new_key))
        return ''.join(encrypted_string)
    
    
    def getnewletter(letter, key):
        new_letter = ord(letter) + key
        return chr(new_letter) if new_letter <= 122 else chr(96 + new_letter % 122)
    
    
    with open('Caesar.txt', 'a') as the_file:  # Writing to a text file
        the_file.write(caesarcipher(string, key))
    
    print(caesarcipher(string, key))
    print('Your text has been encrypted via Caesar-Cipher, the result is in Caesar.txt')
EN

回答 3

Stack Overflow用户

发布于 2022-11-21 12:44:33

正如Alex所提到的,您可以使用if条件单独处理所有标点符号:

代码语言:javascript
复制
def caesarcipher(string, key):   #  Caesar Cipher
        encrypted_string = []
        new_key = key % 26
        for letter in string:
            if letter in ['!', '?', '.', ',', ' ']:
                encrypted_string.append(letter)
            else:
                encrypted_string.append(getnewletter(letter, new_key))
        return ''.join(encrypted_string)
票数 1
EN

Stack Overflow用户

发布于 2022-11-21 12:47:02

你可以做另一个可以与check_alpha()函数相关的函数。

编辑:我希望我能正确理解你的问题。如果没有,那就让我知道。

代码语言:javascript
复制
import pathlib

def load_file(file_path)
   from pathlib import Path
   
   if not Path(file_path).exist():
      return False
   
   with open(file_path, 'r') as fin:
      for line in fin.readlines():
           if not check_alpha(line.strip('\n')):
              return False

   return fin.read() -> this will create '\n' at every end of the line! keep that in mind

def check_aplha(m_string).... -> keep the original

while True:
   fin = input("Enter file path with text selected for encryption: ")
   uncoded = load_file(fin)
      if uncoded: -> everything which is not None, Empty, False or 0 is True
         break
      else:
         print("Please enter a valid file with only valid letters/punctuations.\n")
         continue

while True:
   fout = input ("Enter file path for output file: ")   

   try:
      if not Path(fout.parent).exists():
         Path(fout.parent).mkdir(parents=True, exist_ok=True)
            break
      else:
         break
   except NotADirectoryError as err:
      print(f'Error {err} has occured. Probably wrong disk selection.')

通过这种方式,您完全可以对加密的数据执行此操作。我想所有的规则都适用于加密或解密的数据。

票数 1
EN

Stack Overflow用户

发布于 2022-11-21 12:48:29

Ceaser密码的一个简单示例,可根据您的需要进行跟踪

代码语言:javascript
复制
def encrypt(text,s):
  result = ""
  # transverse the plain text
  for i in range(len(text)):
    char = text[i]
    # Encrypt uppercase characters in plain text
    if is_a_letter(char):
    
      if (char.isupper()):
        result += chr((ord(char) + s-65) % 26 + 65)
        # Encrypt lowercase characters in plain text
      else:
        result += chr((ord(char) + s - 97) % 26 + 97)
    else:
      result += char
  return result
#check the above function
text = "CEASER!CIPHER.DEMO"
s = 4 # the length of the shift 
my_list = ['!', '?', '.', ',', ' ']

# check if the character is one of the above list
def is_a_letter(text):
  for x in range(0,len(my_list)):
    if text == my_list[x]:
      return False
  return True

print("Plain Text : " + text)
print("Shift pattern : " + str(s))
print("Cipher: " + encrypt(text,s))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74518944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档