StringEncrypter.zip

소스 관리의 편의 문제로 현재 주석은 영어로 작성되어 있습니다.
(ASP 와 ASP.NET 용 새 버전이 있습니다.)

ASP, ASP.NET 1.1/2.0, JSP, PHP 5 에서 사용할 수 있는 문자열 암호화 클래스를 만들어 봤습니다. 이 클래스들은 서로 호환되기 때문에 ASP에서 암호화한 문자열을 ASP.NET 에서 복호화하는 식으로 사용이 가능합니다. 이 클래스는 초기화 벡터는 문자열로 입력받습니다. 내부적으로 키와 초기화 벡터는 UTF-8으로 변환된 후, MD5로 해시됩니다.
키와 초기화 벡터의 변화

문자열 암호화는 Encrypt 메서드에서 수행합니다. 이 메서드는 먼저 입력 문자열을 UTF-8으로 변환한 후, PKCS7 패딩을 덧붙입니다. (JSP 버전에서는 PKCS5를 사용하지만, 블록 크기가 128비트일 경우에는 서로 호환됩니다.) 그 다음에 128-bit AES 알고리즘을 사용하여 CBC 모드로 암호화합니다. 암호화된 이진 데이터는 베이스64로 인코딩됩니다.
문자열 복호화에는 Decrypt 메서드를 사용합니다.
입력과 출력의 변화

다음 코드는 ASP.NET 1.1/2.0(C#)에서 문자열 암호화 클래스를 사용하는 예제입니다. StringEncrypter 클래스는 StringEncrypter.cs 파일에 구현되어 있습니다.
/*
 *  ASP.NET 1.1/2.0 (C#)
 */
using Hyeongryeol.Security.Cryptography ;
...
const string key = "암호화 비밀키입니다." ;
const string iv = "초기화 벡터입니다." ;

// 인스턴스 만들기.
StringEncrypter encrypter = new StringEncrypter (key, iv) ;

// 문자열 암호화.
string encrypted = encrypter.Encrypt ("테스트 문자열") ;

// 문자열 복호화.
string decrypted = encrypter.Decrypt (encrypted) ;
다음 코드는 ASP(VBScript)에서 문자열 암호화 클래스를 사용하는 예제입니다. ASP는 자체적으로 AES 알고리즘을 지원하지 않기 때문에, COM 컴포넌트인 HyeongryeolStringEncrypter.dll 파일을 regsvr32.exe 프로그램으로 먼저 설치해야 합니다. AES 알고리즘은 XySSL 0.8을 기반으로 합니다.
(설치는 %WINDOWS%System32 폴더에 할 것을 권장합니다.)
' 
'  ASP (VBScript)
' 
Const conKey = "암호화 비밀키입니다."
Const conIV = "초기화 벡터입니다."

' 인스턴스 만들기.
Set objEncrypter = Server.CreateObject ("Hyeongryeol.StringEncrypter")

objEncrypter.Key = conKey
objEncrypter.InitialVector = conIV

' 문자열 암호화.
strEncrypted = objEncrypter.Encrypt ("테스트 문자열")

' 문자열 복호화.
strDecrypted = objEncrypter.Decrypt (strEncrypted)
다음 코드는 JSP (자바)에서의 예제입니다. StringEncrypter 클래스는 StringEncrypter.java 파일에 구현되어 있습니다. 이 클래스를 사용하려면 Base64Encoder.java 파일도 있어야 합니다.
/*
 *  JSP (Java)
 */
import com.hyeongryeol.security.cryptography.*;
...
String key = "암호화 비밀키입니다.";
String iv = "초기화 벡터입니다.";

// 인스턴스 만들기.
StringEncrypter encrypter = new StringEncrypter(key, iv);

// 문자열 암호화.
String encrypted = encrypter.encrypt("테스트 문자열");

// 문자열 복호화.
String decrypted = encrypter.decrypt(encrypted);
다음 코드는 PHP 5에서의 예제입니다. StringEncrypter 클래스는 StringEncrypter.php 파일에 구현되어 있습니다. 이 클래스는 UTF-8 형식으로 저장된 파일에서만 사용할 수 있습니다. (클래스에서는 UTF-8 인코딩과 디코딩을 하지 않습니다.)
/*
 *  PHP 5 (UTF-8)
 */
require ("StringEncrypter.php") ;

define ("KEY", "암호화 비밀키입니다.") ;
define ("IV", "초기화 벡터입니다.") ;

// 인스턴스 만들기.
$encrypter = new StringEncrypter (KEY, IV) ;

// 문자열 암호화.
$encrypted = $encrypter->encrypt ("테스트 문자열") ;

// 문자열 복호화.
$decrypted = $encrypter->decrypt ($encrypted) ;

참고자료
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. 이전 댓글 더보기
  2. 질문 2009.12.18 16:42  댓글주소  수정/삭제  댓글쓰기

    windows2003 서버에서 regsvr32로 등록하려고 하니까 "지정된 모듈을 찾을 수 없습니다"라고 나오는데 해결책이 있을까요?? 경로는 제대로 해줬고, 다른 dll은 등록이 잘 되는듯해서요

    • Favicon of https://blog.ryeol.com BlogIcon ryeol 2009.12.19 16:51 신고  댓글주소  수정/삭제

      제가 클린 설치된 Windows Server 2003 Standard Edition 에 모든 업데이트를 완료한 상태에서 설치를 해 봤는데, 잘 되네요.
      혹시 %WINDOWS%system32 폴더에 MSVCR71.DLL, ATL.DLL 이 있는지 먼저 확인해 보시는게 좋을 듯 합니다.

  3. 비됴 2009.12.21 18:15  댓글주소  수정/삭제  댓글쓰기

    허억...몇일째 검색중이었는데....
    정말 감사합니다. 랭귀지 공통 암호화 모듈을 찾고있었는데...
    이렇게...고마울수가 정말정말 감사합니다.

  4. 궁금합니다.. 2010.04.02 17:47  댓글주소  수정/삭제  댓글쓰기

    64비트 환경인 2008 R2 에서도 되는지요?

  5. 박종영 2011.01.25 17:36  댓글주소  수정/삭제  댓글쓰기

    정말 좋은 자료네요..

    Java -> PHP, PHP -> Java 로 암호화 하는 내용이 필요했는데.. ㅎㅎ

    감사합니다.

  6. 이주현 2011.02.07 18:10  댓글주소  수정/삭제  댓글쓰기

    소스 오픈 감사드립니다. 저도 마침 업체들과 암호화 문제로 2주간 골머리를 썩고 있었는데요..
    이렇게 완성된 소스를 공개해주셔서 바로 이용 할수 있었습니다.
    바쁜 일정에 여유를 찾게 해주셔서 감사드립니다!

    새해 복 많이 받으세요^^

  7. yj-s123 2011.03.30 15:11  댓글주소  수정/삭제  댓글쓰기

    좋은 자료 감사드립니다~~

    Uncaught exception 'Exception' with message 'The padding size must be a number greater than 0 and less equal than the block size

    이런 에러는 왜 나는지 알고 싶습니다... 저는 배열로 받아와서 복호화를 하려고 하는데... 값의 사이즈가 크면 에러를 내더라구요... 조절할 수 있는 방법을 알고싶습니다....

  8. 김토니 2011.04.04 10:14  댓글주소  수정/삭제  댓글쓰기

    좋은 소스 공유 감사드립니다..
    저작권 관련해서는 문제 되는 부분은 없는지 문의 드립니다.

    감사합니다.

  9. 뽀인뜨 2012.07.06 18:43  댓글주소  수정/삭제  댓글쓰기

    좋은 소스를 오픈해 주셔서..
    감사하게 잘 사용하고 있습니다.

    한가지 여쭤볼께 있는데요..
    윈도우 서버 64비트도 지원 되는지 알고 싶습니다.

    32비트에서 잘 돌아가는 소스를 가지고,
    64비트로 옮겨서 테스트 해보면 다음과 같이 오류가 발생합니다.
    - 윈도우 2003 64비트 : 레지스트리에 등록 안됨
    - 윈도우 2008 64비트 : 32비트 호환모드로 하면 동작하나, 다른 64비트 모듈에서 오류 발생

    64비트 서버에서 사용할 수 있는 방법을 알고 싶습니다~ ^^
    감사합니다~

    • Favicon of https://blog.ryeol.com BlogIcon ryeol 2012.07.06 22:02 신고  댓글주소  수정/삭제

      안녕하세요. ^^

      제가 찾은 바로는 64비트에서 32비트 COM DLL 을 등록하려면 32비트 regsvr32 를 사용해야 한다고 합니다.
      windows\SysWOW64 에 있는 regsvr32 를 사용하면 된다고 합니다.

      출처:
      http://stackoverflow.com/questions/3439845/register-32-bit-com-dll-to-64-bit-windows-7

      대략 설치 방법은 dll 을 %WINDIR%SysWOW64 에 복사하신 후 위의 32비트 regsvr32 로 등록하시면 될 거 같습니다.
      그 다음 웹사이트 응용 프로그램 풀 -> 고급 설정 -> 32비트 응용 프로그램 사용을 True 로 하시면 될 거 같은데요.

      다른 64비트 모듈에서 오류가 발생한다면 암호화 부분만 따로 가상 디렉터리로 빼야 하지 않을까 생각합니다.

  10. goodman 2013.01.31 01:27  댓글주소  수정/삭제  댓글쓰기

    안녕하세요! 정말 좋은소스를 오픈해줘서 넘넘 감사합니다.

    제가 실력이 너무 딸리는 관계로요.... system32에 dll파일 등록은 잘했는데요

    비쥬얼베이직에서 dll파일을 찾아서 로드하려고 하니, 안된다고 나오네요!

    구굴링해보니, def파일밑에다가 vb_add 모 이런걸 넣어야 VB에서도 로드가 된다고 하는데

    도통 못하겠네요!

    비쥬얼베이직에서도 위 aes암호를 같이 쓸수는 없을까요?

    • Favicon of https://blog.ryeol.com BlogIcon ryeol 2013.01.31 23:38 신고  댓글주소  수정/삭제

      안녕하세요. ^^

      아마도 Visual Basic 6 에서 개발하시는것 같은데요.
      dll 은 COM dll 이기 때문에 먼저 regsvr32 로 등록하셔야 합니다.

      그 다음에 다음처럼 하면 될 거 같습니다.
      (VB 6 에서 테스트하지는 못했습니다.)

      Dim objEncrypter As Object
      Dim strEncrypted As String
      Dim strDecrypted As String

      Set objEncrypter = CreateObject("Hyeongryeol.StringEncrypter")

      objEncrypter.Key = "암호화 비밀키입니다."
      objEncrypter.InitialVector = "초기화 벡터입니다."

      strEncrypted = objEncrypter.Encrypt("테스트 문자열")
      strDecrypted = objEncrypter.Decrypt(strEncrypted)

      참고자료:
      http://binglongx.wordpress.com/2011/02/28/visual-basic-6-calling-activex/

  11. goodman 2013.02.05 14:01  댓글주소  수정/삭제  댓글쓰기

    감사합니다.
    암호화 잘 됩니다.

    좋은자료 주셔서 감사합니다.

    좋은일만 생기길 바랍니다. 꾸벅~

  12. 김태연 2013.02.13 09:55  댓글주소  수정/삭제  댓글쓰기

    고생해서 만든자료 공개해 주셔서 감사합니다.

    덕분에 많은 도움 됐습니다.

  13. 쩔어 2013.05.28 19:49  댓글주소  수정/삭제  댓글쓰기

    정말 좋은 자료 감사드리고요, 질문이 있어서 글을 드립니다.
    암호키와 초기화 벡터는 무엇을 의미하는것이고, 어떤값을 셋팅을 해야하나요?

    • Favicon of https://blog.ryeol.com BlogIcon ryeol 2013.05.29 01:32 신고  댓글주소  수정/삭제

      안녕하세요. ^^

      비밀키는 암호화와 복호화에 사용하는 데이터입니다.

      암호화된 데이터는 비밀키를 알고 있는 경우에만 복호화가 가능합니다.

      비밀키는 절대 외부로 노출시켜서는 안됩니다.

      누구도 짐작하기 힘든 은밀한 값을 사용하시면 됩니다.

      반면에 초기화벡터(Initialization vector) 는 난수화(Randomization) 을 높이기 위해 사용하는 값입니다.

      같은 비밀키로 여러 번 암호화할 경우 패턴이 노출되는 것을 방지할 목적으로 보통 임의 생성된 초기화벡터를 사용하여 암호화를 한 후 초기화벡터와 암호문을 같이 전송합니다.

      따라서 초기화벡터는 외부로 노출되고 임의의 값을 사용하는 경우가 많습니다.

  14. 초급개발자 2013.07.18 18:28  댓글주소  수정/삭제  댓글쓰기

    정말 감사합니다.

  15. Favicon of http://blog.naver.com/tohyjeon BlogIcon 감사합니다. 2013.07.27 23:56  댓글주소  수정/삭제  댓글쓰기

    정말 감사합니다. ASP 랑 PHP랑 호환되는 암호화 모듈을 만들생각을 하기 머리가 지끈지끈 아팠는데..
    여기서 해결하였습니다.
    고맙습니다.!!!!

  16. 감사할뿐 2013.10.02 20:16  댓글주소  수정/삭제  댓글쓰기

    좋은 자료 감사합니다. 많은 도움이 되었네요.

  17. 감사감사.. 2013.10.31 17:36  댓글주소  수정/삭제  댓글쓰기

    감사합니다. 문제 해결에 많은 도움이 되었습니다.

  18. BlogIcon 김멍멍 2014.08.28 17:05  댓글주소  수정/삭제  댓글쓰기

    먼저 좋은자료 감사드립니다.
    한기지 질문이 있는데 PHP에서 사용하기위해서는 Mcrypt를 설치해야 사용이 가능한것인가요? 인스턴스 생성후에 함수호출하면 에러가 발생합니다...

  19. 이창기 2015.01.17 22:27  댓글주소  수정/삭제  댓글쓰기

    안녕하세요
    뭐좀 물어보려고 하는데요
    지금 개편준비하는 사이트가 여기 공개된 소스를 이용해서 암호화를 한듯 싶습니다.
    기존 사이트는 PHP이고 소스를 보니 동일한것 같습니다.
    개편준비하는 사이트는 jsp이고요 데이터 이관을 하려고 보니 여기 암호화 모듈을 이용한듯 한데 복호화를 어떻게 해야할지 난감해서요...
    단지 php 파일
    //const STRENCRYPTER_BLOCK_SIZE = 16; // 16 bytes
    const STRENCRYPTER_BLOCK_SIZE = 64; // 64 bytes
    이렇게 기존16을 64로 변경한듯 하고요.
    저렇게 변경된 모듈을 java파일을 받아서 복호화를 해보니 에러만 나네요 java에서 도 복호화를 하기위해서 어디를 바꿔줘야 할까요?
    답변기다릴게요.... ㅠㅠ


    • Favicon of https://blog.ryeol.com BlogIcon ryeol 2015.02.09 07:56 신고  댓글주소  수정/삭제

      안녕하세요. ^^

      최근 바쁜 일로 댓글을 지금 봤습니다.
      아마도 이미 답을 찾으셨겠지만, 답글을 달아봅니다.

      블록크기가 64 바이트인 PKCS7 패딩이 사용된 듯 싶은데요
      다음과 같은 작업을 하는 커스텀 클래스를 만드셔야 할 거 같습니다:

      1. PHP 에서 암호화된 문자열을 BASE 64 디코딩
      2. 128 bit CBC 모드 AES 복호화
      3. 블록크기가 64 바이트인 PKCS7 패딩 제거
      4. UTF-8 디코딩

      자바는 제가 손을 놓은지 오래되서 상세한 구현을 설명드리기 어려운 점 양해 부탁드립니다.

  20. 감사합니다 2015.07.07 16:50  댓글주소  수정/삭제  댓글쓰기

    우선 좋은 소스 공개해주셔서 감사합니다. :-)
    작업하다가 궁금한 점이 생겨서요 (ASP에서 사용예정입니다.)

    기존 일반내용에서 이제 암호화된 값으로 변경을 하는데, 해당 내용이 암호화가 되어있는 값인지 아닌지 체크할 수 있는 방법이 있을까요? (동일한 키, 벡터값은 존재하고 알고 있다는 조건하에요.)

    즉 A라는 데이터컬럼에서

    1행은 암호화가 되어서 "aslkj12aslkj" 형태로 나와있고
    2행은 암호화가 안된 데이터라 "가나다라" 형태로 나와있는데

    한행씩 루프로 안된 내용들만 변경하려고 하려고 하면 체크할 수 있는 방법이 있을까요?
    (기존 데이터에서 어떤 녀석들은 암호화가 되어있고 어느녀석들은 안되어 있고 섞여 있어서요..ㅠ.ㅠ)

    다시한번 좋은 소스 공개에 감사드립니다. (덕분에 암호화 관련되어 주고 받는 쪽이 손쉽게 풀렸습니다 :-) )

  21. 64비트안됨 2016.04.05 17:58  댓글주소  수정/삭제  댓글쓰기

    33