Code César (y compris les kanji) en Python

Code César

[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.

Mise en œuvre (alphabet / nombre uniquement)

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!'

Mise en œuvre (y compris les kanji)

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

Supplément

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

Code César (y compris les kanji) en Python
Ecrire un programme de chiffrement Caesar en Python
Créer et décrypter du code César avec python
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord 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
Constante 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
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
J'ai créé un programme cryptographique César en Python.
AtCoder # 36 quotidien avec Python
Texte de cluster en Python
Daily AtCoder # 32 en Python
Daily AtCoder # 6 en Python
Daily AtCoder # 18 en Python
Modifier les polices en Python
Motif singleton en Python
Opérations sur les fichiers en Python
Lire DXF avec python
Daily AtCoder # 53 en Python
Séquence de touches en Python
Utilisez config.ini avec Python
Résoudre ABC168D en Python
AtCoder # 7 tous les jours avec Python
Décomposition LU en Python