Giải mã python hmac

giải mã def[cls, key, keyusage, ciphertext]. nếu len[bản mã] < 24. tăng ValueError['bản mã quá ngắn'] cksum, basic_ctext = ciphertext[. 16], bản mã[16. ] ki = HMAC. chìa khoá mới. nội dung, cls. usage_str[keyusage], MD5]. tiêu hóa [] ke = HMAC. mới [ki, cksum, MD5]. digest[] basic_plaintext = ARC4. mới [ke]. giải mã [basic_ctext] exp_cksum = HMAC. mới [ki, basic_plaintext, MD5]. digest[] ok = _mac_equal[cksum, exp_cksum] nếu không ổn và keyusage == 9. # Thử lại với cách sử dụng 8, do lỗi RFC 4757. ki = HMAC. chìa khoá mới. nội dung, gói ['

Tạo API chỉnh sửa cho hacker. ở đây, bạn có thể thay đổi bản rõ và mã hóa lại cũng được, nhưng hạn chế tạo lại dòng khóa vì nó tốn rất nhiều thời gian

# API exposed to hacker
def edit[offset: int, newtext: bytes] -> int:
    return cipher[:offset] + \
            stream_xor[newtext, keystream[offset:offset + len[newtext]]] + \
            cipher[offset + len[newtext]:]

Và chúng ta có thể thay đổi bản rõ và xem mật mã mới, chúng ta có thể bruteforce toàn bộ bản rõ từng chữ cái một. với mỗi khả năng của một chữ cái, chúng ta so sánh bản rõ mới với bản rõ cũ xem có giống nhau không

plaintext = b''
for i in trange[len[cipher]]:
    for b in range[256]:
        byte = bytes[[b]]
        if edit[i, byte] == cipher:
            plaintext += byte
            break
print[plaintext]
Thử thách 26. CTR bitflipping

Do bài này giống như set 2 challenge 16, chúng ta clone code bên đó về — chỉ khác nhau là sử dụng chế độ CTR, và CTR không cần đệm

random_key = generate_key[]
def encrypt_data[s: str] -> bytes:
    s = r"comment1=cooking%20MCs;userdata=" + s.replace['=', ''].replace[';', ''] + r";comment2=%20like%20a%20pound%20of%20bacon"
    return encrypt_ctr[random_key, s.encode[]]

def is_admin[s: bytes] -> bool:
    return b'admin=true' in encrypt_ctr[random_key, s].split[b';']

Tương tự với challenge 16, we want to edit ciphertext sao cho

comment1=cooking                   comment1=cooking
%20MCs;userdata=                   %20MCs;userdata=
AAAAAAAAAAAAAAAA       --->        kwkt;admin=true;
;comment2=%20lik                   ;comment2=%20lik
e%20a%20pound%20                   e%20a%20pound%20
of%20bacon                         of%20bacon

Chỉ thực hiện mã hóa luồng XOR với luồng khóa, chúng ta có thể thay thế cả khối đó mà không tạo các byte rác như CBC

cipher = encrypt_data['A' * 16]
cipher = cipher[:32] + stream_xor[cipher[32:48],
    stream_xor[b'kwkt;admin=true;', b'A' * 16]
] + cipher[48:]
assert is_admin[cipher]
Thử thách 27. Khôi phục khóa từ CBC bằng IV=Key

Chúng ta sửa lại một chút mã của thử thách 16 để IV=Key, đồng thời cố định hạt giống để sau khi kiểm tra câu trả lời

seed['no_random']
random_key = generate_key[]
def encrypt_data[s: str] -> bytes:
    s = r"comment1=cooking%20MCs;userdata=" + s.replace['=', ''].replace[';', ''] + r";comment2=%20like%20a%20pound%20of%20bacon"
    return AES_encrypt[random_key, pkcs7_pad[s.encode[]], 'cbc', random_key]

def is_admin[s: bytes] -> bool:
    decrypted = pkcs7_unpad[AES_decrypt[random_key, s, 'cbc', random_key]].split[b';']
    for char in decrypted:
        assert int[char]         kwkt;admin=true;
;comment2=%20lik                   ;comment2=%20lik
e%20a%20pound%20                   e%20a%20pound%20
of%20bacon                         of%20bacon
4 cả

cipher = encrypt_data['']
is_admin[cipher[:16] + b'\x00' * 16 + cipher[:16] + cipher[48:]]

Đương nhiên Python sẽ giải phóng một ngăn xếp lỗi

________số 8_______

Và làm đúng như những gì đã được hướng dẫn

decrypted = b'comment1=cooking\x86H\xf5\xd6\xcf\xc6uG\r\xc0J\xf5/\xb5\x1c\nV]\x08\xc5\x89\xed\x82\xddi\x01\x86\xd3\xb4s\xd9\xfc\x1en\x80\xc2\x8d[\xe1\xc9\xed\xea\x0e\xe6\xc6\x87\xec\xa2of%20bacon'
recovered = stream_xor[decrypted[:16], decrypted[32:48]]
assert recovered == random_key

That at sao lại đúng?

Rát đơn giản, chúng ta chỉ cần để ý khối 1 và 3. Ta has

# API exposed to hacker
def edit[offset: int, newtext: bytes] -> int:
    return cipher[:offset] + \
            stream_xor[newtext, keystream[offset:offset + len[newtext]]] + \
            cipher[offset + len[newtext]:]
0

Vì vậy ta có thể lấy lại key đã lấy bằng cách XOR 2 block "plaintext" đó. Thật là kỳ diệu

Thử thách 28. Triển khai MAC có khóa SHA-1

Mình dùng và chỉnh sửa tập tin này rồi lưu vào

comment1=cooking                   comment1=cooking
%20MCs;userdata=                   %20MCs;userdata=
AAAAAAAAAAAAAAAA       --->        kwkt;admin=true;
;comment2=%20lik                   ;comment2=%20lik
e%20a%20pound%20                   e%20a%20pound%20
of%20bacon                         of%20bacon
5, các bạn có thể tham khảo. Sau đó thì mất 3 dòng code nữa để thực thi HMAC

# API exposed to hacker
def edit[offset: int, newtext: bytes] -> int:
    return cipher[:offset] + \
            stream_xor[newtext, keystream[offset:offset + len[newtext]]] + \
            cipher[offset + len[newtext]:]
1Thử thách 29. Phá vỡ MAC có khóa SHA-1 bằng cách sử dụng phần mở rộng độ dài

Thực hiện [chép từ mã nguồn] lại phần đệm tuân thủ MD cho SHA-1

# API exposed to hacker
def edit[offset: int, newtext: bytes] -> int:
    return cipher[:offset] + \
            stream_xor[newtext, keystream[offset:offset + len[newtext]]] + \
            cipher[offset + len[newtext]:]
2

Như đề bài đã nói, độ dài của tiền tố sẽ phải dự đoán;

# API exposed to hacker
def edit[offset: int, newtext: bytes] -> int:
    return cipher[:offset] + \
            stream_xor[newtext, keystream[offset:offset + len[newtext]]] + \
            cipher[offset + len[newtext]:]
3

And try hack any

# API exposed to hacker
def edit[offset: int, newtext: bytes] -> int:
    return cipher[:offset] + \
            stream_xor[newtext, keystream[offset:offset + len[newtext]]] + \
            cipher[offset + len[newtext]:]
4

This section Unknown/dễ dàng nhưng quá dễ xảy ra lỗi đến mức mình mất một buổi chiều để làm việc

Thử thách 30. Phá vỡ MAC có khóa MD4 bằng cách sử dụng phần mở rộng độ dài

Mình đang sử dụng thực hiện ở đây

Thử thách tương tự 28, mình thực hiện các hàm cần thiết trong đề bài

# API exposed to hacker
def edit[offset: int, newtext: bytes] -> int:
    return cipher[:offset] + \
            stream_xor[newtext, keystream[offset:offset + len[newtext]]] + \
            cipher[offset + len[newtext]:]
5

Định nghĩa hàm padding

# API exposed to hacker
def edit[offset: int, newtext: bytes] -> int:
    return cipher[:offset] + \
            stream_xor[newtext, keystream[offset:offset + len[newtext]]] + \
            cipher[offset + len[newtext]:]
6

And crack same i xì challenge 29

# API exposed to hacker
def edit[offset: int, newtext: bytes] -> int:
    return cipher[:offset] + \
            stream_xor[newtext, keystream[offset:offset + len[newtext]]] + \
            cipher[offset + len[newtext]:]
7Thử thách 31. Triển khai và phá vỡ HMAC-SHA1 bằng rò rỉ thời gian nhân tạo

Việc đầu tiên cần làm là viết mã máy chủ — mình viết bằng Flask vì mình viết Flask quen rồi

# API exposed to hacker
def edit[offset: int, newtext: bytes] -> int:
    return cipher[:offset] + \
            stream_xor[newtext, keystream[offset:offset + len[newtext]]] + \
            cipher[offset + len[newtext]:]
8

Chúng ta sẽ thử tìm hàm băm của chuỗi vierundzwanzigsieben — giờ là máy chủ truy vấn mã từ máy khách. Chúng ta nhận vào 20 byte [vì đó là kích thước đầu ra của SHA-1], và trả về dữ liệu băm có sai không, và thời gian cần thiết để máy chủ trả về

# API exposed to hacker
def edit[offset: int, newtext: bytes] -> int:
    return cipher[:offset] + \
            stream_xor[newtext, keystream[offset:offset + len[newtext]]] + \
            cipher[offset + len[newtext]:]
9

Sau đó chúng ta bruteforce dần dần từng chữ cái. if try chữ cái đó mà lâu hơn lần trước, nghĩa là hàm so sánh phải so sánh thêm 1 chữ cái, nghĩa là chữ cái vừa rồi là đúng

Trường hợp thử đầu tiên cho từng chữ cái thì phức tạp hơn. could be chữ cái đó [0] đã đúng luôn rồi. Vì vậy, ta phải thử với trường hợp 1 nữa. Sẽ xảy ra 3 trường hợp

  • If the time 2 fields are equal nhau, mean is not atrường hợp nào đúng cả. ta try to next from the 2 field
  • Nếu thời gian 2 trường hợp khác nhau, có nghĩa là trường hợp lâu hơn là trường hợp. ta chọn câu trả lời đúng, và chuyển sang chữ cái tiếp theo

Ngoài ra, mình còn sử dụng một số thủ thuật nữa

  • Để phòng trường hợp mỗi lần đo có chênh lệch phải chênh lệch ít nhất 3ms mới tính là có so sánh mới
  • Thử mỗi chữ số
    comment1=cooking                   comment1=cooking
    %20MCs;userdata=                   %20MCs;userdata=
    AAAAAAAAAAAAAAAA       --->        kwkt;admin=true;
    ;comment2=%20lik                   ;comment2=%20lik
    e%20a%20pound%20                   e%20a%20pound%20
    of%20bacon                         of%20bacon
    
    6 2 lần, nếu không tìm thấy câu trả lời, hãy quay lại thử lại chữ số trước, vì khả năng lớn là sai từ trước rồi
  • Nếu đến chữ cái cuối cùng mà không ra được, hãy thử lại chữ cái cuối cùng
plaintext = b''
for i in trange[len[cipher]]:
    for b in range[256]:
        byte = bytes[[b]]
        if edit[i, byte] == cipher:
            plaintext += byte
            break
print[plaintext]
0

Mã này sẽ rất lâu đó. Trường hợp nhất tiền tệ. 40 chữ cái ×\times× 0. 05s là 2s mỗi lần thử, với 16 lần thử mỗi chữ cái, là tổng cộng hơn 21 phút. Chưa kể, dò chữ cái sai hoài nên quay lại liên tục nữa. Chờ cả tháng luôn.

Thử thách 32. Phá vỡ HMAC-SHA1 với rò rỉ thời gian nhân tạo ít hơn một chút

Với thời gian thực chênh lệch quá nhỏ [5ms/it], thì các lần đo thời gian sẽ bị nhiễu rất lớn [so sánh tương đối] lờ mờ các yếu tố ngoại lai. Vì vậy, phải làm gì để giảm thiểu các sai số? . Chúng ta chạy thí nghiệm càng nhiều lần thì trung bình kết quả càng chính xác. Ở đây mình thử chạy mỗi bài kiểm tra 10 lần, nhưng để chắc chắn rằng bạn có thể chơi luôn 30 lần theo hướng dẫn của các nhà thống kê

Chủ Đề