1. Krypton4 목표
Good job!
You more than likely used some form of FA and some common sense to solve that one.
So far we have worked with simple substitution ciphers.
They have also been ‘monoalphabetic’, meaning using a fixed key,
and giving a one to one mapping of plaintext (P) to ciphertext (C).
Another type of substitution cipher is referred to as ‘polyalphabetic’,
where one character of P may map to many, or all, possible ciphertext characters.
An example of a polyalphabetic cipher is called a Vigenère Cipher.
It works like this:
If we use the key(K) ‘GOLD’, and P = PROCEED MEETING AS AGREED, then “add” P to K, we get C.
When adding, if we exceed 25, then we roll to 0 (modulo 26).
P P R O C E E D M E E T I N G A S A G R E E D\
K G O L D G O L D G O L D G O L D G O L D G O\
becomes:
P 15 17 14 2 4 4 3 12 4 4 19 8 13 6 0 18 0 6 17 4 4 3\
K 6 14 11 3 6 14 11 3 6 14 11 3 6 14 11 3 6 14 11 3 6 14\
C 21 5 25 5 10 18 14 15 10 18 4 11 19 20 11 21 6 20 2 8 10 17\
So, we get a ciphertext of:
VFZFK SOPKS ELTUL VGUCH KR
This level is a Vigenère Cipher.
You have intercepted two longer, english language messages (American English).
You also have a key piece of information. You know the key length!
For this exercise, the key length is 6.
The password to level five is in the usual place, encrypted with the 6 letter key.
Have fun!
2. Krypton4 구현
# 비밀번호 root 입력 접속
ssh -oStrictHostKeyChecking=no root@localhost -p 2231
mkdir -p /krypton/krypton4
cat <<EOF | base64 --decode > /krypton/krypton4/found1
WVlJQ1MgSklaSUIgQUdZWVggUklFV1YgSVhBRk4gSk9PVlEgUVZIREwgQ1JLTEIgU1NMWVggUklR
WUkgSU9YUVQgV1hSSUMgUlZWS1AgQkhaWEkgWUxZWlAgRExDREkgSUtHRkogVVhSSVAgVEZRR0wg
Q1dWWFIgSUVaUlYgTk1ZU0YgSkRMQ0wgUlhPV0ogTk1JTlggRk5KU1AgSkdIVlYgRVJKVFQgT09I
Uk0gVk1CV04gSlRYS0cgSkpKWFkgVFNZS0wgT1FaRlQgT1NSRk4gSktCSVkgWVNTSEUgTElLTE8g
UkZKR1MgVk1SSkMgQ1lUQ1MgVkhETEMgTFJYT0ogTVdGWUIgSlBOVlIgTldVTVogR1JWTUYgVVBP
RUIgWEtTREwgQ0JaR1UgSUJCWlggTUxNS0sgTE9BQ1ggS0VDT0MgSVVTQlMgUk1QWFIgSVBKWlcg
WFNQVFIgSEtSUUIgVlZPSFIgTVZLRUUgUElaRVggU0RZWUkgUUVSSkogUllTTEogVlpPVlUgTkpM
T1cgUlRYU0QgTFlZTkUgSUxNQksgTE9SWVcgVkFPWE0gS1pSTkwgQ1daUkEgWUdXVkggRExDTFog
VlZYRkYgS0FTUEogR1ZJS1cgV1dWVFYgTUNJS0wgT1FZU1cgU0JBRkogRVdSSUkgU0ZBQ0MgTVpS
Vk8gTUxZWUkgTVNTU0sgVklTRFkgWUlHTUwgUFpJQ1cgRkpOTVYgUERORUggSVNTRkUgSFdFSUog
UFNFRUogUVlJQlcgSkZNSUMgVENXWUUgWldMVEsgV0tNQlkgWUlDR1kgV1ZHQlMgVUtGVkcgSUtK
UlIgRFNCSkogWEJTV00gVlZZTFIgTVJYU1cgQk5XSk8gVkNTS1cgS01CWVkgSVFZWVcgVU1LUk0g
S0tMT0sgWVlWV1ggU01TVkwgS1dDQVYgVk5JUVkgSVNJSUIgTVZWTEkgRFRJSUMgU0dTUlggRVZZ
UUMgQ0RMTVogWExEV0YgSk5TRVAgQlJST08gV0pGTUkgQ1NEREYgWUtXUU0gVkxLV00gS0tMT1Yg
Q1hLRkUgWFJGQkkgTUVQSlcgU0JXRkogWldHTUEgUFZIS1IgQktaSUIgR0NGRUggV0VXU0YgWEtQ
SlQgTkNZWVIgVFVJQ1ggUFRQTE8gVklKVlQgRFNSTVYgQU9XUkIgWUlCSVIgTVZXRVIgUUpLV0sg
UkJERlkgTUVMU0YgWFBFR1EgS1NQTUwgSVlJQlggRkpQWFIgRUxQVkggUk1LRkUgSExFQkogWU1X
S00gVFVGSUkgWVNVWEUgVkxKVVggWUFZV1UgWFJJVUogSlhHRUogUFpSUVMgVEpJSlMgSUpJSlMg
UFdNS0sgS0JFUVggVVNEWEMgSVlJQkkgWVNVWFIgSVBKTk0gRExCRlogV1NJUUYgRUhMWVIgWVZW
TVkgTlhVU0IgU1JNUFcgRE1KUU4gU0JJUk0gVlRCSVIgWVBXU1AgSUlJSUMgV1FNVkwgS0hOWksg
U1hNTFkgWUlaRUogRlRJTFkgUlNGQUQgU0ZKSVcgRVZOV1ogV09XRkogV1NFUkIgTktBS1cgTFRD
U1ggS0NXWFYgT0lMR0wgWFpZUEogTkxTWEMgWVlJQk0gWkdGUksgVk1aRUggRFNSVEogUk9HSU0g
UkhLUFEgVENTQ1ggR1lKS0IgSUNTVFMgVlNQRkUgSEdFUUYgSkFSTVIgSlJXTlMgUFRLTEkgV0JX
VlcgQ1hGSlYgUU9WWVEgVUdTWFcgQlJXQ1MgTVNDSVAgWERGSUYgT0xHU1UgRUNYRkogUEVOWlkg
U1RJTlggRkpYVlkgWUxJU0kgTUVLSkkgU0VLRkogSUVYSEYgTkNQU0kgUEtGVkQgTENXVkEgT1ZD
U0YgSktWS1ggRVNCTE0gWkpJQ00gTFlZTUMgR01aRVggQkNNS0sgTE9BQ1ggS0VYSFIgTVZLQlMg
U1NVQUsgV1NTS00gVlBDSVogUkRMQ0YgV1hPVkwgVEZSREwgQ1hMUkMgTE1TVkwgWVhHU0sgTE9N
UEsgUkdPV0QgVElYUkkgUEpOSUIgSUxUS1YgT0lRWUYgU1BKQ1cgS0xPUVEgTVJIT1cgTVlZRUQg
RkNLRlYgT1JHTFkgWE5TUFQgS0xJRUwgSUtTRFMgWVNVWFIgSUpORlIgR0lQSksgTUJJQkYgRUhW
RVcgSUZBWFkgTlRFWFIgSUVXUlcgQ0VMSVcgSVZQWVggQ0lPVFUgTktMREwgQ0JGU04gUVlTUlIg
TlhGSkogR0tWQ0ggSVNHT0MgSkdNWEsgVUZLR1Ig
EOF
cat <<EOF | base64 --decode > /krypton/krypton4/found2
WVlJSUEgQ1dWU0wgUEdMVkggRFNBRkQgVFlZUlkgWUVEUkcgTFlYRVIgQkpJRVYgRVBMVlggQklD
TkUgWFJJRFQgSUlDWEQgVElYUkkgUEpOSUIgSUxUWVMgRVdDWEUgSUtWUk0gVlhCSUMgUlJIT0Ug
RVRGSEQgTEdIQkcgWVpDV1ogUlFYTVUgSVNESUEgWUtMT1EgRFdGUUQgTENJVkEgS1JCWVkgSURN
TEIgRlNOUVkgU1RMWVQgTkpVRVEgVkNGS1QgU1BDVFcgQVlTQkIgWlhSTEcgWFJCT0UgTElVU0Ig
U1JNUEYgRU1KWVIgV1pQQ1MgVU1OSkcgV1ZYUkUgUkJSVlcgSUJNVlYgS1JCUlIgSE9MQ1cgV0lP
UEogSkpXVlMgTEpDQ0MgTENGRUggRFNSVFIgWE9YRkogQ0VDWE0gS0tMT00gUEdJSUsgSFlTVVIg
WUFRTVYgSFNITFQgS09YU1UgQllFRFggRkpQQVkgWUpJVVMgUFNQR0kgSUtPREYgSlhTSlcgVExB
U1cgRlhSTU4gWEZKQ00gWVJHQlogUFZLTU4gRVhZWEYgSldTQkkgUVlSUk4gT0dRQ0UgTklDV1cg
U0JDTVogUFNFR1kgU0lTS1cgUk5LRkkgWEZKV00gQklRTkUgR09DTVogSVhLV1IgSkpFQkkgUVRH
SU0gWUpOUlYgRExZWVAgU0VUUEogV0lCR00gVEJJTkogTVRVRVggSFJNVlIgSVNTQlogUFZMWUEg
VkVGSVAgRFhTWUggWldWRVUgSllYS0ggWVJSVUMgSUtXQ0kgRlJERkMgTFhJTlggRkpLTVggQU1U
VVEgS1JHWFkgU0VQQkggVlZERUcgU0NDR0kgQ1VaSkkgU1NQWlAgVklCRkcgU1lWQkogVlZLUkIg
WVlJWFEgV09SQUMgQU1aQ0ggQllRWVIgS0tNTEcgTFhETEMgUVpTWEEgQ1NLRUcgRVdORVggWVhG
SlcgU0JJUVkgUlJOSk0gWkVIUk0gUVROUkMgWU5VVlYgS1JCU0YgU1hJQ0EgVlZVUkMgQk5MS1gg
R1lORUMgSk1XWUkgTk1CU0sgUU9SUk4gRlJTWFkgU1VYUkkgUUhSVk8gR1BUTkogWVlMSVIgWEJJ
Q0sgTFBWU0QgU0xYQ0UgTElXTVYgUENJVVMgQlNSTVAgV0xFUVAgVlhHTVIgTUtMT1EgUVRLTEsg
WFFNVkEgWVlKSUUgU0RGQ00gTFJRVlcgS0ZWS1AgTVNYWFMgUUNYWUkgRExNWlggTERYRk4gSkFL
V1QgSklDVU0gTElSUk4gWEZUTEsgUlhEWkMgU1BYRkogSkdLVkMgSElTR0YgU1lKTE8gUFlaWEwg
T0hGSlIgVkRNSkQgUlhETEMgRk5PR0UgUElORUkgTUxCWU0gTUxSTVYgVFlTUEggSUlLWFMgV1ZU
U0cgSUpVWVogWEZKRVkgRFdGTkogVEtIQkogVUxLUkIgWE5JQkkgUVRUUEUgUVFEUlIgTlhGSkUg
WURXVUogSUlDU1EgUlJQVlggRkZLTE8gSFBUR1QgT0hZUUQgU0NYWVggREVYQ1kgWFlJWlkgUk5F
WFIgSVpGSk8gT1haWksgWFJJUUggUlZPR1AgVE5IU0ggTFRLUVMgUkJNRkEgVlNMTFogWERTTVAg
WU1XWE0gS1pQVlggRkpTRUMgT0NZV1MgQk1SSkUgRUxQQ0kgWU1XWE0gUFZJWkUgVUZQSkIgU0tZ
WUkgUE1QSlIgV1JJREogUlZPSFkgWEdFQk8gS05YTEQgS0NZWlIgRFNGTkogV0RWWUIgUlJORlMg
V0VMU1EgU1VKU1IgSUlKR1ggS0tNVFUgSFNXUkYgRUdPRVUgRlBKQlMgS1lZSVAgUFlSVlcgS1JC
VEUgUElHWVIgVlJPRVAgWUZHWVogQ1dVU0IgU1JNUEEgU1hGSUkgQ1ZJWUEgVldHTEMgU0pMT1Ag
WURVU0cgUlJUSlAgT0lOWVkgSUNJSUogR1hSSVAgQVZWSVcgTFpYRVggSFVGSVEgS1JCWFkgSUNQ
Q1UgS1dZWUwgSUNDRVIgUk5DUVkgVkxORUsgR0xDU1ogWEdFUUkgUkNWTUUgTUtYUkkgRU5JUEwg
RVJNVkggUklQS1IgR09NTEYgQ01EWEogSklNWlQgSk5FS0wgVk1UQkUgWEhRVEYgUktKUkogSVhS
SVcgRkNQQ1ggWVdLSU4gWE1CUlYgTlhGSlYgUU9WWVEgVUdTWFcgWVlNQ0EgWVhLU0wgSVlTVlog
T1JSS0wgUE5FV0sgRlZETEMgWUlFRkkgSkpJV0QgTENEWUUgTkxZV1UgUElGQ0ogRUFLUEkgTkVL
S1IgRlRMVkcgTENTS0wgT0NRRk4gRk9KTVcgVlhSSUsgRlhWT0UgUklaWE0gTFJNUlggTVZNWEog
SU5YRkogSVNLSFkgU1VIU1ogR0lWSEQgTENLRlYgT1dSRkogSktWWVggS0xPQ0EgVExQTlcgQ0pG
Uk8gTVJNVlYgQ01CSlogWEdFUUYgTUlCQ1UgTlVJTk0gUkhZRVggSFVNVlIgRExDRFQgVk9UUlog
R1hZWEYgSlZIUUkgWVNVUFkgU0lKVU0gWFhNTksgWFJJV0ggRllWSFEgSlZNREEgWVhSUEMgU1RK
SUMgTklDVVIgUk5YRkogSUlHSVAgSkRFWEMgWk5YTksgS0VKVVYgWUdJWFIgWERMQ0cgRlhEU0sg
WVlJQ00gQkpKQU8gVkNYRlcgRElDVUsgTEtYTFQgRUlZSlIgTVZRTVMgU1FVR1YgTUtHVVMgR1JZ
U1UgSllWWVIgRlFPUlIgTktXT0kgS0pVWFIgRVJZWUkgU1ZIVEwgVlhJV1IgTFdESUwgSU5MS1gg
UU1SUFYgQUNJRkUgQ09DSVUgU0JTUk0gUEhPV04gRlpWU1IgRVFQTVIgRVRKRVggRExDS1IgTVhY
Q1ggS01OSVkgWFJNTlggRkpLTVggQU1UVVEgS1JZU1UgWFJJSk4gRlJDTE0gVEJMU1cgUU1SS1Eg
Q0tGRUkgS1JCUUYgU1VJQlkgWVNFS0YgWVdZVkYgU1lLTE8gV0FGSUkgTVZNQkogRVNIVUogVEVY
Uk0gWVdQSVggRkZLTUMgR0NXS0UgU1JMSlogWFJJUEggUlJHSUEgUVpRTEggTUJFTVggWE1ZWU0g
Q0tQSlIgWE5NUkggWVhSSVAgSldTQkkgR0tOSU0gRUxTRlggVFlLVUYgWk9WR1kgTklXWVEgWUpY
WVQgVU1WVk8gQUNGSUkgU1hGTkUgT1NHTVogQ0hUWUsgVUZaT1YgR1lKRVMgSFJNVkcgWUFZV1Ug
UElQR1QgRUVQWEMgV0RJS1cgU1daUlEgWEZKVU0gQ1hZU1QgSU1FUEogV1lWUFcgTkVMU1cgS05F
SEQgTENTTkkgS1ZDRkMgUEJNRU0gS0VYV1UgSklJTlggRkpKR0sgVkNISVMgR0pNV1AgU0VHWVMg
VEVCVlcgWkpFVlAgTUFWVlkgUldUTFYgTEVBUEYgUk9FUkYgS01XSVUgSkNQU1AgSllJQ1MgWFFG
WkggRExDUVogU1hBRlQgTk1WUEUgVFdNQlcgUk5OTVYgUEJKVFAgS1ZDSUsgTE9XQUYgSUlNVk0g
QldTQk0gRERGWVAgU1NTVVggUkVSREYgWU1TU1EgVVJZWEggWkRUWVogQ1dLTE8gS1NRV0ggWVZN
WVkgQ0dTU1EgVUZPT0cgUUNJTlMgUFlZSUQgTUxCRlMgTlFZU1MgRU5QV0kgVlJESUIgVEVYUkkg
UFRUT0MgRkNRRkEgTFlSTlcgTUtRTVMgUFNFVlogRlRPU1ggVU5DUFggU1JSUlggRElQWEYgUUVH
RksgRlZETEMgS1JQVkEgTVpDSFggU1JNTFYgRFFDRksgRVZQ
EOF
cat <<'EOF' > /krypton/krypton4/HINT
Frequency analysis will still work, but you need to analyse it
by "keylength". Analysis of cipher text at position 1, 6, 12, etc
should reveal the 1st letter of the key, in this case. Treat this as
6 different mono-alphabetic ciphers...
Persistence and some good guesses are the key!
EOF
echo SENJS1YgUkpPWA== | base64 -d > /krypton/krypton4/krypton5
cat <<'EOF' > /krypton/krypton4/README
Good job!
You more than likely used frequency analysis and some common sense
to solve that one.
So far we have worked with simple substitution ciphers. They have
also been 'monoalphabetic', meaning using a fixed key, and
giving a one to one mapping of plaintext (P) to ciphertext (C).
Another type of substitution cipher is referred to as 'polyalphabetic',
where one character of P may map to many, or all, possible ciphertext
characters.
An example of a polyalphabetic cipher is called a Vigenère Cipher. It works
like this:
If we use the key(K) 'GOLD', and P = PROCEED MEETING AS AGREED, then "add"
P to K, we get C. When adding, if we exceed 25, then we roll to 0 (modulo 26).
P P R O C E E D M E E T I N G A S A G R E E D
K G O L D G O L D G O L D G O L D G O L D G O
becomes:
P 15 17 14 2 4 4 3 12 4 4 19 8 13 6 0 18 0 6 17 4 4 3
K 6 14 11 3 6 14 11 3 6 14 11 3 6 14 11 3 6 14 11 3 6 14
C 21 5 25 5 10 18 14 15 10 18 4 11 19 20 11 21 6 20 2 8 10 17
So, we get a ciphertext of:
VFZFK SOPKS ELTUL VGUCH KR
This level is a Vigenère Cipher. You have intercepted two longer, english
language messages. You also have a key piece of information. You know the
key length!
For this exercise, the key length is 6. The password to level five is in the usual
place, encrypted with the 6 letter key.
Have fun!
EOF
chown krypton4:krypton4 /krypton/krypton4/*
chmod 640 /krypton/krypton4/*
# krypton5 유저를 생성하여 준다.
useradd krypton5 && echo -e "CLEARTEXT\nCLEARTEXT" | passwd krypton5
echo 'CLEARTEXT' > /etc/krypton_pass/krypton5
chown krypton5:krypton5 /etc/krypton_pass/krypton5
chmod 400 /etc/krypton_pass/krypton5
3. Krypton4 문제풀의
# 비밀번호 : BRUTE
# ssh krypton4@krypton.labs.overthewire.org -p 2231
ssh krypton4@localhost -p 2231
cat /krypton/krypton4/README
cat /krypton/krypton4/HINT | grep mono
# 6글자씩 묶어서 해당 문자 뒤 줄바꿈 추가(fold -w 6 대체 가능)
# 6글자씩 묶어서 가져온 글자 첫번째 문자 표시
# 6글자씩 묶어서 가져온 글자 첫번째 문자 그룹의 단어 빈도수 표시
# K. W. Smith의 텍스트 분석 결과 기반 알파벳 사용 빈도
# E: 12.70% T: 9.06% A: 8.17% O: 7.51% I: 6.97%
# found1, found2 텍스트 파일 단어의 빈도수 확인
# S: 63 I: 59 X: 55 M: 44 J: 43
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | sed 's/.\{6\}/&\n/g' | cut -c 1 | tr -d '\n' | grep -o '[A-Z]' | sort | uniq -c | sort -nr
# A B C D E F G H I J
# 0 1 2 3 4 5 6 7 8 9
# K L M N O P Q R S T
# 10 11 12 13 14 15 16 17 18 19
# U V W X Y Z
# 20 21 22 23 24 25
# (18(S) - 4(E)) mod 26 = KEY_VAL
# 첫번째 키문자 O 추정
echo S | awk '{print index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper($0))-1}' | xargs -I {} awk "BEGIN {print ({} - 4) % 26}" | awk '{printf "%c\n", $1 + 65}'
# 6글자씩 묶어서 가져온 글자 두번째 문자 그룹의 단어 빈도수 표시
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | sed 's/.\{6\}/&\n/g' | cut -c 2 | tr -d '\n' | grep -o '[A-Z]' | sort | uniq -c | sort -nr
# (10(K) - 4(E)) mod 26 = KEY_VAL
# 두번째 키문자 G 추정
echo K | awk '{print index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper($0))-1}' | xargs -I {} awk "BEGIN {print ({} - 4) % 26}" | awk '{printf "%c\n", $1 + 65}'
# 6글자씩 묶어서 가져온 글자 세번째 문자 그룹의 단어 빈도수 표시
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | sed 's/.\{6\}/&\n/g' | cut -c 3 | tr -d '\n' | grep -o '[A-Z]' | sort | uniq -c | sort -nr
# (8(I) - 4(E)) mod 26 = KEY_VAL
# 세번째 키문자 E 추정
echo I | awk '{print index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper($0))-1}' | xargs -I {} awk "BEGIN {print ({} - 4) % 26}" | awk '{printf "%c\n", $1 + 65}'
# 6글자씩 묶어서 가져온 글자 네번째 문자 그룹의 단어 빈도수 표시
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | sed 's/.\{6\}/&\n/g' | cut -c 4 | tr -d '\n' | grep -o '[A-Z]' | sort | uniq -c | sort -nr
# 키값은 음수일 수 없으므로 다음 빈도 높은 것을 고려
# (17(R) - 4(E)) mod 26 = KEY_VAL
# 네번째 키문자 N 추정
echo R | awk '{print index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper($0))-1}' | xargs -I {} awk "BEGIN {print ({} - 4) % 26}" | awk '{printf "%c\n", $1 + 65}'
# 6글자씩 묶어서 가져온 글자 다섯번째 문자 그룹의 단어 빈도수 표시
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | sed 's/.\{6\}/&\n/g' | cut -c 5 | tr -d '\n' | grep -o '[A-Z]' | sort | uniq -c | sort -nr
# (9(J) - 4(E)) mod 26 = KEY_VAL
# 다섯번째 키문자 F 추정
echo J | awk '{print index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper($0))-1}' | xargs -I {} awk "BEGIN {print ({} - 4) % 26}" | awk '{printf "%c\n", $1 + 65}'
# 6글자씩 묶어서 가져온 글자 여섯번째 문자 그룹의 단어 빈도수 표시
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | sed 's/.\{6\}/&\n/g' | cut -c 6 | tr -d '\n' | grep -o '[A-Z]' | sort | uniq -c | sort -nr
# (17(R) - 4(E)) mod 26 = KEY_VAL
# 여섯번째 키문자 B 추정
echo F | awk '{print index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper($0))-1}' | xargs -I {} awk "BEGIN {print ({} - 4) % 26}" | awk '{printf "%c\n", $1 + 65}'
# OGENFB
# 추정된 키값을 통해 암호문 복호화 확인
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | awk -v key="OGENFB" '{
for (i=1; i<=length($0); i++) {
c=substr($0, i, 1);
k=substr(key, (i-1) % length(key) + 1, 1);
c_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(c)) - 1;
k_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(k)) - 1;
printf "%c", ((c_index - k_index + 26) % 26) + 65;
}
printf "\n";
}'
# 정관사 THE의 TH가 가장 많이 나오는 문자확인
# EK, FR 확인
for ch1 in {A..Z}; do
for ch2 in {A..Z}; do
key="${ch1}${ch2}ENFB"
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | awk -v key="$key" '{
for (i=1; i<=length($0); i++) {
c=substr($0, i, 1);
k=substr(key, (i-1) % length(key) + 1, 1);
c_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(c)) - 1;
k_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(k)) - 1;
printf "%c", ((c_index - k_index + 26) % 26) + 65;
}
printf "\n";
}' | grep -o 'TH' | wc -l
echo ${ch1}${ch2}
done
done | awk '{printf "%s ", $0; if(NR%2==0) print "";}' | sort -n
# 정관사 THE의 TH가 가장 많이 나오는 문자확인
# EK, FR 확인
for ch1 in {A..Z}; do
for ch2 in {A..Z}; do
key="E${ch1}${ch2}NFB"
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | awk -v key="$key" '{
for (i=1; i<=length($0); i++) {
c=substr($0, i, 1);
k=substr(key, (i-1) % length(key) + 1, 1);
c_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(c)) - 1;
k_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(k)) - 1;
printf "%c", ((c_index - k_index + 26) % 26) + 65;
}
printf "\n";
}' | grep -o 'TH' | wc -l
echo ${ch1}${ch2}
done
done | awk '{printf "%s ", $0; if(NR%2==0) print "";}' | sort -n
# KE 확인
for ch1 in {A..Z}; do
for ch2 in {A..Z}; do
key="E${ch1}${ch2}NFB"
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | awk -v key="$key" '{
for (i=1; i<=length($0); i++) {
c=substr($0, i, 1);
k=substr(key, (i-1) % length(key) + 1, 1);
c_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(c)) - 1;
k_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(k)) - 1;
printf "%c", ((c_index - k_index + 26) % 26) + 65;
}
printf "\n";
}' | grep -o 'TH' | wc -l
echo ${ch1}${ch2}
done
done | awk '{printf "%s ", $0; if(NR%2==0) print "";}' | sort -n
# EY 확인
for ch1 in {A..Z}; do
for ch2 in {A..Z}; do
key="EK${ch1}${ch2}FB"
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | awk -v key="$key" '{
for (i=1; i<=length($0); i++) {
c=substr($0, i, 1);
k=substr(key, (i-1) % length(key) + 1, 1);
c_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(c)) - 1;
k_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(k)) - 1;
printf "%c", ((c_index - k_index + 26) % 26) + 65;
}
printf "\n";
}' | grep -o 'TH' | wc -l
echo ${ch1}${ch2}
done
done | awk '{printf "%s ", $0; if(NR%2==0) print "";}' | sort -n
# YF 확인
for ch1 in {A..Z}; do
for ch2 in {A..Z}; do
key="EKE${ch1}${ch2}B"
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | awk -v key="$key" '{
for (i=1; i<=length($0); i++) {
c=substr($0, i, 1);
k=substr(key, (i-1) % length(key) + 1, 1);
c_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(c)) - 1;
k_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(k)) - 1;
printf "%c", ((c_index - k_index + 26) % 26) + 65;
}
printf "\n";
}' | grep -o 'TH' | wc -l
echo ${ch1}${ch2}
done
done | awk '{printf "%s ", $0; if(NR%2==0) print "";}' | sort -n
# FR 확인
for ch1 in {A..Z}; do
for ch2 in {A..Z}; do
key="EKEY${ch1}${ch2}"
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | awk -v key="$key" '{
for (i=1; i<=length($0); i++) {
c=substr($0, i, 1);
k=substr(key, (i-1) % length(key) + 1, 1);
c_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(c)) - 1;
k_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(k)) - 1;
printf "%c", ((c_index - k_index + 26) % 26) + 65;
}
printf "\n";
}' | grep -o 'TH' | wc -l
echo ${ch1}${ch2}
done
done | awk '{printf "%s ", $0; if(NR%2==0) print "";}' | sort -n
# EKEYFR
# 추정된 키값을 통해 암호문 복호화 확인
# 제대로 된 문자가 안나오므로 두번째 빈도수인 FR로 다시 시작
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | awk -v key="EKEYFR" '{
for (i=1; i<=length($0); i++) {
c=substr($0, i, 1);
k=substr(key, (i-1) % length(key) + 1, 1);
c_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(c)) - 1;
k_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(k)) - 1;
printf "%c", ((c_index - k_index + 26) % 26) + 65;
}
printf "\n";
}'
# FR이라 가정하고 다시
# EY 확인
for ch1 in {A..Z}; do
for ch2 in {A..Z}; do
key="FR${ch1}${ch2}FR"
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | awk -v key="$key" '{
for (i=1; i<=length($0); i++) {
c=substr($0, i, 1);
k=substr(key, (i-1) % length(key) + 1, 1);
c_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(c)) - 1;
k_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(k)) - 1;
printf "%c", ((c_index - k_index + 26) % 26) + 65;
}
printf "\n";
}' | grep -o 'TH' | wc -l
echo ${ch1}${ch2}
done
done | awk '{printf "%s ", $0; if(NR%2==0) print "";}' | sort -n
# YF 확인
for ch1 in {A..Z}; do
for ch2 in {A..Z}; do
key="FRE${ch1}${ch2}F"
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | awk -v key="$key" '{
for (i=1; i<=length($0); i++) {
c=substr($0, i, 1);
k=substr(key, (i-1) % length(key) + 1, 1);
c_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(c)) - 1;
k_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(k)) - 1;
printf "%c", ((c_index - k_index + 26) % 26) + 65;
}
printf "\n";
}' | grep -o 'TH' | wc -l
echo ${ch1}${ch2}
done
done | awk '{printf "%s ", $0; if(NR%2==0) print "";}' | sort -n
# FR 확인
for ch1 in {A..Z}; do
for ch2 in {A..Z}; do
key="FREY${ch1}${ch2}"
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | awk -v key="$key" '{
for (i=1; i<=length($0); i++) {
c=substr($0, i, 1);
k=substr(key, (i-1) % length(key) + 1, 1);
c_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(c)) - 1;
k_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(k)) - 1;
printf "%c", ((c_index - k_index + 26) % 26) + 65;
}
printf "\n";
}' | grep -o 'TH' | wc -l
echo ${ch1}${ch2}
done
done | awk '{printf "%s ", $0; if(NR%2==0) print "";}' | sort -n
# FREYFR
# 추정된 키값을 통해 암호문 복호화 확인
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | awk -v key="FREYFR" '{
for (i=1; i<=length($0); i++) {
c=substr($0, i, 1);
k=substr(key, (i-1) % length(key) + 1, 1);
c_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(c)) - 1;
k_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(k)) - 1;
printf "%c", ((c_index - k_index + 26) % 26) + 65;
}
printf "\n";
}'
# FRE 부분은 맞다고 고정하고 다시 확인
# 이전 틀린 암호가 FREYFR 이었으므로 두번째 빈도인 KE 확인
for ch1 in {A..Z}; do
for ch2 in {A..Z}; do
key="FRE${ch1}${ch2}R"
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | awk -v key="$key" '{
for (i=1; i<=length($0); i++) {
c=substr($0, i, 1);
k=substr(key, (i-1) % length(key) + 1, 1);
c_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(c)) - 1;
k_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(k)) - 1;
printf "%c", ((c_index - k_index + 26) % 26) + 65;
}
printf "\n";
}' | grep -o 'THE' | wc -l
echo ${ch1}${ch2}
done
done | awk '{printf "%s ", $0; if(NR%2==0) print "";}' | sort -n
# EY 확인
for ch1 in {A..Z}; do
for ch2 in {A..Z}; do
key="FREK${ch1}${ch2}"
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | awk -v key="$key" '{
for (i=1; i<=length($0); i++) {
c=substr($0, i, 1);
k=substr(key, (i-1) % length(key) + 1, 1);
c_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(c)) - 1;
k_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(k)) - 1;
printf "%c", ((c_index - k_index + 26) % 26) + 65;
}
printf "\n";
}' | grep -o 'THE' | wc -l
echo ${ch1}${ch2}
done
done | awk '{printf "%s ", $0; if(NR%2==0) print "";}' | sort -n
# FREKEY
# 추정된 키값을 통해 암호문 복호화 확인
cat /krypton/krypton4/found1 /krypton/krypton4/found2 | tr -d ' ' | awk -v key="FREKEY" '{
for (i=1; i<=length($0); i++) {
c=substr($0, i, 1);
k=substr(key, (i-1) % length(key) + 1, 1);
c_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(c)) - 1;
k_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(k)) - 1;
printf "%c", ((c_index - k_index + 26) % 26) + 65;
}
printf "\n";
}'
# password : CLEARTEXT
cat /krypton/krypton4/krypton5 | tr -d ' ' | awk -v key="FREKEY" '{
for (i=1; i<=length($0); i++) {
c=substr($0, i, 1);
k=substr(key, (i-1) % length(key) + 1, 1);
c_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(c)) - 1;
k_index = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", toupper(k)) - 1;
printf "%c", ((c_index - k_index + 26) % 26) + 65;
}
printf "\n";
}'
'Wargame > Krypton' 카테고리의 다른 글
[ Docker ] Krypton Wargame 만들기 - 6번 문제 ( 8 / 8 ) (0) | 2024.09.23 |
---|---|
[ Docker ] Krypton Wargame 만들기 - 5번 문제 ( 7 / 8 ) (0) | 2024.09.23 |
[ Docker ] Krypton Wargame 만들기 - 3번 문제 ( 5 / 8 ) (0) | 2024.09.23 |
[ Docker ] Krypton Wargame 만들기 - 2번 문제 ( 4 / 8 ) (0) | 2024.09.23 |
[ Docker ] Krypton Wargame 만들기 - 1번 문제 ( 3 / 8 ) (0) | 2024.09.23 |