study/수학&암호

XOR 연산 정리

lucykorea414 2024. 1. 3. 17:22
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