2
0

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

今回はPythonを使ってアルファベットの文字列を暗号化したり、逆に復号化したりするコードを作りましたので、コードと仕組みを簡単に書いていきたいと思います。

Google Colab

作成したコード

暗号化用コード

encrypt.py
import random

############ データを格納するための空配列を生成 ############
afterBin = []
cryptList = []
cryptSentence = []
toSentence = []
toKeySentence = []

############ 関数定義 ############
def listXOR(argA, argB):
    for a,b in zip(argA, argB):
        A = int(a,2)
        B = int(b,2)
        cryptSentence.append(bin(int(A) ^ int(B)))

def numXOR(argC, argD):
    C = int(argC,2)
    D = int(argD,2)
    return bin(int(C) ^ int(D))

def checkNum(checkNumber,listNum):
    randomNumber = bin(random.randint(33,126))
    retake = bin(int(checkNumber,2) ^ int(int(randomNumber,2)))
    if int(retake,2) > 32 and int(retake,2) < 127:
        cryptSentence[listNum] = retake
        cryptList[listNum] = randomNumber
    else:
        checkNum(afterBin[k], listNum)

def checkTail(checkTailNumber,listNum):
    randomNumber = bin(random.randint(33,126))
    retake = bin(int(checkTailNumber,2) ^ int(int(randomNumber,2)))
    if int(retake,2) == 32:
        checkTail(cryptSentence[listNum-1], listNum-1)
    else:
        cryptSentence[listNum] = retake
        cryptList[listNum] = randomNumber


############ 暗号化対象文章の取得 ############
text = input("Enter the sentence you want to encrypt:")
beforeBin = list(text)

############ 暗号化対象文章を10進数→2進数に変換する ############
for i in beforeBin:
    afterBin.append((f'{ord(i):b}'.zfill(8)))

############ 暗号鍵を2進数で作成する ############
listNum = len(afterBin)
for j in range(listNum):
    cryptList.append(bin(random.randint(33,126)))

############ 暗号化対象文章と暗号鍵を使い排他的論理和を取得する ###########
listXOR(afterBin, cryptList)

############ 排他的論理和がASCIIの範囲内(有効桁33-126)であることを確認する ###########
############ ASCIIの範囲外(有効桁33-126)である場合暗号鍵を修正する ###########
k = 0
for c in cryptSentence:
    if int(c,2) > 32 and int(c,2) < 127:
        k += 1
    else:
        checkNum(afterBin[k], k)
        k += 1

############ 排他的論理和の末尾がASCIIの半スペース(10進数:32及び2進数:00100000) ###########
############ 末尾がASCIIの半スペース(10進数:32及び2進数:00100000)である場合暗号鍵を修正する ###########
if int(cryptSentence[listNum-1],2) == 32:
    checktail(cryptSentence[listNum-1], listNum-1)

############ 排他的論理和で計算した2進数を10進数に直し、ASCIIに変換し文字列に変換し文章を生成 ###########
for e in cryptSentence:
    e = int(e,2)
    toSentence.append(chr(e))
print("=================================================-")
print("暗号化した文章は以下")
print("".join(toSentence))

############ 排他的論理和で計算した2進数を10進数に直し、ASCIIに変換し文字列に変換し暗号鍵を生成 ###########
for f in cryptList:
    f = int(f,2)
    toKeySentence.append(chr(f))
print("=================================================-")
print("暗号化に使用した鍵は以下")
print("".join(toKeySentence))

復号化用コード

decrypt.py
############ 復号化対象の文章と暗号鍵を取得 ############
inputEncryptedSentence = input("暗号文:")
inputEncryptedKey = input("暗号鍵:")

############ データを格納するための空配列を生成 ############
beforeBin = list(inputEncryptedSentence)
beforeKeyBin = list(inputEncryptedKey)
afterBin = []
afterKeyBin = []
cryptList = []
cryptSentence = []
toDec = []
toSentence = []

############ 復号対象の文章を2進数に変換 ############
for i in beforeBin:
    afterBin.append((f'{ord(i):b}'.zfill(8)))

############ 暗号鍵を2進数に変換 ############
for i in beforeKeyBin:
    afterKeyBin.append((f'{ord(i):b}'.zfill(8)))

############ 復号対象の文章と暗号鍵を使用し排他的論理和を取得 ############
for a,b in zip(afterBin, afterKeyBin):
    A = int(a,2)
    B = int(b,2)
    cryptSentence.append(bin(int(A) ^ int(B)))

############ 復号対象の文章を復号化する ############
for c in cryptSentence:
    c = int(c,2)
    toSentence.append(chr(c))
print("")
print("=================================================-")
print("復号化した文章は以下")
print("".join(toSentence))

出力例

暗号化

"I love dog!!!"という文字列を暗号化してみます。
暗号化の結果".K90'Co3%NwMI"という文字列に置換されました。
またこの暗号化された文章は"gkU_Q&OWJ)Vlh"という文字列により生成されました。暗号化された文章を復号するときにこの文字列が必要となります。

Enter the sentence you want to encrypt:I love dog!!!
=================================================-
暗号化した文章は以下
.K90'Co3%NwMI
=================================================-
暗号化に使用した鍵は以下
gkU_Q&OWJ)Vlh

復号化

暗号化された文字列である".K90'Co3%NwMI"と暗号化のために使用した"gkU_Q&OWJ)Vlh"を引き渡すことにより暗号化前の文字列である"I love dog!!!"という文字列が返ってきました。復号化されていますね。

暗号文:.K90'Co3%NwMI
暗号鍵:gkU_Q&OWJ)Vlh

=================================================-
復号化した文章は以下
I love dog!!!
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0