首頁 > 軟體

python密碼學簡單替代密碼解密及測試教學

2022-05-24 14:00:50

簡單替代密碼

簡單替換密碼是最常用的密碼,包括為每個密文文字字元替換每個純文字字元的演演算法.在這個過程中,與凱撒密碼演演算法相比,字母表是混亂的.

範例

簡單替換密碼的金鑰通常由26個字母組成.一個範例鍵是 :

plain alphabet : abcdefghijklmnopqrstuvwxyz
cipher alphabet: phqgiumeaylnofdxjkrcvstzwb

使用上述金鑰的範例加密是 :

plaintext : defend the east wall of the castle
ciphertext: giuifg cei iprc tpnn du cei qprcni

以下程式碼顯示了一個實現簡單替換密碼的程式;

import random, sys
LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def main():
   message = ''
   if len(sys.argv) > 1:
      with open(sys.argv[1], 'r') as f:
         message = f.read()
   else:
      message = raw_input("Enter your message: ")
   mode = raw_input("E for Encrypt, D for Decrypt: ")
   key = ''
   
   while checkKey(key) is False:
      key = raw_input("Enter 26 ALPHA key (leave blank for random key): ")
      if key == '':
         key = getRandomKey()
      if checkKey(key) is False:
print('There is an error in the key or symbol set.')
   translated = translateMessage(message, key, mode)
   print('Using key: %s' % (key))
   
   if len(sys.argv) > 1:
      fileOut = 'enc.' + sys.argv[1]
      with open(fileOut, 'w') as f:
         f.write(translated)
      print('Success! File written to: %s' % (fileOut))
   else: print('Result: ' + translated)
# Store the key into list, sort it, convert back, compare to alphabet.
def checkKey(key):
   keyString = ''.join(sorted(list(key)))
   return keyString == LETTERS
def translateMessage(message, key, mode):
   translated = ''
   charsA = LETTERS
   charsB = key
   
   # If decrypt mode is detected, swap A and B
   if mode == 'D':
      charsA, charsB = charsB, charsA
   for symbol in message:
      if symbol.upper() in charsA:
         symIndex = charsA.find(symbol.upper())
         if symbol.isupper():
            translated += charsB[symIndex].upper()
         else:
            translated += charsB[symIndex].lower()
else:
               translated += symbol
         return translated
def getRandomKey():
   randomList = list(LETTERS)
   random.shuffle(randomList)
   return ''.join(randomList)
if __name__ == '__main__':
   main()

輸出

您可以觀察以下內容當你實現上面給出的程式碼時輸出 :

簡單替換密碼測試

我們將重點介紹如何使用各種方法測試替換密碼,這有助於生成隨機字串,如下面所示 :

import random, string, substitution
def main():
   for i in range(1000):
      key = substitution.getRandomKey()
      message = random_string()
      print('Test %s: String: "%s.."' % (i + 1, message[:50]))
      print("Key: " + key)
      encrypted = substitution.translateMessage(message, key, 'E')
      decrypted = substitution.translateMessage(encrypted, key, 'D')
      
      if decrypted != message:
         print('ERROR: Decrypted: "%s" Key: %s' % (decrypted, key))
         sys.exit()
      print('Substutition test passed!')
def random_string(size = 5000, chars = string.ascii_letters + string.digits):
   return ''.join(random.choice(chars) for _ in range(size))
if __name__ == '__main__':
   main()

輸出

您可以隨機觀察輸出生成的字串有助於生成隨機純文字訊息,如下所示 :

測試成功完成後,我們可以觀察輸出訊息替換測試通過!.

因此,您可以系統地破解替換密碼.

簡單替換密碼解密

您可以瞭解替換密碼的簡單實現,它根據簡單替換密碼技術中使用的邏輯顯示加密和解密的訊息.這可以被視為一種替代編碼方法.

程式碼

您可以使用以下程式碼使用簡單替換密碼來執行解密;

import random
chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 
   'abcdefghijklmnopqrstuvwxyz' + 
   '0123456789' + 
   ':.;,?!@#$%&()+=-*/_<> []{}`~^"'\'
def generate_key():
   """Generate an key for our cipher"""
   shuffled = sorted(chars, key=lambda k: random.random())
   return dict(zip(chars, shuffled))
def encrypt(key, plaintext):
   """Encrypt the string and return the ciphertext"""
   return ''.join(key[l] for l in plaintext)
def decrypt(key, ciphertext):
   """Decrypt the string and return the plaintext"""
   flipped = {v: k for k, v in key.items()}
   return ''.join(flipped[l] for l in ciphertext)
def show_result(plaintext):
   """Generate a resulting cipher with elements shown"""
   key = generate_key()
   encrypted = encrypt(key, plaintext)
   decrypted = decrypt(key, encrypted)   
   print 'Key: %s' % key
print 'Plaintext: %s' % plaintext
   print 'Encrypted: %s' % encrypted
   print 'Decrypted: %s' % decrypted
show_result('Hello World. This is demo of substitution cipher')

以上就是python密碼學簡單替代密碼解密及測試教學的詳細內容,更多關於python替代密碼解密測試的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com