프롤로그에 의한 애니그마 암호화기

5164 단어 PrologEnigma

소개



계산기 과학자 튜링이 깨진 것으로 유명한 암호기 애니그마에 대한 이해를 깊게하기 위해 Prolog에서 그 메커니즘을 설명했습니다.

Enigma 개요



초기의 것은 알파벳 26 문자의 새겨진 로터가 3장과 플러그로 구성되어 있었습니다. 아래의 시뮬레이터가 직관적인 이해를 제공합니다.
h tp : // 에니 g 마코. 에 / 에니 g / 에니 g. HTML

자세한 내용은 Wikipedia를 참조하십시오.
htps : // 그럼.ぃきぺぢ아. rg/우우키/%에3%82%아8%에3%83%8B%에3%82%B0%에3%83%9에_(%에6%9아%97%에5%8F %B7%에 6%아 9%9F)

Prolog를 사용한 구현 사용



술어 enigma/3이 그 본문입니다. 제 1 인수에 평문 혹은 암호문을 리스트 형식으로 줍니다. 두 번째 인수는 로터의 초기 값을 목록으로 제공합니다. 세 번째 인수는 암호화되거나 해독 된 일반 텍스트를 목록으로 제공합니다.


| ?- enigma([h,e,l,l,o],[j,q,d],X).
X = [m,n,c,c,y]
yes
| ?- enigma([m,n,c,c,y],[j,q,d],X).
X = [h,e,l,l,o]
yes
| 

Enigma는 1 문자를 입력 할 때마다 로터를 회전시켜 암호화 메커니즘을 변경했습니다. 이 때문에 연속한 문자를 주어도 다른 암호문으로 변환됩니다.
| ?- enigma([a,a,a,a,a],[j,q,d],X).
X = [y,u,q,m,j]
yes
| 


술어 설명



conecta/3 제 1 인수에 주어진 1 문자의 아톰을 그 로터의 상태를 나타내는 1 문자의 밑으로 변환한 것을 제 3 인수에 줍니다. 로터가 회전하여 문자가 어긋나는 것을 표현한 것입니다. 시계 방향으로 변환합니다.



connectb/3 connecta와 같은 형식입니다만, 반시계 방향으로 보정합니다. 플러그를 통해 리플렉션으로 돌아갈 때 사용합니다.

count/2 제1 인수에 주어진 초기값을 우측의 요소로부터 순차적으로 시계 방향으로 회전시켜 갑니다.


| ?- count([a,a,a],X).
X = [a,a,b]
yes
| ?- count([a,a,z],X).
X = [a,b,a]
yes
| 

ic/2 제 1 로터를 나타내는 술어 데이터베이스입니다.
iic/2 제 2 로터를 나타내는 술어 데이터베이스입니다.
iiic/3 제 3 로터를 나타내는 술어 데이터베이스입니다.

기어의 문자가 다음에 어느 문자로 변환되고 있는지를 나타냅니다.


| ?- ic(f,X).
X = i
yes
|
변환 데이터는 영어판 wikipedia에 기재된 1924년제의 상용판의 것입니다.
htps // 엔.ぃきぺぢ아. 오 rg / uki / 에니 g ma_ro와 r_에서 원하는 ls

고찰



대칭성은 플러그에 의해 2문자간에 변환하고 있는 것으로부터 생깁니다. 코드는 26자 모두에 대해 다른 문자로 변환하고 있습니다. 이것에 의해 반전성을 얻을 수 있는 것과 동시에, 어떤 종류의 불완전성(Wikipedia 참조)이 생긴다고 생각됩니다.

군론에 대한 지식이 필요할 것 같습니다.

참고 자료



youtube 「에니그마 암호란 무엇인가」
htps //w w. 요츠베. 이 m/와 tch? v = 1g1 LCb6k & t = 449s
Enigma 암호의 해설과 그것을 해독한 튜링 등의 수법에 대해 해설하고 있습니다.

코드



GNU-Prolog SWI-Prolog 등 ISO-Prolog 준거의 처리계에서 동작합니다. 졸작 O-Prolog에서도 조작합니다.
% ?- enigma([h,e,l,l,o],[a,a,a],X).
% ?- enigma([s,i,r,h,d],[a,a,a],X).


enigma([],_,[]).
enigma([L|Ls],[R1,R2,R3],[M|Ms]) :-
    connecta(L,R3,L1),
    ic(L1,L2),
    connecta(L2,R2,L3),
    iic(L3,L4),
    connecta(L4,R1,L5),
    iiic(L5,L6),
    plug(L6,L7),
    iiic(L8,L7),
    connectb(L8,R1,L9),
    iic(L10,L9),
    connectb(L10,R2,L11),
    ic(L12,L11),
    connectb(L12,R3,M),
    count([R1,R2,R3],R),
    enigma(Ls,R,Ms).

%adjust char when forward 
connecta(X,Y,Z) :-
    char_code(X,Cx),
    char_code(Y,Cy),
    Cz is mod((Cx-97) + (Cy-97),26)+97,
    char_code(Z,Cz).

%adjust char when backward
connectb(X,Y,Z) :-
    char_code(X,Cx),
    char_code(Y,Cy),
    Cz is mod((Cx-97+26) - (Cy-97),26)+97,
    char_code(Z,Cz).

%count up roter
count([X,Y,z],[X,Y1,a]) :-
    Y \== z,
    next(Y,Y1).

count([X,z,z],[X1,a,a]) :-
    next(X,X1).

count([X,Y,Z],[X,Y,Z1]) :-
    Z \== z,
    next(Z,Z1).

next(X,Y) :-
    char_code(X,C),
    C1 is C+1,
    char_code(Y,C1).

%rotor1
%ABCDEFGHIJKLMNOPQRSTUVWXYZ    
%DMTWSILRUYQNKFEJCAZBPGXOHV    
ic(a,d).
ic(b,m).
ic(c,t).
ic(d,w).
ic(e,s).
ic(f,i).
ic(g,l).
ic(h,r).
ic(i,u).
ic(j,y).
ic(k,q).
ic(l,n).
ic(m,k).
ic(n,f).
ic(o,e).
ic(p,j).
ic(q,c).
ic(r,a).  
ic(s,z).
ic(t,b).
ic(u,p).
ic(v,g).
ic(w,x).
ic(x,o).
ic(y,h).
ic(z,v).



%rotor2
%ABCDEFGHIJKLMNOPQRSTUVWXYZ
%HQZGPJTMOBLNCIFDYAWVEUSRKX
iic(a,h).
iic(b,q).
iic(c,z).
iic(d,g).
iic(e,p).
iic(f,j).
iic(g,t).
iic(h,m).
iic(i,o).
iic(j,b).
iic(k,l).
iic(l,n).
iic(m,c).
iic(n,i).
iic(o,f).
iic(p,d).
iic(q,y).
iic(r,a).
iic(s,w).
iic(t,v).
iic(u,e).
iic(v,u).
iic(w,s).
iic(x,r).
iic(y,k).
iic(z,x).

%rotor3
%ABCDEFGHIJKLMNOPQRSTUVWXYZ
%UQNTLSZFMREHDPXKIBVYGJCWOA
iiic(a,u).
iiic(b,q).
iiic(c,n).
iiic(d,t).
iiic(e,l).
iiic(f,s).
iiic(g,z).
iiic(h,f).
iiic(i,m).
iiic(j,r).
iiic(k,e).
iiic(l,h).
iiic(m,d).
iiic(n,p).
iiic(o,x).
iiic(p,k).
iiic(q,i).
iiic(r,b).
iiic(s,v).
iiic(t,y).
iiic(u,g).
iiic(v,j).
iiic(w,c).
iiic(x,w).
iiic(y,o).
iiic(z,a).

%plug
%ABCDEFGHIJKLMNOPQRSTUVWXYZ
%DPLAXGFMRSOCHZKBYIJVWTUEQN
plug(a,d).
plug(b,p).
plug(c,l).
plug(d,a).
plug(e,x).
plug(f,g).
plug(g,f).
plug(h,m).
plug(i,r).
plug(j,s).
plug(k,o).
plug(l,c).
plug(m,h).
plug(n,z).
plug(o,k).
plug(p,b).
plug(q,y).
plug(r,i).
plug(s,j).
plug(t,v).
plug(u,w).
plug(v,t).
plug(w,u).
plug(x,e).
plug(y,q).
plug(z,n).

좋은 웹페이지 즐겨찾기