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.
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.
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 |
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.
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.
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'
Es wird das folgende Tabellenvisionelquadrat genannt, wobei die Alphabete nacheinander verschoben werden.
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).
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.
Recommended Posts