from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from base64 import b64encode
# C#에서 추출한 키와 IV 값 (임의의 값으로 변경된 예제)
key = bytes([
123, 45, 67, 89, 23, 145, 167, 34,
98, 111, 76, 200, 150, 120, 90, 45,
210, 157, 180, 133, 178, 213, 90, 67,
111, 143, 123, 222, 132, 56, 77, 99
])
iv = bytes([
88, 23, 45, 67, 198, 123, 111, 200,
201, 54, 78, 123, 210, 157, 177, 32
])
# 암호화할 OrderId (예: "SAMPLE2411080505001")
sample_id = "SAMPLE2411080505001"
def encrypt_aes256_cbc(data, key, iv):
# AES 암호화 설정 (CBC 모드)
cipher = Cipher(algorithms.AES(key), modes.CBC(iv))
encryptor = cipher.encryptor()
# 데이터에 UTF-16 인코딩 및 PKCS7 패딩 추가
data_bytes = data.encode("utf-16")[2:] # UTF-16 BOM 제거
padding_len = 16 - (len(data_bytes) % 16)
padded_data = data_bytes + bytes([padding_len] * padding_len)
# 암호화 수행
encrypted_data = encryptor.update(padded_data) + encryptor.finalize()
# 암호화된 데이터를 Base64 인코딩하여 반환
return b64encode(encrypted_data).decode()
# AES256-CBC 암호화 수행하여 EncryptionOrderId 생성
encryption_sample_id = encrypt_aes256_cbc(sample_id, key, iv)
# 결과 출력
print("암호화된 sample_id (Encryptionsample_id):", encryption_sample_id)
※ 문제확인
- 그냥 암호화 관련을 사용하면 같은 값이 나올것이라고 생각
- 하지만 값이 계속 달랐음
- base64/btoa/aes/sha 등등의 순서가 달라져서 그럴수있다고 생각 한 뒤 원 C#의 코드와 순서도 같게 맞춤
- 하지만 그럼에도 값이 다름
- 둘이 같은 암호화를 써도 내부에서 실행되는 메서드 or 방식이 다르다고 판단
- 해결
※ 문제해결
- C#의 PasswordDeriveBytes로 파생된 키와 IV 값을 Python에서 정확히 재현하지 못했기 때문
Python에서 PBKDF2HMAC 등을 사용해 PasswordDeriveBytes와 유사한 방식으로 키와 IV를 생성하려 했지만, 내부적으로 두 방식은 약간의 차이가 있기 때문에 동일한 키와 IV를 얻지 못함 - Salt와 반복 횟수의 차이도 존재
- 해결 방법으로 하드코딩한 키와 IV 사용 : 최종적으로 C#에서 PasswordDeriveBytes로 파생된 정확한 키와 IV를 추출하여 Python 코드에 하드코딩함으로써, Python에서도 동일한 암호화 결과를 얻을 수 있었음.