2011년 8월 29일 월요일

JAVA - PHP 간 AES encryption 데이터 송수신에서 패딩으로 망하기

자바에서 encryption한 데이터를 php로 전달했을 때 패딩에 의해서 문제가 생길 수 있다.

AES 등의 암호화 알고리듬은 데이터를 특정 사이즈의 블록 단위로 암호화한다. 예를 들어서 블록의 사이즈가 32kb인데 암호화하려는 스트링은 50kb라면, 32kb * 2 = 64kb를 맞추도록 뒷부분을 패딩으로 채워넣는다.

이 패딩 방식이 php는 null 패딩이며, 자바의 경우에는 몇 가지 패딩 방식을 지원하지만 php의 null 패딩은 포함되지 않는다. 결론은


1. 자바에서 직접 null padding을 구현하거나
2. php에서 PKCS5 패딩을 제거하거나.


1의 경우에 사용 알고리듬에 따라서 사이즈가 딱 맞는 블록을 어레이로 선언하고 나머지를 null값으로 채워주면 되겠고, 후자의 경우에

<?php
$decrypted = mdecrypt_generic($td, base64_decode($enc_auth_token));
$dec_s = strlen($decrypted);
$padding = ord($decrypted[$dec_s-1]);
$decrypted = substr($decrypted, 0, -$padding);
?>


처럼 처리해 주면 될 것이다.

댓글 없음:

댓글 쓰기