웹프로그래밍

Global It Leader!!


PHP


 
 

[AES] JAVA - PHP AES 암호화

페이지 정보

작성자 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글 0건 조회 2,734회 작성일 21-07-20 16:59

본문

1. 개요


프로그래밍을 하다 보면, 이 기종 간에 데이터를 주고 받아야 하는 일이 참 많이 발생한다.


대체로 온라인을 통해 데이터를 주고 받는 경우가 흔한데, 이 경우 유출될 수 있는 데이터를 보호하기 위해서는 반드시 암호화/복호화 과정을 통해 데이터를 잠궈야 하는데 이때 많이 사용되는 암호화 알고리즘이 AES 방식일 것이다.


2. AES


데이터를 암호화 하는 키의 길이에 따라 AES-128, AES-192, AES-256 의 형태로 사용 가능하다.


단순히 키의 길이만 바뀌는 것이 아니라, 키의 길이에 맞춰 암호화를 진행하는 횟수 (이를 라운드라 함) 도 다르고 또 암호화 하고자 하는 데이터 길이에 따라서 CBC 방식이니 ECB, CFB 등등.. 여러 방식이 있지만 여기서 암호화 알고리즘에 대해 논하자는 것은 아니고 실제 선구자 들이 만들어 놓은 암호화 알고리즘을 사용하는 방법을 기술하고자 한다.


3. PHP


최신 PHP 에서는 openssl 확장 DLL을 통한 암호화 방식을 많이 사용한다.

openssl_encrypt, openssl_decrypt 함수를 사용하며 key, iv, 암호화 방식을 선택하기만 하면 간단하게 암호화가 가능해 진다.


openssl_encrypt($str, "AES-256-CBC", $secret_key, OPENSSL_RAW_DATA, $secret_iv);
openssl_decrypt($str, "AES-256-CBC", $secret_key, OPENSSL_RAW_DATA, $secret_iv);

자세한 사용 방법은 첨부 된 php 파일을 참고 하시길


 

4. JAVA


오늘 본 글을 블로그에 게재 하게 만든 원인. 이 녀석이다.


구글 등에서 JAVA AES 256 암호화로 검색하면 가장 많이 보이는 소스가 바로 다음과 같은 형식이다.


public AES256Util(String key) {
		this.iv = key.substring(0, 16);
		byte[] keyBytes = new byte[16];
		byte[] b = key.getBytes("UTF-8");
		int len = b.length;
		if (len > keyBytes.length) {
			len = keyBytes.length;
		}
		System.arraycopy(b, 0, keyBytes, 0, len);
		SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");

		this.keySpec = keySpec;
	}


AES-CBC 방식의 경우 초기화 벡터(IV) 값으로 16 byte의 공유(암호화 복호화 하고자 하는 사람 간에)되는 값을 사용한다.


대게 해당 값은 암호화에 사용하는 마스터 키(역시 암복호화 사이에 공유 되는 값) 에서 16 byte를 추출해서 사용하는 것이 보통이기에 위 소스 첫 째 줄처럼 사용하곤 한다.


여기까지는 문제가 없다.

다음을 보자


byte[] keyBytes = new byte[16];
byte[] b = key.getBytes("UTF-8");

...
...
...

System.arraycopy(b, 0, keyBytes, 0, len);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");


위 코드를 분석해 보면, keyBytes 라는 16 byte (중요하다. 강조!) 배열을 생성하고 입력받은 마스터 키(key) 값 중에서 에서 16 byte 를 뽑아와서 keyBytes 에 채워넣고 있다.


그리고, 이 값을 가지고 SecretKeySpec 이라는 함수를 통해 암복호화에 사용할 비밀키를 설정하고 있다.


여기서 이상한 점을 느낄 수 있는가?

사실 보안교육이나 암호화에 대해 따로 배운 적이 있지 않고는 위 코드만 보고서는 문제점을 찾기란 쉽지 않을 것이다.


본 글 2항에서, AES는 키의 길이에 따라 암호화 방식이 128, 192, 256 으로 나뉜다고 기술하였다.


하지만 대부분의 소스를 검색해 보면 SeceretKeySpec 함수를 사용하는데 있어 16 byte 의 키를 넣어 놓고는 AES-256 암호화를 사용하고 있다고 말하는 경우가 비일비재 하다.


위의 소스 코드는 다음과 같이 변경되어야 한다.


public AESCrypto(final String key, final int keySize) throws Exception { byte[] keyBytes=null; byte[] b = key.getBytes(StandardCharsets.UTF_8); String strCipher=null; switch (keySize) { case 16: // 128 bit strCipher = "AES-128"; keyBytes = new byte[keySize]; break; case 24: // 192 bit strCipher = "AES-192"; keyBytes = new byte[keySize]; break; case 32: // 256 bit strCipher = "AES-256"; keyBytes = new byte[keySize]; break; } if (keyBytes == null) { throw new Exception("암호화 방식이 올바르지 않습니다."); } System.out.println("Encrypt Type : "+strCipher); int inputKeyLength = key.length(); if (inputKeyLength > keySize) { // 입력 받은 key string 길이가 실제 암호화 할 대상 key 길이보다 큰 경우, 암호화 키 길이에 맞게 조정 System.arraycopy(b, 0, keyBytes, 0, keySize); } else if (inputKeyLength < keySize) { throw new Exception("Key 길이가 올바르지 않습니다."); } else { // 입력 받은 key string 길이가, 실제 암호화 할 대상 key 길이와 동일한 경우 System.arraycopy(b, 0, keyBytes, 0, keySize); } // AES 암호화는 IV 값으로 16 byte 사용 this.iv = key.substring(0, 16); // KeySpec 생성 시 입력하는 키 길이에 따라 AES-128,192,256 방식으로 자동 설정 됨 this.keySpec = new SecretKeySpec(keyBytes, "AES"); System.out.println("KEY : "+new String(keyBytes, "UTF-8")); System.out.println("IV : "+this.iv); }


JAVA 소스코드 역시 첨부하였으니 자세한 사용 방법은 코드를 확인 하시길..


5. 결과


<PHP 호출 결과>


99EF31385E86BA700F


<JAVA 호출 결과>


99EE483A5E86BA891F



6. 맺음


부디 본 글이 이 기종 연동 간에 서로가 원인을 못 찾아 허덕이는 이들을 구원해 주기를...



출처: https://ittravelkr.tistory.com/39 [성야넷™] 

첨부파일

  • AES.zip (3.6K) 48회 다운로드 | DATE : 2021-07-20 17:00:45

댓글목록

등록된 댓글이 없습니다.

전체 90
게시물 검색
PHP 목록
번호 제목 글쓴이 조회 날짜
90 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 56 10-09
89 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 56 10-09
88 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 62 10-08
87 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 66 09-03
86 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 83 07-26
85 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 71 07-26
84 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 75 07-07
83 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 66 07-07
82 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 87 06-15
81 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 124 04-23
80 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 1521 03-29
79 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 3916 03-26
78 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 1683 03-26
77 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 1508 03-17
76 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 2192 11-28
75 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 2399 08-11
74 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 2022 08-10
73 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 2650 08-02
열람중 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 2735 07-20
71 no_profile 운영자쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 1953 07-05