RyeolStringHasher.zip

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

간단한 문자열 해시 라이브러리입니다. COM (32/64 비트) 과 C# 으로 구현되어 있습니다.

입력 문자열은 UTF-8 으로 변환된 후 MD5SHA2-256 과 같은 해시 알고리즘으로 해시됩니다. 해시된 바이너리는 Base64로 인코딩됩니다.

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

/*
 *  C#
 */
using Ryeol.Security.Cryptography;
...

// 인스턴스 만들기.
StringHasher hasher = new StringHasher();

// 해시 알고리즘 설정.
// MD5, SHA1, SHA2-256, SHA2-384, SHA2-512 가 지원됩니다.
hasher.Algorithm = StringHasherAlgorithm.SHA2_256;

// 문자열 해시
string hashed = hasher.Compute("Test sample");


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

'
'  ASP (VBScript)
' 
' 인스턴스 만들기.
Set objHasher = Server.CreateObject("Ryeol.StringHasher")

' 해시 알고리즘 설정.
' MD2, MD4, MD5, SHA1, SHA2-224, SHA2-256, SHA2-384, SHA2-512 가 지원됩니다.
objHasher.Algorithm = "SHA2-256"

' 문자열 해시
strHashed = objHasher.Compute("Test sample")



릴리즈 노트

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

2012년 12월 10일
최초 배포

신고

RyeolStringHasher.zip


This is simple libraries that compute hash from a string. It is implemented in COM (32/64 bits) and C#.

The input string is converted into UTF-8, and then is hashed by a hash algorithm such as MD5, SHA2-256, etc. The hashed binary is encoded by Base64.

The following code is an example of using the string hasher in C#. The StringHasher class is implemented in the StringHasher.cs file.

/*
 *  C#
 */
using Ryeol.Security.Cryptography;
...

// Creates an instance.
StringHasher hasher = new StringHasher();

// Sets the hash algorithm.
// MD5, SHA1, SHA2-256, SHA2-384, SHA2-512 are supported.
hasher.Algorithm = StringHasherAlgorithm.SHA2_256;

// Hashs a string.
string hashed = hasher.Compute("Test sample");


The following code shows how to use the string hasher in ASP(VBScript). Since ASP doesn't support built-in hash algorithm, you need to install the RyeolStringHasher.dll file which is a COM dll based on XySSL 0.8.
(You also need to install the Visual C++ Redistributable for Visual Studio 2012.)

'
'  ASP (VBScript)
' 
' Creates an instance.
Set objHasher = Server.CreateObject("Ryeol.StringHasher")

' Sets the hash algorithm.
' MD2, MD4, MD5, SHA1, SHA2-224, SHA2-256, SHA2-384, SHA2-512 are supported.
objHasher.Algorithm = "SHA2-256"

' Hashs a string.
strHashed = objHasher.Compute("Test sample")



Release Note

June 7, 2013
The C# StringHasher has changed to create a hash implementation by using the Create method to support Windows XP.

December 10, 2012
Initial release.

신고

  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일
최초 배포
신고

RyeolStringEncrypter.zip

This is new string encrypters that is the upgrade of the previous string encrypters to support AES-256. Though PHP and Java are not available, you can download a COM dll (32/64 bit) and a C# class.

The string encrypters take two strings, a key and an initialization vector. To be used as an AES key, the key string is converted into UTF-8, and then is hashed by MD5 or SHA2-256.

Similarly, the IV is hashed by MD5.

The input string is converted into UTF-8, and then is encrypted using 128-bits or 256-bits AES in Cipher Block Chaining(CBC) with PKCS7 padding. The AES key size depends on the size of the hash for the key string. For example, if the hash is SHA2-256, 256-bits AES is used. Base64 is used for the encrypted binary.

The following code is an example of using the string encrypter in C#. The StringEncrypter class is implemented in the StringEncrypter.cs file.

/*
 *  C#
 */
using Ryeol.Security.Cryptography;
...
const string key = "This is a secret key.";
const string iv = "This is an initialization vector.";

// Creates an instance.
StringEncrypter encrypter = new StringEncrypter(key, iv);

// Sets the key hash algorithm. MD5 and SHA2-256 are supported.
// In this case the hash size is 256 bits, AES-256 is used.
encrypter.KeyHashAlgorithm = StringEncrypterKeyHashAlgorithm.SHA2_256;

// Encrypts a string.
string encrypted = encrypter.Encrypt("Test sample");

// Decrypts the encrypted string.
string decrypted = encrypter.Decrypt(encrypted);

The following code shows how to use the string encrypter in ASP(VBScript). Since ASP doesn't support built-in AES algorithm, you need to install the RyeolStringEncrypter.dll file which is a COM dll based on XySSL 0.8.
(You also need to install the Visual C++ Redistributable for Visual Studio 2012.)
'
'  ASP (VBScript)
' 
Const conKey = "This is a secret key."
Const conIV = "This is an initialization vector."

' Creates an instance.
Set objEncrypter = Server.CreateObject("Ryeol.StringEncrypter")

objEncrypter.Key = conKey
objEncrypter.IV = conIV

' Sets the key hash algorithm. MD5 and SHA2-256 are supported.
' In this case the hash size is 256 bits, AES-256 is used.
objEncrypter.KeyHashAlgorithm = "SHA2-256"

' Encrypts a string.
strEncrypted = objEncrypter.Encrypt("Test sample")

' Decrypts the encrypted string.
strDecrypted = objEncrypter.Decrypt(strEncrypted)



Release Note

June 7, 2013
The C# StringEncrypter has changed to create a hash implementation by using the Create method to support Windows XP.

December 10, 2012
Initial release.
신고

이 문서는 여러 사이트에서 인증 정보를 간단하게 공유하는 방법을 설명하고 있습니다. 만약 협력 관계에 있는 다른 사이트와 로그인 정보 등을 간단하고 안전하게 공유해야 한다면, 이 문서의 내용이 조금은 도움이 될 거 같습니다.
예제는 ASP, ASP.NET 1.1, ASP.NET 2.0, JSP, PHP 5 용으로 총 5개가 작성되었으며, 문서는 워드 2003으로 작성되었습니다.

참고로 암호화를 할 때 임의 문자열(salt)과 클라이언트 IP를 덧붙이고, 복호화 후 클라이언트 IP 검사를 추가하면 보안성을 더 높일 수 있습니다.

신고

UrlEncoder.zip

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


ASPURL 디코딩하는 기능이 없어서, 제가 예전에 작성했던 CHttpClient를 기반으로 URL을 인코딩하고 디코딩할 수 있는 COM 컴포넌트를 만들어 봤습니다. 이 컴포넌트를 사용하려면 HyeongryeolUrlEncoder.dll을 설치하신 후, regsvr32.exe 프로그램으로 등록하시면 됩니다. (설치는 %WINDOWS%System32 폴더에 할 것을 권장합니다.)

다음은 ASP에서 컴포넌트를 사용하는 예제 코드입니다.
Set objEncoder = Server.CreateObject ("Hyeongryeol.UrlEncoder")
objEncoder.CodePage = Response.CodePage

strEncoded = objEncoder.Encode ("테스트 샘플")
strDecoded = objEncoder.Decode (strEncoded)
또한 위의 코드에서 보듯이, 이 컴포넌트는 코드 페이지 속성을 지원하는데, 이를 사용하면 UTF-8 사이트와 ANSI 한국어 사이트 사이에 서로 쿼리 스트링을 주고 받을 수 있습니다. 기본 코드 페이지는 CP_ACP입니다.

다음 두 개의 ASP 페이지는 UTF-8 사이트와 ANSI 한국어 사이트가 서로 쿼리 스트링을 주고 받는 예제입니다.
<%@ Language="VBScript" CodePage="65001" %>
<%
'
' 유니코드 사이트 (UTF-8, http://sitea/url.asp)
'
%>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>http://sitea/url.asp</title>
</head>
<body>
    전달된 문자열: <%=Request.QueryString ("passed")%><br />
    <br />

<%
    Set objEncoder = Server.CreateObject ("Hyeongryeol.UrlEncoder")
    objEncoder.CodePage = 949   ' 한국어 코드페이지로 설정.
%>

    <a href="http://siteb/url.asp?passed=<%=objEncoder.Encode ("테스트 한국어")%>">
        한국어 ANSI 문자열로 인코딩된 쿼리 스트링을 B 사이트에 전달하기.
    </a>
</body>
</html>
<%@ Language="VBScript" CodePage="949" %>
<%
'
' ANSI 사이트 (한국어, http://siteb/url.asp)
'
%>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
    <title>http://siteb/url.asp</title>
</head>
<body>
    전달된 문자열: <%=Request.QueryString ("passed")%><br />
    <br />

<%
    Set objEncoder = Server.CreateObject ("Hyeongryeol.UrlEncoder")
    objEncoder.CodePage = 65001   ' UTF-8 코드페이지로 설정.
%>

    <a href="http://sitea/url.asp?passed=<%=objEncoder.Encode ("테스트 한국어")%>">
        UTF-8 문자열로 인코딩된 쿼리 스트링을 A 사이트에 전달하기.
    </a>
</body>
</html>
신고


한국어로 보기
This is a simple COM component for the URL encoding. It is based on the CHttpClient. The major reason to write this component is the lack of capability to decode a URL encoded string in ASP. It supports URL encoding and decoding. If you want to use this component, you have to install HyeongryeolUrlEncoder.dll and register it by using the regsvr32.exe program.
(I recommend you to install it in the %WINDOWS%System32 folder.)

You can use this component as the following code in ASP.
Set objEncoder = Server.CreateObject ("Hyeongryeol.UrlEncoder")
objEncoder.CodePage = Response.CodePage

strEncoded = objEncoder.Encode ("Test sample")
strDecoded = objEncoder.Decode (strEncoded)
As you can see in the above code, you can also specify a code page property. It is useful if you have to send a query string to an another site in a different code page. The default code page is CP_ACP.

The following two ASP pages show how to communicate between an UTF-8 site and an ANSI site(korean) through a query string.
<%@ Language="VBScript" CodePage="65001" %>
<%
'
' An unicode site (UTF-8, http://sitea/url.asp)
'
%>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>http://sitea/url.asp</title>
</head>
<body>
    A passed string: <%=Request.QueryString ("passed")%><br />
    <br />

<%
    Set objEncoder = Server.CreateObject ("Hyeongryeol.UrlEncoder")
    objEncoder.CodePage = 949   ' Set the korean code page.
%>

    <a href="http://siteb/url.asp?passed=<%=objEncoder.Encode ("테스트 한국어")%>">
        Go Site B with an URL encoded korean ANSI string.
    </a>
</body>
</html>
<%@ Language="VBScript" CodePage="949" %>
<%
'
' An ANSI site (korean, http://siteb/url.asp)
'
%>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
    <title>http://siteb/url.asp</title>
</head>
<body>
    A passed string: <%=Request.QueryString ("passed")%><br />
    <br />

<%
    Set objEncoder = Server.CreateObject ("Hyeongryeol.UrlEncoder")
    objEncoder.CodePage = 65001   ' Set the UTF-8 code page.
%>

    <a href="http://sitea/url.asp?passed=<%=objEncoder.Encode ("테스트 한국어")%>">
        Go Site A with an URL encoded UTF-8 unicode string.
    </a>
</body>
</html>
신고

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

참고자료
신고

StringEncrypter.zip

A new version is available for ASP and ASP.NET.

I've written string encrypters for ASP, ASP.NET 1.1/2.0, JSP and PHP 5 respectivly, which are interoperable with each other.
The encrypters take two strings, a key and an initial vector. The key and the initial vector are internally converted into UTF-8 and hashed by MD5.

Transition of key and initial vector

String encryption is carried out by using Encrypt method, which first converts the input string into UTF-8 and encodes it according to the PKCS7 padding algorithm (except JSP that uses PKCS5, but it is compatible if the block size is 128bit.) and encrypts it with 128-bit AES algorithm in Cipher Block Chaining(CBC). The encrypted binary is encoded by Base64.
Decrypt method decrypts the encrypted string.
Transition of input and output

The following code is an example of using the string encrypter in ASP.NET 1.1/2.0(C#). The StringEncrypter class is implemented in StringEncrypter.cs.
/*
 *  ASP.NET 1.1/2.0 (C#)
 */
using Hyeongryeol.Security.Cryptography ;
...
const string key = "This is a secret key." ;
const string iv = "This is an initial vector." ;

// Create an instance.
StringEncrypter encrypter = new StringEncrypter (key, iv) ;

// Encrypt a string.
string encrypted = encrypter.Encrypt ("Test sample") ;

// Decrypt a string.
string decrypted = encrypter.Decrypt (encrypted) ;
The following code shows how to use the string encrypter in ASP(VBScript). Since ASP doesn't support built-in AES algorithm, you need to install HyeongryeolStringEncrypter.dll which is a COM component based on XySSL 0.8. You have to register it by using the regsvr32.exe program.
(I recommend you to install it in the %WINDOWS%System32 folder.)
' 
'  ASP (VBScript)
' 
Const conKey = "This is a secret key."
Const conIV = "This is an initial vector."

' Create an instance.
Set objEncrypter = Server.CreateObject ("Hyeongryeol.StringEncrypter")

objEncrypter.Key = conKey
objEncrypter.InitialVector = conIV

' Encrypt a string.
strEncrypted = objEncrypter.Encrypt ("Test sample")

' Decrypt a string.
strDecrypted = objEncrypter.Decrypt (strEncrypted)
The following code is an example in JSP (Java). The StringEncrypter class is implemented in StringEncrypter.java which also requires Base64Encoder.java.
/*
 *  JSP (Java)
 */
import com.hyeongryeol.security.cryptography.*;
...
String key = "This is a secret key.";
String iv = "This is an initial vector.";

// Create an instance.
StringEncrypter encrypter = new StringEncrypter(key, iv);

// Encrypt a string.
String encrypted = encrypter.encrypt("Test sample");

// Decrypt a string.
String decrypted = encrypter.decrypt(encrypted);
The following code is an example in PHP 5. The StringEncrypter class is implemented in StringEncrypter.php. It can only be used in a UTF-8 encoded file because UTF-8 encoding and decoding are omitted.
/*
 *  PHP 5 (UTF-8)
 */
require ("StringEncrypter.php") ;

define ("KEY", "This is a secret key.") ;
define ("IV", "This is an initial vector.") ;

// Create an instance.
$encrypter = new StringEncrypter (KEY, IV) ;

// Encrypt a string.
$encrypted = $encrypter->encrypt ("Test sample") ;

// Decrypt a string.
$decrypted = $encrypter->decrypt ($encrypted) ;

References
신고

티스토리 툴바