Modes of Operation Starter

문제 및 설명

이전 일련의 과제는 AES가 데이터 블록에서 키 순열을 수행하는 방법을 보여주었다. 실제로, 우리는 단일 블록보다 훨씬 더 긴 메시지를 암호화해야 한다. 작동 모드는 긴 메시지에서 AES와 같은 암호를 사용하는 방법을 설명합니다.

모든 모드는 잘못 사용하면 심각한 약점이 있습니다. 이 범주의 과제는 API와 상호 작용하고 이러한 약점을 이용할 수 있는 웹 사이트의 다른 섹션으로 이동합니다. 인터페이스를 숙지하고 다음 플래그를 사용하십시오!

https://aes.cryptohack.org/block_cipher_starter/

풀이

더보기

from Crypto.Cipher import AES


KEY = ?
FLAG = ?


@chal.route('/block_cipher_starter/decrypt/<ciphertext>/')
def decrypt(ciphertext):
    ciphertext = bytes.fromhex(ciphertext)

    cipher = AES.new(KEY, AES.MODE_ECB)
    try:
        decrypted = cipher.decrypt(ciphertext)
    except ValueError as e:
        return {"error": str(e)}

    return {"plaintext": decrypted.hex()}


@chal.route('/block_cipher_starter/encrypt_flag/')
def encrypt_flag():
    cipher = AES.new(KEY, AES.MODE_ECB)
    encrypted = cipher.encrypt(FLAG.encode())

    return {"ciphertext": encrypted.hex()}

이번 문제는 SYMMETRIC CIPHER에 나오는 문제를 푸는 방식에 대하여 보여주는 문제였기에 이는 쉽게 사이트내에서 풀수 있다.

먼저 encrypt_flag를 실행후 이를 decrypt에 복사하면 평문에 hex값으로 나오는데

이를 HEX ENCODER에 넣으면

플래그값은 crypto{bl0ck_c1ph3r5_4r3_f457_!}이다.

Symmetry

문제 및 설명

OFB, CTR 또는 CFB와 같은 일부 블록 암호 모드는 블록 암호를 스트림 암호로 변환합니다. 스트림 암호 뒤의 아이디어는 의사 무작위 키 스트림을 생성하는 것이며, 이는 평문으로 XOR가 된다. 스트림 암호의 한 가지 장점은 패딩이 필요 없이 임의의 길이의 일반 텍스트로 작업할 수 있다는 것이다.

OFB는 불분명한 암호 모드이며, 요즘 CTR을 사용하는 것에 비해 실질적인 이점이 없다. 이 도전은 OFB의 특이한 특성을 도입한다.

https://aes.cryptohack.org/symmetry/

풀이

더보기
from Crypto.Cipher import AES


KEY = ?
FLAG = ?


@chal.route('/symmetry/encrypt/<plaintext>/<iv>/')
def encrypt(plaintext, iv):
    plaintext = bytes.fromhex(plaintext)
    iv = bytes.fromhex(iv)
    if len(iv) != 16:
        return {"error": "IV length must be 16"}

    cipher = AES.new(KEY, AES.MODE_OFB, iv)
    encrypted = cipher.encrypt(plaintext)
    ciphertext = encrypted.hex()

    return {"ciphertext": ciphertext}


@chal.route('/symmetry/encrypt_flag/')
def encrypt_flag():
    iv = os.urandom(16)

    cipher = AES.new(KEY, AES.MODE_OFB, iv)
    encrypted = cipher.encrypt(FLAG.encode())
    ciphertext = iv.hex() + encrypted.hex()

    return {"ciphertext": ciphertext}

encrypt_flag를 보면 iv값은 16바이트의 임의값이 들어가고

flag값을 OFB모드를 통해 암호화를 시킨 후, iv의 16진수값+암호화된 flag값을 반환시킨다.

 

encrypt를보면 plaintext와 iv값을 가지고

평문값을 ofb모드로 암호화를한다.

 

ofb모드는 iv를 암호화한후 평문과 xor연산을 하여 암호문을 만들고

복호화도 암호문과 암호화된 iv값을 xor시켜 평문을 만들어 낸다.

코드에선 iv값이 나와있고, 암호화된 flag값이 있기에

이를 encrypt에 넣으면 복호화가 된다고 생각해서 대입하였다.

 

ciphertext='8f537498e88272c706f4a85c486b4f002012c936a54d407059d59978983dc14cdfb875853b50ac6f07b7339a2fe10dbcce'
iv=ciphertext[:32]
encrypted = ciphertext[32:]
print(iv)
print(encrypted)

HEX Encoder를 통해 플래그값이 나왔다.

플래그값은 crypto{0fb_15_5ymm37r1c4l_!!!11!}이다.

 

복사했습니다!