RyeolStringEncrypter.zip
소스 관리의 편의 문제로 현재 주석은 영문으로 작성되어 있습니다. 

예전에 작성했던 StringEncrypterAES-256 암호화 기능을 추가한 새로운 버전을 만들어 봤습니다. 현재는 COM dll (32/64 비트)과 C# 클래스만 지원하며, PHP자바는 지원하지 않습니다.

StringEncrypter 는 초기화 벡터를 문자열로 입력받습니다. AES 는 키에 문자열을 사용할 수 없기 때문에, 키 문자열을 UTF-8 으로 변환한 후 MD5 또는 SHA2-256 으로 해시합니다.

마찬가지로 초기화 벡터 문자열 역시 AES 에 바로 사용할 수 없기 때문에 MD5 로 해시됩니다.

입력 문자열은 UTF-8 으로 변환된 후 CBC 모드와 PKCS7 패딩을 사용하는 128 비트 또는 256 비트 AES로 암호화됩니다. AES 키 크기는 키 문자열을 해시하는데 사용된 해시 알고리즘의 크기에 따라 결정됩니다. 예를 들어 키 해시 알고리즘이 SHA2-256 이면, 256 비트 AES 암호화가 사용됩니다. 암호화된 바이너리는 Base64로 인코딩됩니다.

다음은 C# 버전 StringEncrypter 를 사용하는 예제입니다. StringEncrypter 클래스는 StringEncrypter.cs 파일에 구현되어 있습니다.

/*
 *  C#
 */
using Ryeol.Security.Cryptography;
...
const string key = "암호화 비밀키입니다.";
const string iv = "초기화 벡터입니다.";

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

// 키 해시 알고리즘 설정. MD5 와 SHA2-256 을 지원합니다.
// 아래 코드는 해시 크기가 256 비트이기 때문에, AES-256 이 사용됩니다.
encrypter.KeyHashAlgorithm = StringEncrypterKeyHashAlgorithm.SHA2_256;

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

// 문자열 복호화
string decrypted = encrypter.Decrypt(encrypted);


다음 코드는 ASP(VBScript) 에서 StringEncrypter 를 사용하는 모습입니다. ASP 는 자체적으로 AES 를 지원하지 않기 때문에 XySSL 0.8 기반의 COM 인 RyeolStringEncrypter.dll 파일을 설치해야 합니다.
(Visual Studio 2012 용 Visual C++ 재배포 가능 패키지도 설치해야 합니다.)

'
'  ASP (VBScript)
' 
Const conKey = "암호화 비밀키입니다."
Const conIV = "초기화 벡터입니다."

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

objEncrypter.Key = conKey
objEncrypter.IV = conIV

' 키 해시 알고리즘 설정. MD5 와 SHA2-256 을 지원합니다.
' 아래 코드는 해시 크기가 256 비트이기 때문에, AES-256 이 사용됩니다.
objEncrypter.KeyHashAlgorithm = "SHA2-256"

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

' 문자열 복호화
strDecrypted = objEncrypter.Decrypt(strEncrypted)



릴리즈 노트

2013년 6월 7일
Windows XP 지원을 위해 StringEncrypter.cs 에서 해시 구현 생성 시 Create 메서드를 사용하도록 수정되었습니다.

2012년 12월 10일
최초 배포
신고

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) ;

참고자료
신고

티스토리 툴바