프롤로그에 의한 애니그마 암호화기
소개
계산기 과학자 튜링이 깨진 것으로 유명한 암호기 애니그마에 대한 이해를 깊게하기 위해 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).
Reference
이 문제에 관하여(프롤로그에 의한 애니그마 암호화기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sym_num/items/805b57aadadca84ebd5d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
초기의 것은 알파벳 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).
Reference
이 문제에 관하여(프롤로그에 의한 애니그마 암호화기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sym_num/items/805b57aadadca84ebd5d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
| ?- 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([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).
Reference
이 문제에 관하여(프롤로그에 의한 애니그마 암호화기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sym_num/items/805b57aadadca84ebd5d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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).
Reference
이 문제에 관하여(프롤로그에 의한 애니그마 암호화기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sym_num/items/805b57aadadca84ebd5d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
% ?- 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).
Reference
이 문제에 관하여(프롤로그에 의한 애니그마 암호화기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sym_num/items/805b57aadadca84ebd5d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)