Implementieren Sie alte Chiffren in Python

Typischer alter Code

Caesar Code (Schichtcode)

Kryptografische Implementierung

Caesar-Verschlüsselung verschlüsselt, indem das Alphabet um eine bestimmte Anzahl von Zeichen verschoben wird. Wenn die Anzahl der Schichten n ist, heißt es ROT N. Wenn es beispielsweise 3 ist, ist es ROT3.

caesar_cipher.py


#Verschlüsselung
def encrypt(plain_text, shift_num):
	cipher = ""    #Geheimtext
	for char in plain_text:
		if(char.isupper()):    #Wenn in der Hauptstadt
		    cipher += chr((ord(char) + shift_num - 65) % 26 + 65)
		else:                  #In Kleinbuchstaben
			cipher += chr((ord(char) + shift_num - 97) % 26 + 97)
	return cipher

#Klartext
plain  = "draemon"

#Anzahl der Schichten,Schlüssel
s = 3

print("Plain Text : " + plain) 
print("shift_num : " + str(s))
print("cipher : " + encrypt(plain, s))

Wenn du rennst

% python caesar_cipher.py 
Plain Text : draemon
shift_num : 3
cipher : gudhprq

Ich konnte es verschlüsseln.

Mit Brute Force Attack entschlüsseln

Da Englisch nur 26 Zeichen hat, gibt es höchstens 26 Möglichkeiten, es zu verschieben.

caesar_decipher.py




#Mit Brute Force Attack entschlüsseln
def decrypt(cipher_text):  
	for shift_num in range(26):
		answer = ""  #Tastenverschiebung_Ergebnis beim Dekodieren mit num
		for char in cipher_text:
			if(ord(char) - shift_num < 65):        #Wenn es groß geschrieben wird und beim Verschieben kleiner als A wird
				answer += chr(ord(char) - shift_num + 26)
			elif(ord(char) - shift_num < 97):      #Wenn es niedriger als a ist, wenn es verschoben wird
				answer += chr(ord(char) - shift_num + 26)

			else:                                   #In Kleinbuchstaben
				answer += chr(ord(char) - shift_num)

		print("Schlüssel" + str(shift_num) + "Entschlüsseln mit →" + answer)


#Geheimtext
cipher  = "gudhprq"

#Entschlüsselung
decrypt(cipher) 

Wenn du das machst

% python caesar_decipher.py
Mit Schlüssel 0 entschlüsseln → gudhprq
Mit Schlüssel 1 → ftcgoqp entschlüsseln
Mit Schlüssel 2 entschlüsseln → esbfnpo
Mit Schlüssel 3 entschlüsseln → draemon
Mit Schlüssel 4 → cqzdlnm entschlüsseln
Mit Schlüssel 5 → bpyckml entschlüsseln
Mit Schlüssel 6 entschlüsseln → aoxbjlk
Mit Schlüssel 7 entschlüsseln → znwaikj
Mit Schlüssel 8 entschlüsseln → ymvzhji
Mit Schlüssel 9 → xluygih entschlüsseln
Entschlüsseln Sie mit Schlüssel 10 → wktxfhg
Mit Schlüssel 11 entschlüsseln → vjswegf
Mit Schlüssel 12 → uirvdfe entschlüsseln
Mit Schlüssel 13 → entschlüsseln entschlüsseln
Mit Schlüssel 14 → sgptbdc entschlüsseln
Mit Schlüssel 15 → rfosacb entschlüsseln
Mit Schlüssel 16 → qenrzba entschlüsseln
Mit Schlüssel 17 entschlüsseln → pdmqyaz
Mit Schlüssel 18 entschlüsseln → oclpxzy
Mit Schlüssel 19 → nbkowyx entschlüsseln
Mit Schlüssel 20 entschlüsseln → majnvxw
Mit Schlüssel 21 entschlüsseln → lzimuwv
Mit Schlüssel 22 entschlüsseln → kyhltvu
Mit Schlüssel 23 → jxgksut entschlüsseln
Mit Schlüssel 24 entschlüsseln → iwfjrts
Mit Schlüssel 25 entschlüsseln → hveiqsr

Am aussagekräftigsten ist die Entschlüsselung mit Schlüssel 3.

Einzelner Transliterationscode

Der Caesar-Code wird durch Verschieben des Alphabets verschlüsselt, während der einzelne Transliterationscode durch Ersetzen des Alphabets durch ein anderes Alphabet verschlüsselt wird. Wenn der Klartext beispielsweise "draemon" ist, wird er zu "jixbors", wenn er gemäß der folgenden Korrespondenztabelle verschlüsselt wird.

1 2 3 4 5 6 7
a d e m n o r
x j b o s r i

Kryptografische Implementierung

Dieses Mal habe ich die Textdatei "jobs_quote.txt" verwendet, in der die englischen Zitate von Steve Jobs Quotations als Klartext zusammengefasst sind, und eine einzige Übersetzung verwendet. Mit Verschlüsselung verschlüsseln. Betrachten Sie der Einfachheit halber jedoch nur das Alphabet (sowohl Groß- als auch Kleinbuchstaben).

simple_substitution.py


import random
import re

#Funktion zum Verschlüsseln
def simple_sub_cipher():

    #Generieren Sie eine ASCII-Liste mit Alphabeten
	alphabets = [65 + i for i in range(26)] + [97 + i for i in range(26)]    
	new_alphabets = [65 + i for i in range(26)] + [97 + i for i in range(26)]

	random.shuffle(new_alphabets)      #Nach dem Zufallsprinzip sortieren
	

	path = 'jobs_quote.txt'         #Pfad der Textdatei
	with open(path) as f:
		words = f.read()      #Textdatei lesen
		words = re.sub(r'[\W0-9_]', "", words)     #Löschen Sie alles außer dem Alphabet

        #Durch neue Alphabete ersetzen in der Reihenfolge von a
		for old, new in zip(alphabets, new_alphabets):
			words = words.replace(chr(old), chr(new))

		print(words)      #Anzeige von verschlüsseltem Text


simple_sub_cipher()

Wenn du rennst

% python simple*
QPAacTWfDfDATDQTjAcTWaPLWQCPDfaHQcQfTGAAacafTTAQTLTFaHAAacaAacTWQLOaGOCGODcATTAATDaGQWATCGEATTAkDnALDEaCGEfTjATTAQQaODcfTTAQcCcVaHODEaAAaPCGcfTTAWaHQaODfGcATTACjTjAfHDPafWaHffafkTjCACjPafWaHfQaODfjQAjaGQWFWjTWCGEGaATTAWaHOTGOaGODGAfTADaGATDATCGEjATTATfDfDTQQWCLnafATGAVaHOTGAOaGGDOAATDcaAjQaakCGEPaffTfcWaHOTGaGQWOaGGDOAATDLQaakCGEFTOkfTfcjEaWaHTTODAaAfHjAATTAATDcaAjfCQQjaLDTafOaGGDOACGWaHfPHAHfDQLATDaGQWnDfjaGQkGafATTAjQajATIHTfADfaPTFCQQCaGcaQQTfjCGaGDWDTfQAjODfWOTTfTOADfFHCQcCGEECLnQDOTGFDTTfcDfATTGOaLnQDqVaHTTODAafafkTTfcAaEDAWaHfATCGkCGEOQDTGAaLTkDCAjCLnQDbHACAjfafATCACGATDDGcFDOTHjDaGODWaHEDAATDfDWaHOTGLaODLaHGATCGjQAjfDTQQWTTfcAacDjCEGnfacHOAjFWPaOHjEfaHnjfQaAaPACLDjnDanQDcaGAkGaffTTAATDWfTGAHGACQWaHjTafCAAaATDLbDCGEATDfCOTDjALTGCGATDODLDADfWcaDjGALTAADfAaLDHaCGEAaFDcTAGCETAjTWCGEfDODcaGDjaLDATCGEfaGcDfPHQATTAjfTTALTAADfjAaLDnTDOHfDPaffnnQDCjGaAOajAOHAACGEnTDOHfDPaffnnQDCjAaCGGaOTADCAjfTWaHAaPCAjOHffDGAnfDcCOTLDGAnTDaGQWfTWAacaEfDTAfafkCjAaQaODfTTAWaHcaQPWaHTTODGAPaHGcCAWDAkDDnQaakCGEcaGAjDAAQDfjfCATTQQLTAADfjaPATDTDTfAWaHQQkGaffTDGWaHPCGcCAVaHfOHjAaLDfjcfDTLaPTTTnnCDfTGcFDAADfQCPDcaGALaODnfacHOAjWGfCOTQCODjEATWTHGEfWEATWPaaQCjTQfaHQcAfTcDTQQaPLWADOTGaQaEWPafTGTPADfGaaGfCATEaOfTADjKDLDLFDfCGEATTAWaHTfDEaCGEAacCDCjATDFDjAfTWQkGafAaTOaCcATDAfTnaPATCGkCGEWaHTTODjaLDATCGEAaQajDCHTQCAWCjLafDCLnafATGAATTGIHTGACAWLGDTaLDfHGCjLHOTFDAADfATTGAfacaHFQDjEaLDACLDjfTDGWaHCGGaOTADWaHLTkDLCjATkDjQACjFDjAAaTcLCAATDLIHCOkQWTGcEDAaGfCATCLnfaOCGEWaHfaATDfCGGaOTACaGjQGGaOTACaGcCjACGEHCjTDjFDAfDDGTQDTcDfTGcTPaQQafDfcaWaHfTGAAajnDGcATDfDjAaPWaHfQCPDjDQQCGEjHETfDcfTADfafcaWaHfTGATOTTGODAaOTTGEDATDfafQcVaHfACLDCjQCLCADcjacaGAfTjADCAQCOCGEjaLDaGDDQjDjQCPDcaGAFDAfTnnDcFWcaELTfTCOTCjQCOCGEfCATATDfDjHQAjaPaATDfnDanQDjATCGkCGEcaGAQDAATDGaCjDaPaATDfjanCGCaGjcfafGaHAWaHfafGCGGDfOaCODfGcLajACLnafATGATTODATDOaHfTEDAaPaQQafWaHfTDTfATGcCGAHCACaGnTDWjaLDTafTQfDTcWkGaffTTAWaHAfHQWfTGAAaFDOaLDWODfWATCGEDQjDCjjDOaGcTfWbDTWTfcjACOkaPIHTQCAWEaLDnDanQDTfDGAHjDcAaTGDGOCfaGLDGAfTDfDDqODQQDGODCjDqnDOADcQLTjnfaHcaPfTTAfDcaGAcaTjQTLaPfTTAfDcaQcCcGAjDDCAATDGFHACAAHfGDcaHAATTAEDAACGEPCfDcPfaLfnnQDfTjATDFDjAATCGEATTAOaHQcTTODDODfTTnnDGDcAaLDnTDTDTOCGDjjaPFDCGEjHOODjjPHQfTjfDnQTODcFWATDQCETAGDjjaPFDCGETFDECGGDfTETCGQDjjjHfDTFaHADODfWATCGEQAPfDDcLDAaDGADfaGDaPATDLajAOfDTACODnDfCacjaPLWQCPDQPWaHQCODDTOTcTWTjCPCAfTjWaHfQTjAjaLDcTWWaHQQLajAODfATCGQWFDfCETAVaHOTGAjHjATjkOHjAaLDfjfTTAATDWfTGATGcATDGAfWAaECODATTAAaATDLbWATDACLDWaHEDACAFHCQAATDWQQfTGAjaLDATCGEGDf

Ich konnte es in einen bedeutungslosen Satz verschlüsseln.

Entschlüsselt durch Frequenzanalyse

Die Frequenzanalyse dient zur Überprüfung der Häufigkeit von Buchstaben.

Zum Beispiel gemäß Frequenzanalyse Wikipedia allgemein Das am häufigsten verwendete ist "e". Das zweite ist "i", das dritte ist "a", das vierte ist "t" und das fünfte ist "n".

Hier analysieren wir die Häufigkeit von jobs_quote.txt.

frequency_analyzer.py


import re

path = 'jobs_quote.txt'  #Pfadeinstellung
with open(path) as f:
	words = f.read()   #Datei lesen
	words = re.sub(r'[\W0-9_]', "", words).lower()

	char_set = { alphabet for alphabet in words } #Trennen Sie jeweils ein Zeichen
	char_freq = { alphabet : words.count(alphabet) for alphabet in char_set }  #Zählen Sie die Anzahl der Zeichen

	sorted_char_freq = sorted(char_freq.items(), key = lambda x:x[1],reverse = True)    #Nach Häufigkeit sortieren

	print(sorted_char_freq)#zeigen

Wenn du rennst

% python freq*             
[('t', 285), ('e', 269), ('o', 244), ('n', 172), ('a', 168), ('i', 167), ('s', 128), ('r', 122), ('h', 118), ('l', 92), ('u', 89), ('y', 85), ('d', 84), ('m', 66), ('w', 64), ('c', 60), ('g', 55), ('f', 47), ('p', 39), ('v', 34), ('b', 32), ('k', 23), ('q', 5), ('x', 3), ('j', 1)]

Es wurde. Es ist nicht genau das gleiche wie das Frequenzanalyseergebnis von Wikipedia zuvor, aber das Ergebnis ist ziemlich ähnlich, wenn man bedenkt, dass es sich um ein Zitat handelt.

Übrigens, wenn Sie t und e kennen, können Sie leicht erraten, welche, sie, er usw. bekommen, die oft auf Englisch verwendet werden. Sie können dies entschlüsseln, indem Sie hart arbeiten.

Andere historische Chiffren

ROT13

Die Anzahl der Verschiebungen des Caesar-Codes beträgt 13.

Sei x der Klartext

ROT_{13}(ROT_{13}(x)) = ROT_{0}(x)

Es gibt 26 Alphabete. Wenn Sie also ROT13 zweimal wiederholen, kehren Sie zum folgenden Satz zurück. Wenn die Schlucht in ROT13 konvertiert wird, wird sie für Wortspiele wie Enivar verwendet.

>>> import codecs
>>> codecs.decode('abc', 'rot13')
'nop'

Visionel-Code

Es wird das folgende Tabellenvisionelquadrat genannt, wobei die Alphabete nacheinander verschoben werden. 20160508023749.png

Wenn zum Beispiel der Klartext "DRAEMON" und der Schlüssel "ABC" ist, ist "D" "D" in A-Zeile und D-Spalte, R ist "S" in B-Zeile und R-Spalte und A ist C-Zeile und A-Spalte "C". Wird sein. Wenn der Klartext länger als der Schlüssel ist, verwenden Sie den Schlüssel wiederholt. Mit anderen Worten, das nächste "E" ist E in Zeile A und Spalte E. Wenn dies wiederholt wird, wird es als "DSCENQN" verschlüsselt. Es ist wichtig, den Schlüsselzyklus nicht zu kennen (in diesem Fall 3).

Hier ist a = 0, b = 1, ..., z = 26, pi ist das i-te Zeichen des Klartextes, Ki ist das i-te Zeichen des Schlüssels und Ci ist das i-te Zeichen des verschlüsselten Textes.

C_i = (P_i + K_i)mod26

Übrigens, wenn die Dekodierung auf die gleiche Weise ausgedrückt wird

P_i = (C_i - K_i)mod26

Wird sein.

Es gibt zwei Methoden zur Entschlüsselung: ** Cassis Key Test ** und ** Key Deduction **.

Der ** Cassis Key Test ** konzentriert sich auf die Wiederholung von Tasten und kann nicht verwendet werden, wenn er sehr lang ist (mehr als die Hälfte der Länge eines einfachen Textes).

Uesugi-Code

Fügen Sie wie beim visuellen Code das flache Pseudonym in eine Tabelle mit 7 Quadraten ein, weisen Sie die Zahlen vertikal und horizontal zu und verschlüsseln Sie sie mit der Nummer, die dem flachen Pseudonym entspricht.

Zum Beispiel wird "shino" als "75, 36, 46" verschlüsselt.

series01_encryption_history_03_02.gif

Recommended Posts

Implementieren Sie alte Chiffren in Python
Implementieren Sie XENO mit Python
Implementieren Sie sum in Python
Implementieren Sie Traceroute in Python 3
Implementieren Sie Naive Bayes in Python 3.3
Implementieren Sie Redis Mutex in Python
Implementieren Sie die Erweiterung in Python
Implementieren Sie schnelles RPC in Python
Implementieren Sie den Dijkstra-Algorithmus in Python
Implementieren Sie den Slack Chat Bot in Python
Implementieren Sie das Stacking-Lernen in Python [Kaggle]
Implementieren Sie die Funktion power.prop.test von R in Python
Implementieren Sie das Singleton-Muster in Python
Implementieren Sie die REST-API schnell in Python
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Ich habe versucht, PLSA in Python zu implementieren
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Implementieren Sie __eq__ usw. generisch in der Python-Klasse
Ich habe versucht, Permutation in Python zu implementieren
Metaanalyse in Python
Unittest in Python
Implementieren Sie den FIR-Filter in Python und C.
Implementieren Sie gemeinsam statistische Hypothesentests in Python
Ich habe versucht, PLSA in Python 2 zu implementieren
Epoche in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Ich habe versucht, ADALINE in Python zu implementieren
Konstante in Python
Ich habe versucht, PPO in Python zu implementieren
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python