728x90
공부하면서... 내가 헷갈렸던 부분 정리!
1. 왜 xor 연산을 하려면 바이트형식으로 바꿔서 해야하는걸까?
-> 주된 이유는 xor 연산이 비트 단위 연산이기 때문에!!
파이썬에서는 정수형끼리는 xor 연산 가능!! (자동적으로 2진수로 바꿔서 실행됨)
ex)
print(2^4) # 결과: 6
그러면 16진수는 어떨까?
ex)
hex_A = 0x1A
hex_B = 0x3F
byte_A = int.to_bytes(hex_A, length=1, byteorder='big')
byte_B = int.to_bytes(hex_B, length=1, byteorder='big')
result = bytes(x ^ y for x, y in zip(byte_A, byte_B))
result_hex = int.from_bytes(result, byteorder='big')
print(hex(result_hex)) # 결과: 0x25
int.to_bytes() 함수를 써서 해도 되고
출력을 10진수로 하고 싶다면 int('hex', 16) 으로 하고 계산하면 되고,
str(문자, text) 로 출력하고 싶다면 int() 를 쓴 후 pycryptodome 라이브러리의 long_to_bytes() 를 쓰면 문자로 결과가 나온다!
ex)
hex_A = '1A'
hex_B = '3F'
byte_A = bytes.fromhex(hex_A)
byte_B = bytes.fromhex(hex_B)
res = xor(byte_A, byte_B)
print(res) # 결과: b'%'
2. 문자형식(텍스트)를 xor하려면 어떻게 해야할까?
가장 간단한 방법은 pwntools의 xor() 함수를 사용하는 것이다.
❗️주의❗️
str앞에 byte prefix(b'~~') 를 붙이는걸 잊지 말자!! (쓸데없는 경고가 안나옴)
ex)
from pwn import *
s = b'label'
print(xor(s, 13)) # 결과: b'aloha'
하지만 pwntools 라이브러리를 사용하지 않는다면 다음과 같이 할 수 있다.
ex)
s = b'label'
print("".join(chr(c ^ 13) for c in s)) # 결과: aloha
728x90
'study > 수학&암호' 카테고리의 다른 글
[수학] [강의] 현대수학의 이해 (0) | 2023.05.30 |
---|