Implémenter d'anciens chiffrements en python

Code ancien typique

Code César (code de décalage)

Implémentation cryptographique

Le cryptage César crypte en décalant l'alphabet d'un certain nombre de caractères. Si le nombre de décalages est n, il est appelé ROT N. Par exemple, quand il est 3, c'est ROT3.

caesar_cipher.py


#chiffrement
def encrypt(plain_text, shift_num):
	cipher = ""    #Cryptogramme
	for char in plain_text:
		if(char.isupper()):    #Quand dans la capitale
		    cipher += chr((ord(char) + shift_num - 65) % 26 + 65)
		else:                  #En minuscules
			cipher += chr((ord(char) + shift_num - 97) % 26 + 97)
	return cipher

#Texte brut
plain  = "draemon"

#Nombre de postes,clé
s = 3

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

Quand tu cours

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

J'ai pu le chiffrer.

Décrypter avec Brute Force Attack

Étant donné que l'anglais ne comporte que 26 caractères, il existe au maximum 26 façons de le décaler.

caesar_decipher.py




#Décrypter avec Brute Force Attack
def decrypt(cipher_text):  
	for shift_num in range(26):
		answer = ""  #Changement de clé_Résultat lors du décodage avec num
		for char in cipher_text:
			if(ord(char) - shift_num < 65):        #Lorsqu'il est capitalisé et devient plus petit que A lorsqu'il est décalé
				answer += chr(ord(char) - shift_num + 26)
			elif(ord(char) - shift_num < 97):      #Lorsqu'il est inférieur à a lorsqu'il est décalé
				answer += chr(ord(char) - shift_num + 26)

			else:                                   #En minuscules
				answer += chr(ord(char) - shift_num)

		print("clé" + str(shift_num) + "Décrypter avec →" + answer)


#Cryptogramme
cipher  = "gudhprq"

#Décryptage
decrypt(cipher) 

Quand tu fais ça

% python caesar_decipher.py
Décrypter avec la clé 0 → gudhprq
Décrypter avec la clé 1 → ftcgoqp
Décrypter avec la clé 2 → esbfnpo
Décrypter avec la clé 3 → draemon
Décrypter avec la clé 4 → cqzdlnm
Décrypter avec la clé 5 → bpyckml
Décrypter avec la clé 6 → aoxbjlk
Décrypter avec la clé 7 → znwaikj
Décrypter avec la clé 8 → ymvzhji
Décrypter avec la clé 9 → xluygih
Décrypter avec la clé 10 → wktxfhg
Décrypter avec la clé 11 → vjswegf
Décrypter avec la clé 12 → uirvdfe
Décrypter avec la clé 13 → thquced
Décrypter avec la clé 14 → sgptbdc
Décrypter avec la clé 15 → rfosacb
Décrypter avec la clé 16 → qenrzba
Décrypter avec la clé 17 → pdmqyaz
Décrypter avec la clé 18 → oclpxzy
Décrypter avec la clé 19 → nbkowyx
Décrypter avec la clé 20 → majnvxw
Décrypter avec la clé 21 → lzimuwv
Décrypter avec la clé 22 → kyhltvu
Décrypter avec la clé 23 → jxgksut
Décrypter avec la clé 24 → iwfjrts
Décrypter avec la clé 25 → hveiqsr

Le plus significatif d'entre eux est décrypté avec la clé 3.

Code de translittération unique

Le code César est crypté en décalant l'alphabet, tandis que le code de translittération unique est crypté en remplaçant l'alphabet par un alphabet différent. Par exemple, lorsque le texte brut est «draemon», il devient «jixbors» lorsqu'il est chiffré selon le tableau de correspondance suivant.

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

Implémentation cryptographique

Cette fois, j'ai utilisé le fichier texte jobs_quote.txt, qui résume les citations en anglais de Steve Jobs Quotations en texte brut, et utilisé une seule traduction. Cryptez avec cryptage. Cependant, par souci de simplicité, ne considérez que l'alphabet (en majuscules et en minuscules).

simple_substitution.py


import random
import re

#Fonction de chiffrement
def simple_sub_cipher():

    #Générer une liste d'alphabets ASCII
	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)      #Trier au hasard
	

	path = 'jobs_quote.txt'         #chemin du fichier texte
	with open(path) as f:
		words = f.read()      #Lire le fichier texte
		words = re.sub(r'[\W0-9_]', "", words)     #Effacez tout sauf l'alphabet

        #Remplacer par de nouveaux alphabets dans l'ordre à partir d'un
		for old, new in zip(alphabets, new_alphabets):
			words = words.replace(chr(old), chr(new))

		print(words)      #Affichage du texte crypté


simple_sub_cipher()

Quand tu cours

% python simple*
QPAacTWfDfDATDQTjAcTWaPLWQCPDfaHQcQfTGAAacafTTAQTLTFaHAAacaAacTWQLOaGOCGODcATTAATDaGQWATCGEATTAkDnALDEaCGEfTjATTAQQaODcfTTAQcCcVaHODEaAAaPCGcfTTAWaHQaODfGcATTACjTjAfHDPafWaHffafkTjCACjPafWaHfQaODfjQAjaGQWFWjTWCGEGaATTAWaHOTGOaGODGAfTADaGATDATCGEjATTATfDfDTQQWCLnafATGAVaHOTGAOaGGDOAATDcaAjQaakCGEPaffTfcWaHOTGaGQWOaGGDOAATDLQaakCGEFTOkfTfcjEaWaHTTODAaAfHjAATTAATDcaAjfCQQjaLDTafOaGGDOACGWaHfPHAHfDQLATDaGQWnDfjaGQkGafATTAjQajATIHTfADfaPTFCQQCaGcaQQTfjCGaGDWDTfQAjODfWOTTfTOADfFHCQcCGEECLnQDOTGFDTTfcDfATTGOaLnQDqVaHTTODAafafkTTfcAaEDAWaHfATCGkCGEOQDTGAaLTkDCAjCLnQDbHACAjfafATCACGATDDGcFDOTHjDaGODWaHEDAATDfDWaHOTGLaODLaHGATCGjQAjfDTQQWTTfcAacDjCEGnfacHOAjFWPaOHjEfaHnjfQaAaPACLDjnDanQDcaGAkGaffTTAATDWfTGAHGACQWaHjTafCAAaATDLbDCGEATDfCOTDjALTGCGATDODLDADfWcaDjGALTAADfAaLDHaCGEAaFDcTAGCETAjTWCGEfDODcaGDjaLDATCGEfaGcDfPHQATTAjfTTALTAADfjAaLDnTDOHfDPaffnnQDCjGaAOajAOHAACGEnTDOHfDPaffnnQDCjAaCGGaOTADCAjfTWaHAaPCAjOHffDGAnfDcCOTLDGAnTDaGQWfTWAacaEfDTAfafkCjAaQaODfTTAWaHcaQPWaHTTODGAPaHGcCAWDAkDDnQaakCGEcaGAjDAAQDfjfCATTQQLTAADfjaPATDTDTfAWaHQQkGaffTDGWaHPCGcCAVaHfOHjAaLDfjcfDTLaPTTTnnCDfTGcFDAADfQCPDcaGALaODnfacHOAjWGfCOTQCODjEATWTHGEfWEATWPaaQCjTQfaHQcAfTcDTQQaPLWADOTGaQaEWPafTGTPADfGaaGfCATEaOfTADjKDLDLFDfCGEATTAWaHTfDEaCGEAacCDCjATDFDjAfTWQkGafAaTOaCcATDAfTnaPATCGkCGEWaHTTODjaLDATCGEAaQajDCHTQCAWCjLafDCLnafATGAATTGIHTGACAWLGDTaLDfHGCjLHOTFDAADfATTGAfacaHFQDjEaLDACLDjfTDGWaHCGGaOTADWaHLTkDLCjATkDjQACjFDjAAaTcLCAATDLIHCOkQWTGcEDAaGfCATCLnfaOCGEWaHfaATDfCGGaOTACaGjQGGaOTACaGcCjACGEHCjTDjFDAfDDGTQDTcDfTGcTPaQQafDfcaWaHfTGAAajnDGcATDfDjAaPWaHfQCPDjDQQCGEjHETfDcfTADfafcaWaHfTGATOTTGODAaOTTGEDATDfafQcVaHfACLDCjQCLCADcjacaGAfTjADCAQCOCGEjaLDaGDDQjDjQCPDcaGAFDAfTnnDcFWcaELTfTCOTCjQCOCGEfCATATDfDjHQAjaPaATDfnDanQDjATCGkCGEcaGAQDAATDGaCjDaPaATDfjanCGCaGjcfafGaHAWaHfafGCGGDfOaCODfGcLajACLnafATGATTODATDOaHfTEDAaPaQQafWaHfTDTfATGcCGAHCACaGnTDWjaLDTafTQfDTcWkGaffTTAWaHAfHQWfTGAAaFDOaLDWODfWATCGEDQjDCjjDOaGcTfWbDTWTfcjACOkaPIHTQCAWEaLDnDanQDTfDGAHjDcAaTGDGOCfaGLDGAfTDfDDqODQQDGODCjDqnDOADcQLTjnfaHcaPfTTAfDcaGAcaTjQTLaPfTTAfDcaQcCcGAjDDCAATDGFHACAAHfGDcaHAATTAEDAACGEPCfDcPfaLfnnQDfTjATDFDjAATCGEATTAOaHQcTTODDODfTTnnDGDcAaLDnTDTDTOCGDjjaPFDCGEjHOODjjPHQfTjfDnQTODcFWATDQCETAGDjjaPFDCGETFDECGGDfTETCGQDjjjHfDTFaHADODfWATCGEQAPfDDcLDAaDGADfaGDaPATDLajAOfDTACODnDfCacjaPLWQCPDQPWaHQCODDTOTcTWTjCPCAfTjWaHfQTjAjaLDcTWWaHQQLajAODfATCGQWFDfCETAVaHOTGAjHjATjkOHjAaLDfjfTTAATDWfTGATGcATDGAfWAaECODATTAAaATDLbWATDACLDWaHEDACAFHCQAATDWQQfTGAjaLDATCGEGDf

J'ai pu le chiffrer en une phrase dénuée de sens.

Décrypté par analyse de fréquence

L'analyse de fréquence consiste à vérifier la fréquence des lettres.

Par exemple, selon Frequency Analysis Wikipedia, général Le plus couramment utilisé est «e». Le second vient «i», le troisième vient «a», le quatrième vient «t» et le cinquième vient «n».

Ici, analysons la fréquence de jobs_quote.txt.

frequency_analyzer.py


import re

path = 'jobs_quote.txt'  #paramètre de chemin
with open(path) as f:
	words = f.read()   #Lire le fichier
	words = re.sub(r'[\W0-9_]', "", words).lower()

	char_set = { alphabet for alphabet in words } #Séparez un caractère à la fois
	char_freq = { alphabet : words.count(alphabet) for alphabet in char_set }  #Comptez le nombre de caractères

	sorted_char_freq = sorted(char_freq.items(), key = lambda x:x[1],reverse = True)    #Trier par fréquence

	print(sorted_char_freq)#indiquer

Quand tu cours

% 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)]

C'est devenu. Ce n'est pas exactement le même que le résultat de l'analyse de fréquence de Wikipédia précédemment, mais le résultat est assez similaire étant donné qu'il s'agit d'une citation.

Au fait, si vous connaissez t et e, vous pouvez facilement deviner les, they, he, get, etc. qui sont souvent utilisés en anglais. Vous pouvez déchiffrer cela en travaillant dur.

Autres chiffres historiques

ROT13

Le nombre de décalages du code César est de 13.

Soit x le texte brut

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

Il existe 26 alphabets, donc si vous répétez deux fois ROT13, vous reviendrez à la phrase ci-dessous. Lorsque ravin est converti en ROT13, il est utilisé pour le jeu de mots comme enivar.

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

Code Visionel

Il est appelé le carré de visionel de tableau suivant avec l'alphabet décalé un par un. 20160508023749.png

Par exemple, lorsque le texte brut est «DRAEMON» et que la clé est «ABC», «D» est «D» dans la ligne A et la colonne D, R est «S» dans la ligne B et la colonne R, et A est la ligne C et la colonne A «C». Sera. Si le texte brut est plus long que la clé, utilisez la clé à plusieurs reprises. En d'autres termes, le «E» suivant est E dans la ligne A et la colonne E. Si cela se répète, il sera chiffré en tant que «DSCENQN». Il est important de ne pas connaître le cycle de clé (3 dans ce cas).

Ici, a = 0, b = 1, ..., z = 26, pi est le i-ème caractère du texte brut, Ki est le i-ème caractère de la clé et Ci est le i-ème caractère du texte crypté.

C_i = (P_i + K_i)mod26

Au fait, si le décodage s'exprime de la même manière

P_i = (C_i - K_i)mod26

Sera.

Il existe deux méthodes de décryptage: ** Cassis Key Test ** et ** Key Deduction **.

Le ** Test de clé de Cassis ** se concentre sur la répétition des touches et ne peut pas être utilisé lorsqu'il est très long (plus de la moitié de la longueur d'un texte brut).

Code Uesugi

Comme le code visuel, mettez le pseudonyme plat dans un tableau de 7 carrés, attribuez des nombres verticalement et horizontalement, et cryptez avec le numéro correspondant au pseudonyme plat.

Par exemple, «shino» est chiffré comme «75, 36, 46».

series01_encryption_history_03_02.gif

Recommended Posts

Implémenter d'anciens chiffrements en python
Implémenter XENO avec python
Implémenter sum en Python
Implémenter Traceroute dans Python 3
Implémenter Naive Bayes dans Python 3.3
Implémenter Redis Mutex en Python
Implémenter l'extension en Python
Mettre en œuvre un RPC rapide en Python
Implémenter l'algorithme de Dijkstra en python
Implémenter le bot de discussion Slack en Python
Mettre en œuvre l'apprentissage de l'empilement en Python [Kaggle]
Implémenter la fonction power.prop.test de R en python
Implémenter le modèle Singleton en Python
Implémentez rapidement l'API REST en Python
Quadtree en Python --2
Python en optimisation
CURL en Python
J'ai essayé d'implémenter PLSA en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Implémenter __eq__ etc. de manière générique dans la classe Python
J'ai essayé d'implémenter la permutation en Python
Méta-analyse en Python
Unittest en Python
Implémenter le filtre FIR en langage Python et C
Mettre en œuvre collectivement des tests d'hypothèses statistiques en Python
J'ai essayé d'implémenter PLSA dans Python 2
Époque en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
J'ai essayé d'implémenter ADALINE en Python
Constante en Python
J'ai essayé d'implémenter PPO en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python