シーザーパスワードpython実装

6443 ワード

前に書いてあると
シーザーのパスワードの原理は簡単です.
げんり
暗号学では、シーザー暗号(英語:Caesar cipher)、あるいはシーザー暗号化、シーザー変換、変換暗号化と呼ばれ、最も簡単で最もよく知られている暗号化技術である.暗号化を置き換える技術で、明文のすべてのアルファベットがアルファベット表の上で後ろ(または前)に固定数でオフセットされた後、密文に置き換えられます.たとえば、オフセット量が3の場合、すべてのアルファベットAがDに置き換えられ、BがEになるなどします.この暗号化方法はローマ共和時代のシーザーの名前で命名され、当時シーザーはこの方法で将軍たちと連絡を取ったことがある.
インプリメンテーション
# moddemod
# 2019/6/12
def encrypt(plaintext):
	# j  key
    for j in range(26):
        str_list = list(plaintext)
        i = 0
        while i <len(plaintext):
            if not str_list[i].isalpha():
                str_list[i] = str_list[i]
            else:
                a = "A" if str_list[i].isupper() else "a"
                str_list[i] = chr((ord(str_list[i]) - ord(a) + j) % 26 + ord(a))
            i = i + 1

        print(''.join(str_list))


if __name__ == '__main__':
    plaintext = "flag{kaSaI_fbnkjdksSFGHFkfjksabfdJNKLDWOIafsadf}"
    encrypt(plaintext)

実行結果:
flag{kaSaI_fbnkjdksSFGHFkfjksabfdJNKLDWOIafsadf}
gmbh{lbTbJ_gcolkeltTGHIGlgkltbcgeKOLMEXPJbgtbeg}
hnci{mcUcK_hdpmlfmuUHIJHmhlmucdhfLPMNFYQKchucfh}
iodj{ndVdL_ieqnmgnvVIJKInimnvdeigMQNOGZRLdivdgi}
jpek{oeWeM_jfronhowWJKLJojnowefjhNROPHASMejwehj}
kqfl{pfXfN_kgspoipxXKLMKpkopxfgkiOSPQIBTNfkxfik}
lrgm{qgYgO_lhtqpjqyYLMNLqlpqyghljPTQRJCUOglygjl}
mshn{rhZhP_miurqkrzZMNOMrmqrzhimkQURSKDVPhmzhkm}
ntio{siAiQ_njvsrlsaANOPNsnrsaijnlRVSTLEWQinailn}
oujp{tjBjR_okwtsmtbBOPQOtostbjkomSWTUMFXRjobjmo}
pvkq{ukCkS_plxutnucCPQRPuptucklpnTXUVNGYSkpcknp}
qwlr{vlDlT_qmyvuovdDQRSQvquvdlmqoUYVWOHZTlqdloq}
rxms{wmEmU_rnzwvpweERSTRwrvwemnrpVZWXPIAUmrempr}
synt{xnFnV_soaxwqxfFSTUSxswxfnosqWAXYQJBVnsfnqs}
tzou{yoGoW_tpbyxrygGTUVTytxygoptrXBYZRKCWotgort}
uapv{zpHpX_uqczyszhHUVWUzuyzhpqusYCZASLDXpuhpsu}
vbqw{aqIqY_vrdaztaiIVWXVavzaiqrvtZDABTMEYqviqtv}
wcrx{brJrZ_wsebaubjJWXYWbwabjrswuAEBCUNFZrwjruw}
xdsy{csKsA_xtfcbvckKXYZXcxbckstxvBFCDVOGAsxksvx}
yetz{dtLtB_yugdcwdlLYZAYdycdltuywCGDEWPHBtyltwy}
zfua{euMuC_zvhedxemMZABZezdemuvzxDHEFXQICuzmuxz}
agvb{fvNvD_awifeyfnNABCAfaefnvwayEIFGYRJDvanvya}
bhwc{gwOwE_bxjgfzgoOBCDBgbfgowxbzFJGHZSKEwbowzb}
cixd{hxPxF_cykhgahpPCDEChcghpxycaGKHIATLFxcpxac}
djye{iyQyG_dzlihbiqQDEFDidhiqyzdbHLIJBUMGydqybd}
ekzf{jzRzH_eamjicjrREFGEjeijrzaecIMJKCVNHzerzce}

復号化
以上が暗号化プロセスであり,復号は本来オフセット量を加えてオフセット量を減らすことで復号を実現できる.
説明のポイントstr_list[i] = chr((ord(str_list[i]) - ord(a) + j) % 26 + ord(a))は主にこの言葉で、ord()は文字を対応するASCII に変換し、ここでaはAまたはaであり、現在の文字に基づいて大文字区間65-91または小文字区間97-123を選択し、jはkeyでオフセット量である. 26?後ろの文字にオフセットが加わると走る他の文字のASCII区間が行ってしまうので、先頭は従来通りです.(ord(str_list[i]) - ord(a) + j) % 26文字の相対アルファベットの位置を取得し、+ ord(a)は絶対位置を取得し、最後に対応する文字に変換すればよい.
最後の言葉
私はどうしてforループを使うのですか.CTFの試合で実際に暗号文を手に入れたとき、あなたはそのkeyの値を知らないので、列挙するしかありません.オフセット量が統一されていない可能性があるなど、正常なアルゴリズムではありません.