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)