Javascript
자바스크립트 AES암호화 및 복호화, 파이썬에서 복호화
jennyiscoding
2024. 8. 22. 13:04
자바스크립트
const handleCertification = () => {
if (inputUser === '' || inputPassword === '') {
sweetAlert('', '아이디와 비밀번호를 입력해주세요.', 'warning', 'center')
return
}
// AES-256 암호화
const secretKey = CryptoJS.enc.Utf8.parse('abcdabcdabcdabcdabcdabcd');
// zY7wR8uH2kP4mQ9tV3xB1nC6jW5sL8oT'라는 문자열을 UTF-8로 인코딩하고, 이 값을 CryptoJS 라이브러리의
// Utf8.parse 메서드를 사용하여 WordArray 형태로 변환합니다. 이 변환된 WordArray가 AES-256 암호화에 사용할 비밀 키가 됩니다
console.log("secretKey", secretKey)
const iv = CryptoJS.lib.WordArray.random(16)
console.log("iv", iv)
// 16바이트 길이의 초기화 벡터(IV)를 생성하여 저장
const encrypted = CryptoJS.AES.encrypt(inputPassword, secretKey, {
iv: iv,
padding: CryptoJS.pad.Pkcs7,
mode: CryptoJS.mode.CBC
})
console.log("encrypted", encrypted)
// inputPassword라는 비밀번호를 AES 알고리즘을 사용하여 암호화
// 암호화 옵션으로, IV, 패딩 방식(PKCS7), 암호화 모드(CBC)를 지정
const encryptedPassword = encrypted.ciphertext.toString(CryptoJS.enc.Base64)
console.log("encryptedPassword", encryptedPassword)
// encrypted.ciphertext는 암호화된 비밀번호의 바이너리 데이터(암호문)를 담고 있으며, 이 데이터를 Base64로 인코딩하여 텍스트 형태로 변환합니다
const ivBase64 = iv.toString(CryptoJS.enc.Base64)
console.log("ivBase64", ivBase64)
// 생성된 초기화 벡터(IV)를 Base64로 인코딩하여 문자열로 변환합니다.
// 암호화된 데이터를 복호화하려면 동일한 IV를 사용해야 하므로, IV를 텍스트 형태로 저장하거나 전송할 수 있도록 Base64로 인코딩합니다.
// 여기부터 복호화
const decrypted = CryptoJS.AES.decrypt({
ciphertext: CryptoJS.enc.Base64.parse(encryptedPassword)
}, secretKey, {
iv: iv,
padding: CryptoJS.pad.Pkcs7,
mode: CryptoJS.mode.CBC
});
const originalPassword = decrypted.toString(CryptoJS.enc.Utf8);
console.log("Decrypted password:", originalPassword);
// 복호화 끝
복호화는 파이썬에서 하기
@api_view(['POST'])
def sms_auth_check(request):
if request.method == 'POST':
try:
data = request.data
username = data['username']
password = data['password']
phone_number = data['phoneNumber']
iv = data['iv']
print(password, iv)
# 복호화 시작
# 비밀 키와 IV를 설정합니다
secret_key = b'abcdabcdabcdabcdabcdabcd' # 32바이트 키
iv = base64.b64decode(iv) # 16바이트 IV
# 암호화된 비밀번호를 Base64로 디코딩합니다
encrypted_password = base64.b64decode(password)
# AES 복호화기 생성
cipher = AES.new(secret_key, AES.MODE_CBC, iv)
# 복호화 수행
decrypted = unpad(cipher.decrypt(encrypted_password), AES.block_size)
# 복호화된 비밀번호를 UTF-8로 변환하여 출력
original_password = decrypted.decode('utf-8')
print("Decrypted password:", original_password)
# 복호화 끝
user = authenticate(username=username, password=original_password)