web-dev-qa-db-ja.com

以下の暗号化されたメッセージを解読する方法は?

私の友人は、ASCIIマップを使用してテキストを暗号化するための暗号化方法(自作)を試していました。彼は、この暗号化を破ることができるかどうか、この暗号化テキストをいくつかの私との例です。

暗号化されたテキスト:

13 28 32 18 100 25 96 47 88 0 44 104 5 47 93 19 73 104 16 102 102 11 18 123 72 94 38 80 29 17 111 110 104 122 114 20 126 127 45 55 30 98 60 16 35 16 52 5 24 107 15 24 13 124 79 105 0 61 46 84 112 9 9 97 13 127 0 30 55 19 102 68 30 105 10 82 54 83 29 117 119 38 29 87 74 66 99 99 77 70 81 69 25 64 51 117 87 71 8 120 43 113 57 110 80 108 117 22 41 83 125 30 76 96 0 49 110 115 37 26 46 67 18 96 81 110 79 49 59 109 5 95 72 34 71 108 60 48 26 55 71 73 68 92 90 120 33 37 64 64 88 28 65 20 7 60 83 96 16 50 110 36 105 102 18 40 46 76 80 55 55 125 103 35 111 40 2 126 22 3 87 126 82 108 126 61 108 56 31 52 69 18 114 39 84 84 55 98 70 26 118 3 102 89 110 73 104 72 25 38 15 126 81 6 88 40 50 35 13 40 65 2 40 33 2 78 110 7 12 119 59 30 52 87 30 36 15 100 39 92 90 4 41 70 101 33 114 110 58 67 24 81 80 44 32 74

以下は、暗号化されたテキストを含むオリジナルの例です。これらの例では、暗号化されたテキストは元のテキストに従います。

  1. プレーンテキスト:

    生物学は、その構造、機能、成長、進化、分布、同定、分類法など、生命と生物の研究に関係する自然科学です。[1]現代の生物学は、多くの分野で構成される広大で折衷的な分野ですブランチとサブディシプリン。ただし、生物学の広い範囲にもかかわらず、すべての研究と研究を統括し、単一の首尾一貫した分野に統合する特定の一般的で統一された概念があります。

    暗号文:

    75 102 3 0 62 102 67 102 53 88 44 100 1 95 97 37 80 60 108 26 32 119 58 120 29 26 10 83 32 5 10 8 77 113 42 95 119 30 112 11 57 121 60 19 62 11 52 5 17 101 69 38 11 42 68 101 29 65 46 31 103 115 86 65 112 127 30 105 62 80 88 105 62 115 64 101 5 44 120 6 0 81 14 87 116 122 63 104 33 75 83 11 54 64 18 91 124 110 33 51 84 109 25 103 18 114 23 79 13 43 125 114 20 13 103 92 18 113 56 31 34 108 20 48 49 38 48 70 118 105 50 72 101 111 111 20 117 61 76 30 58 59 109 19 17 28 23 3 3 60 26 116 58 38 104 109 12 51 68 5 82 27 71 101 58 118 32 79 1 67 100 96 63 48 96 39 94 53 46 83 16 82 72 13 90 113 48 47 13 50 18 99 58 82 34 106 102 113 34 28 34 3 11 89 47 115 15 64 2 100 15 82 81 56 7 116 79 13 13 100 119 92 90 22 109 6 55 63 85 112 91 77 65 60 81 22 22 105 4 103 12 0 124 119 95 83 51 57 100 67 75 69 38 60 23 124 74 12 98 88 45 119 114 87 60 93 30 108 14 68 95 73 120 122 50 17 17 62 39 38 51 108 86 59 29 33 32 31 41 40 2 46 19 47 18 9 44 97 43 3 96 39 114 20 50 67 58 92 120 48 27 11 51 123 124 20 101 81 124 97 107 85 69 30 73 26 8 78 74 99 63 76 69 90 15 57 104 91 90 4 106 33 86 43 57 105 50 70 46 96 89 36 84 5 6 64 40 57 97 117 6 35 69 123 14 48 94 95 93 13 117 64 39 25 120 55 37 102 98 35 9 126 15 94 79 60 29 61 34 9 103 61 57 127 4 95 102 97 74 53 121 111 53 106 121 90 97 36 95 15 84 123 41 86 19 21 112 44 36 56 69 94 6 0 91 113 29 94 41 72 84 12 29 125 82 109 67 103 96 28 53 88 126 126 56 28 64 97 80 120 34 91 62 127 61 46 85 13 22 80 16
    
  2. プレーンテキスト:

    アイアンマン

    暗号文:

     59 32 3 20 48 32 56 127
    

上記の暗号化を解決しようとしましたが、解決できませんでした。これを解決することは可能ですか?それをどのように行うことができますか?

暗号化に使用される暗号化を以下に示します。次のコードはPythonで記述されています。

#For making a list for letters
letters=[]
for i in range(0,128):
    letters.append(chr(i))
index=list(range(128))
num=dict(Zip(letters,index))
char=dict(Zip(index,letters))
#Making rotors
ref=[110, 94, 63, 82, 56, 101, 108, 78, 5, 12, 24, 79, 52, 6, 0, 84, 74, 65, 50, 18, 67, 85, 30, 44, 120, 7, 113, 26, 83, 126, 96, 71, 97, 19, 73, 100, 45, 54, 17, 121, 49, 43, 125, 35, 64, 123, 104, 2, 115, 111, 98, 107, 119, 88, 14, 36, 15, 60, 69, 70, 80, 32, 46, 103, 40, 118, 109, 105, 25, 13, 41, 76, 33, 11, 31, 51, 77, 9, 8, 99, 114, 27, 55, 102, 92, 90, 10, 42, 29, 116, 117, 62, 28, 22, 21, 87, 47, 58, 3, 66, 124, 20, 122, 57, 127, 95, 112, 81, 23, 34, 89, 1, 4, 48, 91, 75, 72, 93, 86, 106, 16, 37, 59, 61, 53, 68, 38, 39]#reference for making the rotors
rotorin=list(range(0,128))
rotor1,rotor2,rotor3={},{},{}
rotor=[rotor1,rotor2,rotor3]
#Making and setting the rotor position. i from 0 to 2 and p from 0 to 255.
def setrotorposition(i,p):#setting the ith rotor position to p.
    out=[]
    for k in range(0,128):
        out.append(p)
        p+=1
        if p==128:
            p=0
    rotor[i]=dict(Zip(ref,out))
def setrotorpositiond(i,p):#setting the ith rotor position to p.
    out=[]
    for k in range(0,128):
        out.append(p)
        p+=1
        if p==128:
            p=0
    rotor[i]=dict(Zip(out,ref))
def encrypt(text,key):
    etext=open('etext.txt','w')
    setrotorposition(0,key[0])
    setrotorposition(1,key[1])
    setrotorposition(2,key[2])
    a0,a1,a2=key
    rp=[a0,a1,a2]#rp-rotor position
    letter=list(text)
    for k in range(len(letter)):
        letter[k]=str(rotor[2][rotor[1][rotor[0][num[letter[k]]]]])
        if rp[0]!=127:
            rp[0]+=1
            setrotorposition(0,rp[0])
        Elif rp[1]!=127:
            rp[1]+=1
            rp[0]=0
            setrotorposition(0,rp[0])
            setrotorposition(1,rp[1])
        Elif rp[2]!=127:
            rp[2]+=1
            rp[0],rp[1]=0,0
            for i in range(3):
                setrotorposition(i,rp[i])
        else:
            rp[0],rp[1],rp[2]=0,0,0
            for i in range(3):
                setrotorposition(i,rp[i])
    etext.write(' '.join(letter))
    etext.close()
def decrypt(efile,key):
    etext=open(efile,'r')
    dtext=open('dtext.txt','w')
    setrotorpositiond(0,key[0])
    setrotorpositiond(1,key[1])
    setrotorpositiond(2,key[2])
    rp=key
    letter=(etext.read()).split(' ')
    for k in range(len(letter)):
        if letter[k]!=' ':
            decrypttext=char[rotor[0][rotor[1][rotor[2][int(letter[k])]]]]
            dtext.write(decrypttext)
            if rp[0]!=127:
                rp[0]+=1
                setrotorpositiond(0,rp[0])
            Elif rp[1]!=127:
                rp[1]+=1
                rp[0]=0
                setrotorpositiond(0,rp[0])
                setrotorpositiond(1,rp[1])
            Elif rp[2]!=127:
                rp[2]+=1
                rp[0],rp[1]=0,0
                for i in range(3):
                    setrotorpositiond(i,rp[i])
            else:
                rp[0],rp[1],rp[2]=0,0,0
                for i in range(3):
                    setrotorpositiond(i,rp[i])
    etext.close()
    dtext.close()
3
lattitude

最初の暗号文のプレーンテキストは次のとおりです。

暗号化は、データセキュリティを実現する最も効果的な方法です。暗号化されたファイルを読み取るには、それを復号化するための秘密鍵またはパスワードにアクセスできる必要があります。暗号化されていないデータはプレーンテキストと呼ばれます。暗号化されたデータは、暗号文と呼ばれます。

キースペースが小さい(128 ^ 3)ため、単純なブルートフォースでこれを打ち破ることができ、適度な商品ハードウェアでも1/10秒未満で検索できます。

キーは100 2 3でした。

2
A Heisner

はい、これは壊れる可能性がありますが、いいえ、それを行うつもりはありません。

あなたの友人のシステムはヘバーンローターの原理に基づいています。そのような計画は1920年代に最初に破られました。これらの最も有名なブレークは、第二次世界大戦でドイツのエニグマコードを解読するために使用されたボンベでした。エニグマは3ローターシステムであり、このアルゴリズムに非常によく似ています。主な明らかな違いは、ステッカーとリフレクターの欠如であり、このアルゴリズムは各ローターに同じ配線パターンを使用します(エニグマには異なる配線のローターのセットがありました)オペレーターは、メッセージを復号化するためのキーの一部として正しい順序で選択してインストールする必要がありました。)

今日、ローターサイファーのクラス全体は、単純なブルートフォース以外の何物でもないデジタルコンピューターによって破られる可能性があります。いくつかの現代的な研究については、ジェフサリバンとフロードワイエルドによる「 ドイツ軍の暗号解読 」を参照してください。自分でこれを攻撃する方法の例を探している場合は、「エニグマクラッカー」の公開されたソースコードがたくさんあると思います。

2
John Deters