---
# System prepended metadata

title: Write up KMACTF 2023 lần 2

---

# Write up KMACTF 2023 lần 2

## 旗を持っている人は私に提出してください

![](https://hackmd.io/_uploads/B1sz0nJla.png)
- Đề bài cho ta các file:
hint.txt:
```txt=
$head -n 18 .ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAQEA+EHGQ+emT2GgZzI5wbufhYYC276Z4xrCzpXLk+s+sgK6JKekYN/F
dkrPk6A3QT2JsUVBqg3QHOPjHRtPQGeIMdK2RC7hiS2gGWGv3dQ9k2bScXiSdByBZFXVs9
k0VNSxJyH+5/GZZh0YC04c5+4BtKqlbdnEUnsm+IZYmLYjhSBkzpY+zh7y61TeeBkc/ksZ
f1Sm8c9rD1Mi5dFc4m2wiRWpqD1gBgojXbczPl08cMWhULUsHiOHjD1i/4S4hyTAAmFbQu
dnF9LxihLkyQGAHglITOJrx439D3gWoC4k/DSUT/fur7laRhZsYjHmwNR24yFOZyFrA7+l
obOuNQbRTQAAA8gAYCu/AGArvwAAAAdzc2gtcnNhAAABAQD4QcZD56ZPYaBnMjnBu5+Fhg
LbvpnjGsLOlcuT6z6yArokp6Rg38V2Ss+ToDdBPYmxRUGqDdAc4+MdG09AZ4gx0rZELuGJ
LaAZYa/d1D2TZtJxeJJ0HIFkVdWz2TRU1LEnIf7n8ZlmHRgLThzn7gG0qqVt2cRSeyb4hl
iYtiOFIGTOlj7OHvLrVN54GRz+Sxl/VKbxz2sPUyLl0VzibbCJFamoPWAGCiNdtzM+XTxw
xaFQtSweI4eMPWL/hLiHJMACYVtC52cX0vGKEuTJAYAeCUhM4mvHjf0PeBagLiT8NJRP9+
6vuVpGFmxiMebA1HbjIU5nIWsDv6Whs641BtFNAAAAAwEAAQAAAQEAil6e01paKASSEvK7
nm+lChcXoMMroplX2y1Cur9zwmQivCt0Q0p2FOi9qdqy8XoLNPMVFmN8i525CJAgLBWIo7
x+OqKmsn7rrTn1e/7AE1hME1LQzkbVF8d/xS5bLK0f0F/yY/UVOwUcUbDIC71s1fYHHqMx
+YcKwZqf5v4d7iR2/jLmQI2eTUocrsjXPVncJZkHCLSXsA55gstXpvqcNZCUpMzpxnXItS
brS06azCaN3/W0vNXcvE0nrjpqHTdCc/eYakWcVWkY8c3XD5bDliO96anE3M+vbneCN/aR
vRumOTAl3IIAVySOpmOPjKE0QMr/7x77uZwXktnTuBs2AQAAAIB+UvfUBey3NzB54radl7
```

authorized_keys:
```txt=
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD4QcZD56ZPYaBnMjnBu5+FhgLbvpnjGsLOlcuT6z6yArokp6Rg38V2Ss+ToDdBPYmxRUGqDdAc4+MdG09AZ4gx0rZELuGJLaAZYa/d1D2TZtJxeJJ0HIFkVdWz2TRU1LEnIf7n8ZlmHRgLThzn7gG0qqVt2cRSeyb4hliYtiOFIGTOlj7OHvLrVN54GRz+Sxl/VKbxz2sPUyLl0VzibbCJFamoPWAGCiNdtzM+XTxwxaFQtSweI4eMPWL/hLiHJMACYVtC52cX0vGKEuTJAYAeCUhM4mvHjf0PeBagLiT8NJRP9+6vuVpGFmxiMebA1HbjIU5nIWsDv6Whs641BtFN
```

- Chúng ta có thể thấy file `hint.txt` cho không đầy đủ và nhiệm vụ của chúng ta là khôi phục lại file key này.
- Sau khi decode base64 phần đã biết trong file `hint` thì ta thấy `n`, `e`, `d` đã được cho, vì thế chúng ta có thể construct lại `file` bằng hàm rsa_construct trong thư viện `pycrypto`. https://github.com/pycrypto/pycrypto/blob/7acba5f3a6ff10f1424c309d0d34d2b713233019/lib/Crypto/PublicKey/_slowmath.py#L82

solved.py:
```python=
from base64 import b64decode, b64encode
from Crypto.PublicKey import RSA


f = open('hint.txt', 'rb').read()

data = b"".join(f.split(b'\n')[2:])

data = b64decode(data+b'==').hex()
print(data)
list_data = data.split("0000")
print(list_data)
n = int(list_data[-4][6:],16)
e = 65537
d = int(list_data[-2][6:],16)

rsa_key = RSA.construct((n, e, d))
rsa_key_bytes = rsa_key.export_key("PEM")
with open('recover_key.pem', 'w') as file:
    file.write(rsa_key_bytes.decode())
```

- Sau đó ta thu được `recover_key.pem`:
```pem=
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA+EHGQ+emT2GgZzI5wbufhYYC276Z4xrCzpXLk+s+sgK6JKek
YN/FdkrPk6A3QT2JsUVBqg3QHOPjHRtPQGeIMdK2RC7hiS2gGWGv3dQ9k2bScXiS
dByBZFXVs9k0VNSxJyH+5/GZZh0YC04c5+4BtKqlbdnEUnsm+IZYmLYjhSBkzpY+
zh7y61TeeBkc/ksZf1Sm8c9rD1Mi5dFc4m2wiRWpqD1gBgojXbczPl08cMWhULUs
HiOHjD1i/4S4hyTAAmFbQudnF9LxihLkyQGAHglITOJrx439D3gWoC4k/DSUT/fu
r7laRhZsYjHmwNR24yFOZyFrA7+lobOuNQbRTQIDAQABAoIBAQCKXp7TWlooBJIS
8rueb6UKFxegwyuimVfbLUK6v3PCZCK8K3RDSnYU6L2p2rLxegs08xUWY3yLnbkI
kCAsFYijvH46oqayfuutOfV7/sATWEwTUtDORtUXx3/FLlssrR/QX/Jj9RU7BRxR
sMgLvWzV9gceozH5hwrBmp/m/h3uJHb+MuZAjZ5NShyuyNc9WdwlmQcItJewDnmC
y1em+pw1kJSkzOnGdci1JutLTprMJo3f9bS81dy8TSeuOmodN0Jz95hqRZxVaRjx
zdcPlsOWI73pqcTcz69ud4I39pG9G6Y5MCXcggBXJI6mY4+MoTRAyv/vHvu5nBeS
2dO4GzYBAoGBAPi394D+bK0BumU7T8wyKsvoannACEF3BZk4UctZLgVIKN1B5dcY
cYYf9HAdhAQc296ykzf3PjMl0uC8FNqIkaDXz2SAApgJJ/oCklcFKWfbNWqJC/Yn
h+6J3GyQdF2miSSDVSi50TJwlOWeVi1EmBiYJ3KATAjodc6QrH5qj4vJAoGBAP+G
WPajfSFH2TLBZrVWYO/2TcY+eswLFYQsn5C8JCyKuyn+RX3NpCt2KpgqbC8Ot623
HPyn/7ndi1YA0LEWcw3RsLa4Xfp8207N/ILLQplZFzrajANta3ORG/CYzY7n6NzC
RmHZXrPTATSbXNw+yBR+yWmRK9+/ZYdY5UbDvtNlAoGAbvvIWasuW1T2E84PoZKR
PkQLnyBtjqjJusFC3naA7qJweaq6IO0rWypPLOg+zIcEJa+Rudt9yd0K6HWE6K8g
LKGgTbxBbA5J5GnZWzNWcp2CjHNy/vhM08h4r4kWI+P4Nm7URUQFcXiDOKMa2UBO
jkr270UIqMDyMKamEhMC0uECgYAKevgrJYl8U/YUntoXlfNj5DZMa0OeGtZHFY11
4kGZkhcbIdK31jdlkPMuSo8lXvUpqtkFg955QRz16hKlMMaHSpJ07BruqzBTix9Q
PgX9RCovv8b+XP6LPuhmdd34foqOg2lfmgrIVV83SSgF4I1USd749XtXMgJ4Cq1c
uaqaAQKBgH3CYaw2mA1w+c+Yr6LOaAqSlzOvh7VoPVvk8AdoYY8WQslsKhQ1tYuV
FdahZaqsfgPYAHI8eak/jrT6M52fEh4myriuXsTR64TYTjAzIjS9c4EOcuBkT2jM
gvu3C/1E6Mos8vF5WFb6AbzMQxctf+CnlqdfbQTAwJDFCXTZLFst
-----END RSA PRIVATE KEY-----
```
- Sau đó ta chạy các lệnh : 

`chmod 600 recover_key.pem`
`ssh -p 2222 -i recover_key.pem sena@103.162.14.116`
`cat /flag.txt`




## Simple Encode
![](https://hackmd.io/_uploads/BJ5mzpkx6.png)
chal.py:
```python=
import string
from hashlib import md5
import random

def encode(m):
    return ''.join(bin(ord(c))[2:] for c in m)  

flag = "KMA{" + "".join(random.choices(string.printable[:-6], k=27)) + "}"  
#print(f'{flag = }')

flag_hash = md5(flag.encode()).hexdigest()
print(f'{flag_hash = }')

flag_encode = encode(flag)
print(f'{flag_encode = }')

'''
flag_hash = '16ab78b0c0654e663d7e2e22ac0a9b7a'
flag_encode = '10010111001101100000111110111010001011000111000101010110110001101101001011100101110000111010110101111000101111001111110100000010001111000111011011011110101011111110011000111110111101001001000100011010001101111101'
'''
```

- Đề bài cho `flag_hash` được hash bằng md5 và `flag_encode` được encode binary.
- `flag = "KMA{" + "".join(random.choices(string.printable[:-6], k=27)) + "}" ` Ta thấy flag được tạo thành từ 32 kí tự và trong đó 27 kí tự được lấy random trong `printable[:-6]`.
- Sau khi thử hàm `encode` thì ta thấy các kí tự trong `printable` được chuyển đổi qua binary (7 bit 6 bit) và bỏ tiền tố `0b` ![](https://hackmd.io/_uploads/B1qMtT1xa.png)
- Dựa vào `flag_encode` mình tìm được một số kí tự cố định như `KMA{(X8UX6` và ở cuối flag `HFF}`. Tiếp đó các kí tự tiếp theo của flag mình không biết là 6 bit hay 7 bit và có quá nhiều trường hợp nên làm bằng tay là rất mất nhiều thời gian. Vì thế ta sẽ dùng code để thử tất cả trường hợp và đem so sánh với hash để tìm flag.

solve.py:
```python=
import string
from hashlib import md5
alpha=string.printable[:-6]
h="16ab78b0c0654e663d7e2e22ac0a9b7a"
enc="101000101100011100010101011011000110110100101110010111000011101011010111100010111100111111010000001000111100011101101101111010101111111001100011111011110100100100010001101000110"
def generate_binary_strings_with_count(n1, n2, prefix=""):
    if len(prefix) == n1 + n2 and prefix.count('0') == n1 and prefix.count('1') == n2:
        e=enc
        try:
            res=""
            for i in prefix:
                if i=='0':
                    if chr(int(e[:6],2)) not in alpha:
                        return
                    res+=chr(int(e[:6],2))
                    e=e[6:]
                else:
                    if chr(int(e[:7],2)) not in alpha:
                        return
                    res+=chr(int(e[:7],2))
                    e=e[7:]
            flag = "KMA{" + res + "}"
            flag_hash = md5(flag.encode()).hexdigest()
            if flag_hash==h:
                print("flag:",flag)
        except:
            pass
        return
    if prefix.count('0') < n1:
        generate_binary_strings_with_count(n1, n2, prefix + "0")
    if prefix.count('1') < n2:
        generate_binary_strings_with_count(n1, n2, prefix + "1")
generate_binary_strings_with_count(12, 15)

```
> KMA{(X8UX6K%0uWE9>@#1m^W<1=tHFF}

- Cách khác: 
    - Sau khi tìm được các phần như `KMA{(X8UX6` và `HFF}` mình sẽ dùng đoạn code ở dưới đây để tìm các kí tự tiếp theo. Lưu ý cách này có thể sai sót gây dễ nhầm lẫn.

```python=
import string
pt=string.printable[:-6]
def encode(m):
    return ''.join(bin(ord(c))[2:] for c in m)  
flag_encode = '10010111001101100000111110111010001011000111000101010110110001101101001011100101110000111010110101111000101111001111110100000010001111000111011011011110101011111110011000111110111101001001000100011010001101111101'
fl=  'KMA{(X8UX6'
for i in pt:
    if encode(fl + i) in flag_encode:
        fl= fl+ i
        print(fl)
```
![](https://hackmd.io/_uploads/ByRvNbxg6.png)
- Tiếp đó ta cứ thêm kí tự mới có vào `fl` 
 ![](https://hackmd.io/_uploads/B14aV-xlp.png)
- Tới đây chúng ta thêm từ từ từng kí tự một vì mình sợ bị sai, nói chung mình sẽ thử nhiều và ghi lại và so sánh các trường hợp.
![](https://hackmd.io/_uploads/ByCDr-egp.png)
- Sau khi tới đây thì đã không còn kí tự nào nữa vì tìm tiếp sẽ không được, mình chuyển qua tìm các kí tự ở cuối.![](https://hackmd.io/_uploads/HkbTrbxlp.png)
![](https://hackmd.io/_uploads/HJbRrWegT.png)
![](https://hackmd.io/_uploads/r1R8Ibexa.png)
- Ở các kí tự cuối chúng ta có thể tìm thêm nhưng xuất hiện trường hợp khác. Căn cứ vào `KMA{(X8UX6K%0uWE9>@` và `X6%ea5WE9>@#1m^W<c;4HFF}` 
Ta kết hợp hai cái lại `KMA{(X8UX6K%0uWE9>@#1m^W<c;4HFF}` hoặc là `KMA{(X8UX6%ea5WE9>@#1m^W<c;4HFF}` và thử submit hết flag.


## Similar but ...
![](https://hackmd.io/_uploads/H13Hg0kxp.png)

chal.py:
```python=
from Crypto.Util.number import *

p = getPrime(2048)
q = getPrime(2048)
n = p*q
e = 2

print(f'{n = }')

flag = "KMA{anh che roi!!!!!!!}"
l = len(flag)
print(f'{l = }')

msg = f'''
Gửi đến những người em thân yêu của anh, hôm nay anh muốn chia sẻ với các em một câu chuyện về kho báu. 
Trong câu chuyện này, kho báu được chia thành hai nửa, và mỗi nửa mang trong mình một ý nghĩa đặc biệt.
Nửa đầu tiên anh giấu ở đây: {flag[:l//2]}
Còn đây là nửa thứ hai: {flag[l//2:]}
Hãy tìm ra kho báu của anh đi, anh để hết trong msg rồi đó.
Chúc các em may mắn !!!
'''

c = pow(bytes_to_long(msg.encode()), e,n)
print(f'{c = }')

'''
n = 284195696721751741542976970377246384163200746062783759329661617188815436776424189078521874168074640320924439097731870753354899953210403298438375686437215681238598996375382536537768278254146374135440697791835320902172928838535170207920563260188268857178412014945665843067884706362429213081345697201062048319151146709862154724701120787598264599428501030945241764332469820283330386978451487308358496070493019375227430237712951734594609189071738774562063639368050519599690219339371888693892756654714125742546793650545564645761412676393745546867317157950660276413454704121923686068169935524575099441009254762051678974615084672006274688302115077734407074204036930371634952480748870905140950407665202776686680232626404222734370828402377048157739018826752500816695651244608931659579045297636939347065142654266415418100162785201594053030962306454285243690682313810711305540434910861763618201288903763117959626276874769295456013747611282355250494278056557319959998777444026981083893016148032869660521587008308779834135343779295437340050873017686606894792594175473683376016830206421076702465312246840917660142641545140295983913838540847955749716541937276104901379735588334581049297927341758018775135576856481243743641314705618868934645861372761
l = 46
c = 197348052174145638785229215457497516691585910055835441125583073645980013777032065006627024581136020897300252228534006100306209234223154204281916399887451961006595700453576912583653484661863741375270305419615721406198781214515934675523007505165820308082654403780811498250984535336719680589351485735567955825720119048693747519278867766555710216038040229689357846375187513096350835998852728799656866437148777620905204000517049701112204778019184506339386241329691058153055354968087261832501249138236077313408204182929051641521267083356295624561257562991234261668632037087231724232716833294744291699334965334803826200727633700589654688863746449952492047286765973034494755978048670534899135052018421945310658805856492088479095070115314198579191182336314746398558742288499341372595578846975164079893641205584309595266932028754927985671375042116891444819656916960144209962788439147210122667753145683940192069926363191913583924164601419393905729897192079336412469978182139715148777895764888053578167383521367586833983484951931519842177634434322107919818397921097644416813823140565831649561406124639176188646350960425853516784830094432718779747088309513889971075211757981041043652016970888838329334179083984287540371718185534696012444989603691
'''
```

- Đọc source ta thấy đây là dạng mã hóa RSA, đề bài đã cho chúng ta `n`, `c`(phần `msg` được mã hóa), `l`(len: độ dài `flag`), và 1 phần `msg`(thiếu mỗi `flag`). 
- Bài này là dạng `Stereotyped message attack` https://gsdt.github.io/blog/2018/07/20/stereotyped-message-attack/ 
- Ta thấy `len` của `flag` là 46 nên mình chia nửa ra và đặt là `XX....` như trong hình ![](https://hackmd.io/_uploads/SkVTFkelT.png). 
- Vì `c = m^e mod n` nên => `m^e - c (mod n) =0 `
=> `f(x)= f(x) = (M + x)^e - c`   (x là phần chưa biết trong msg; M là phần đã biết)
- Chúng ta sẽ thay thế phần `XX...` thành các bytes `null`, và để tìm phần chưa biết ta sẽ dùng coppersmith để giải quyết vấn đề này, ở đây ta sử dụng hàm `small_roots` của sagemath.

solved.py:
```sage=
from Crypto.Util.number import *

n = 284195696721751741542976970377246384163200746062783759329661617188815436776424189078521874168074640320924439097731870753354899953210403298438375686437215681238598996375382536537768278254146374135440697791835320902172928838535170207920563260188268857178412014945665843067884706362429213081345697201062048319151146709862154724701120787598264599428501030945241764332469820283330386978451487308358496070493019375227430237712951734594609189071738774562063639368050519599690219339371888693892756654714125742546793650545564645761412676393745546867317157950660276413454704121923686068169935524575099441009254762051678974615084672006274688302115077734407074204036930371634952480748870905140950407665202776686680232626404222734370828402377048157739018826752500816695651244608931659579045297636939347065142654266415418100162785201594053030962306454285243690682313810711305540434910861763618201288903763117959626276874769295456013747611282355250494278056557319959998777444026981083893016148032869660521587008308779834135343779295437340050873017686606894792594175473683376016830206421076702465312246840917660142641545140295983913838540847955749716541937276104901379735588334581049297927341758018775135576856481243743641314705618868934645861372761
l = 46
c = 197348052174145638785229215457497516691585910055835441125583073645980013777032065006627024581136020897300252228534006100306209234223154204281916399887451961006595700453576912583653484661863741375270305419615721406198781214515934675523007505165820308082654403780811498250984535336719680589351485735567955825720119048693747519278867766555710216038040229689357846375187513096350835998852728799656866437148777620905204000517049701112204778019184506339386241329691058153055354968087261832501249138236077313408204182929051641521267083356295624561257562991234261668632037087231724232716833294744291699334965334803826200727633700589654688863746449952492047286765973034494755978048670534899135052018421945310658805856492088479095070115314198579191182336314746398558742288499341372595578846975164079893641205584309595266932028754927985671375042116891444819656916960144209962788439147210122667753145683940192069926363191913583924164601419393905729897192079336412469978182139715148777895764888053578167383521367586833983484951931519842177634434322107919818397921097644416813823140565831649561406124639176188646350960425853516784830094432718779747088309513889971075211757981041043652016970888838329334179083984287540371718185534696012444989603691
e = 2

msg = f'''
Gửi đến những người em thân yêu của anh, hôm nay anh muốn chia sẻ với các em một câu chuyện về kho báu. 
Trong câu chuyện này, kho báu được chia thành hai nửa, và mỗi nửa mang trong mình một ý nghĩa đặc biệt.
Nửa đầu tiên anh giấu ở đây: XXXXXXXXXXXXXXXXXXXXXXX
Còn đây là nửa thứ hai: XXXXXXXXXXXXXXXXXXXXXXX
Hãy tìm ra kho báu của anh đi, anh để hết trong msg rồi đó.
Chúc các em may mắn !!!
'''
msg= msg.encode()
msg= msg.replace(b'X', b'\x00')
msg= bytes_to_long(msg)
P.<x>= PolynomialRing(Zmod(n))
f= (int(msg) + x)^e -c 
msg = int(msg) + int(f.small_roots()[0])

print(long_to_bytes(msg))

```

> KMA{So_litttt_c0pp33r_Sm1th_Savageeeee!!!!!!!}


## Bazoka
![](https://hackmd.io/_uploads/S1VWaklxT.png)
chal.py:
```python=
from hashlib import md5

def encrypt(plaintext, key):
    key = md5(key).digest()
    msg = plaintext + b'|' + key
    # print(msg)
    encrypted = b'K'
    for i in range(len(msg)):
        encrypted += bytes([(msg[i] + key[i%len(key)]  + encrypted[i]) & 0xff])
    return encrypted.hex()

flag = b"KMA{anh xoa di roi}"
key = b"anh xoa di roi"
ciphertext = encrypt(flag, key)
print(ciphertext)
# 4b851cc4cdd1c7a3b7a3d83095a46a320e6b21e9e5afab7b8869d930c9cd981a0523a037faca8425f9a921c6ebca8f7087f8aab5bc53fe9cd5acfa9e
```

- Bài này ta thấy flag được mã hóa qua hàm `encrypt`, hàm `encrypt` hoạt động như sau: Đầu tiên sẽ chuyển key qua dạng md5 và tạo một `msg = plaintext + b'|' + key `, sau đó chạy vòng for qua từng kí tự msg và tính tổng của các phần tử `msg` , `key` và một chuỗi `encrypted` ![](https://hackmd.io/_uploads/SylM0hzeT.png)
- Nhiệm vụ của chúng ta bây giờ là tìm `key`. Và dùng `key` để giải mã flag.
- Để tìm `key` , đầu tiên ta sẽ tính `sum` của từng `encrypted[i]`, chúng ta sẽ lấy `enc[i] - enc[i-1] % 256`
```python=
enc = '4b851cc4cdd1c7a3b7a3d83095a46a320e6b21e9e5afab7b8869d930c9cd981a0523a037faca8425f9a921c6ebca8f7087f8aab5bc53fe9cd5acfa9e'

enc = bytes.fromhex(enc)
sum = []
for i in range(1, len(enc)):
    a = (enc[i]-enc[i-1])%256
    sum.append(a)
print(sum)
```
- Sau khi đã có sum thì ta có độ dài md5 của key là 16 bytes, chúng ta đã biết được một số kí tự `'KMA{'` `'}'` `'|'` của `msg` nên có thể khôi phục lại `key` ở vị trị tương đương `msg`. 
- Sau khi tìm được hết key thì ta tìm lại msg bằng công thức `(msg[i] = sum[i] - key[i%len(key)])%256`

solved.py:
```python=


ct="4b851cc4cdd1c7a3b7a3d83095a46a320e6b21e9e5afab7b8869d930c9cd981a0523a037faca8425f9a921c6ebca8f7087f8aab5bc53fe9cd5acfa9e"
ct=bytes.fromhex(ct)
sum=[]
for i in range(1,len(ct)):
   a= (ct[i]- ct[i-1])%256
   sum.append(a)
   
#sum = [58, 151, 168, 9, 4, 246, 220, 20, 236, 53, 88, 101, 15, 198, 200, 220, 93, 182, 200, 252, 202, 252, 208, 13, 225, 112, 87, 153, 4, 203, 130, 235, 30, 125, 151, 195, 208, 186, 161, 212, 176, 120, 165, 37, 223, 197, 225, 23, 113, 178, 11, 7, 151, 171, 158, 57, 215, 78, 164]   
list_key=[]
for i in range(5):
    for i in range(0,16):
        if len(list_key)== len(sum):
            break
        else:
           list_key.append(i)
#list_key= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]       
# print(list_key[-16:])
key=[0]*16
key[0]= (sum[0] - ord('K'))%256
key[1]= (sum[1] - ord('M'))%256
key[2]= (sum[2] - ord('A'))%256
key[3]= (sum[3]- ord('{'))%256
key[10]= (sum[-17] - ord('|')) %256
key[9]= (sum[-18]- ord('}'))%256
key[15]= (sum[-1] - key[10])%256
key[14]= (sum[-2] -key[9])%256
key[8] = (sum[-8] - key[3])%256
key[7]= (sum[-9] - key[2])%256
key[6]= (sum[-10]- key[1])%256
key[5]= (sum[-11] - key[0])%256
key[4]= (sum[-12] - key[15])%256
key[11]= (sum[-5] - key[6])%256
key[12]= (sum[-4]- key[7])%256
key[13]= (sum[-3] - key[8])%256
msg=""
for i in range(len(sum)):
    b= (sum[i] - key[i%len(key)])%256
    msg= msg + chr(b)
print(msg)

#KMA{https://zhuanlan.zhihu.com/p/30548907}|ïJgh¤yû)6^S{
```

