[Code César-Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%BC%E3%82%B6%E3%83%BC%E6%9A%97% E5% 8F% B7) Il s'agit d'une méthode de cryptage primitive qui décale l'alphabet du nombre spécifié de caractères.
Pour les alphabets et les nombres uniquement, vous pouvez utiliser ROT13, une fonction intégrée de python. Selon le Wiki, le nombre de quarts de travail est traditionnellement de 13 dans de tels cas. Si vous le définissez sur 13, l'alphabet est de 26 caractères, il semble donc que la même fonction puisse gérer le cryptage et le décryptage. (Parce que je vais faire le tour et revenir)
import codecs
codecs.decode('Hello, World!', 'rot13')
# 'Uryyb, Jbeyq!'
codecs.decode('Uryyb, Jbeyq!', 'rot13')
# 'Hello, World!'
Cette fois, j'avais besoin de masquer les données de la chaîne de caractères, y compris les kanji, alors je l'ai fait moi-même. En plus de la restriction selon laquelle les alphabets et les nombres boucle dans la plage de A-Z, a-z, 0-1 et les symboles ne sont pas cryptés. J'ai dû sauvegarder les données avec Shift-Jis pour des raisons religieuses, alors je l'ai fait.
Cependant, il existe les restrictions suivantes. --Symbole tel qu'il est --Alphabet (majuscules et minuscules) Les nombres ne concernent que les caractères définis par clé --Kana / Kana / Kanji 1 ou plusieurs caractères (jusqu'à ce que le prochain caractère existant existe)
Veuillez noter que Kana-Kana-Kanji est un code qui se décale d'un caractère quel que soit le numéro de clé. La raison sera décrite plus tard.
def caesar(plaintext):
key=13 # key:Numéro pour décaler le code de caractère des alphabets et des nombres
enc="cp932"
ciphertext = ""
for ch in list(plaintext): #Scannez caractère par caractère et utilisez if minutes pour déterminer le type de caractère à partir du nombre dans le code de caractère
#symbole
if (' ' <= ch <= '/') or (':' <= ch <= '@') or ('[' <= ch <= '`') or ('{' <= ch <= '~') or ('、' <= ch <= '◯') :
ciphertext +=chr(ord(ch))
#A-Z
elif 'A' <= ch <= 'Z':
ciphertext += chr((ord(ch) - ord('A') + int(key)) % 26 + ord('A'))
#a-z
elif 'a' <= ch <= 'z':
ciphertext += chr((ord(ch) - ord('a') + int(key)) % 26 + ord('a'))
#0-9
elif '0' <= ch <= '9':
ciphertext += chr((ord(ch) - ord('0') + int(key)) % 10 + ord('0'))
#Autres (Hiragana, Katakana, Kanji, etc.)
else:
byte=bytearray(ch.encode(enc)) #Encodez en spécifiant le code de caractère, cette sortie sera une chaîne de 2 octets, donc convertissez-la en bytearray avant de la manipuler
while(1): #Les octets sont décalés un par un jusqu'à ce que le caractère atteigne le code de caractère existant.
try:
try:
byte[-1]+=0x01 #Décale la dernière partie d'octet d'un bit,
except:
byte[-1]=0x00 #Poursuivre la considération. Remet le dernier octet à 00 et incrémente l'octet suivant
byte[-2]+=0x01
x=byte.decode(enc) #Essayez de décoder avec enc et détectez l'occurrence d'une erreur
except:
pass
else:
break
ciphertext += x
return ciphertext
Voici un exemple de code de caractère qui n'a pas de caractère. Par exemple, lors du chiffrement «Activé», si vous essayez de le convertir en caractère après avoir ajouté +1 au code de caractère, une erreur se produira car le caractère n'existe pas. Pour cette raison, nous avons ajouté l'opération de répétition de +1 jusqu'à ce que le code de caractère soit atteint. Dans ce cas, "on" devient "comme". Cependant, cette fois, je suppose que la quantité de décalage est de 1, donc je n'ai rien fait de plus, Si vous voulez augmenter le nombre à 2 ou plus, ce sera une situation comme "les deux" lait "et" on "seront cryptés", veuillez donc modifier en conséquence. En raison de cette relation, Kana-Kana-Kanji est un programme qui "ne déplace qu'un seul à côté de lui" quel que soit "le nombre de caractères spécifié par clé".
Recommended Posts