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

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


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.

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


  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일
최초 배포
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. 임성진 2013.03.21 10:40  댓글주소  수정/삭제  댓글쓰기

    해당 모듈은 서버에 닷넷 프레임 워크가 설치가 되어있어야 하나요?

    그리고 AES-256로 세팅하려면

    objEncrypter.KeyHashAlgorithm = "AES-256"

    이렇게 세팅하면 될까요?

    웹에서는 Base64로 인코딩 되면 자바 스크립트에서 다른게 인코딩한다고 하더라고요

    혹시 hex값으로 리턴하는 함수 구현에 대해서 말씀해주실 수 있을까요?

    • Favicon of https://blog.ryeol.com BlogIcon ryeol 2013.03.21 19:55 신고  댓글주소  수정/삭제

      안녕하세요. ^^

      C# 버전은 닷넷 프레임워크가 필요하지만 COM 버전 DLL 은 필요하지 않습니다.

      AES-256 으로 설정하시려면

      objEncrypter.KeyHashAlgorithm = "SHA2-256"

      이렇게 하시면 됩니다.

      HEX 출력은 현재 계획하고 있지 않습니다.

  2. 2013.05.12 02:20  댓글주소  수정/삭제  댓글쓰기

    모듈 "C:\Users\user\Desktop\RyeolStringEncrypter.dll" 을(를) 로드하지 못했습니다.
    바이너리가 지정된 경로에 저장되었는지 확인하거나 디버그하여 바이너리 또는 종속 .DLL 파일에 문제가 있는지 확인하십시오. 지정된 모듈을 찾을 수 없습니다.

    이런 오류가 뜨면서 dll 이 regsvr32 로 등록이 안되는데 어떻게 해야 하나요?

    • 아하 2013.05.12 02:47  댓글주소  수정/삭제

      아 재배포 패키지를 설치하니깐 되네요;;ㅎ
      그런데 텍스트 말고 특정한 파일 암호화 같은건 안되나요?

    • 2013.05.12 03:00  댓글주소  수정/삭제

      그리고 초기화 벡터가 뭔가요???

    • Favicon of https://blog.ryeol.com BlogIcon ryeol 2013.05.13 00:42 신고  댓글주소  수정/삭제

      안녕하세요. ^^

      파일 암호화는 지원하지 않습니다.

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

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

  3. 도와주세요 2013.09.08 09:32  댓글주소  수정/삭제  댓글쓰기

    64비트 Dll을 만드려고 여기저기 찾아보다가

    http://blog.daum.net/buruss/6441346

    위의 사이트를 보고 설정했는데요..

    위의 사이트를 보고 설정했는데요..

    32비트로 빌드하면 잘 되는데 이상하게 64비트로 설정하고 빌드하니까 링크하는데서 오류가 나는데 어떻게 64비트 Dll을 만드신 건가요??

    사용중인 OS 는 Win7 64비트입니다.



    1>------ 빌드 시작: 프로젝트: Test, 구성: Release x64 ------
    1>KeyLog.obj : error LNK2001: unresolved external symbol __security_check_cookie
    1>KeyLog.obj : error LNK2001: unresolved external symbol __imp_CreateFileA
    1>KeyLog.obj : error LNK2001: unresolved external symbol __imp_SetFilePointer
    1>KeyLog.obj : error LNK2001: unresolved external symbol __imp_WriteFile
    1>KeyLog.obj : error LNK2001: unresolved external symbol __imp_MapVirtualKeyExA
    1>KeyLog.obj : error LNK2001: unresolved external symbol __imp_GetAsyncKeyState
    1>KeyLog.obj : error LNK2001: unresolved external symbol __imp_GetKeyboardLayout
    1>KeyLog.obj : error LNK2001: unresolved external symbol __imp_DisableThreadLibraryCalls
    1>KeyLog.obj : error LNK2001: unresolved external symbol __imp_GetKeyNameTextA
    1>KeyLog.obj : error LNK2001: unresolved external symbol __imp_CloseHandle
    1>KeyLog.obj : error LNK2001: unresolved external symbol __imp_CreateThread
    1>LINK : error LNK2001: unresolved external symbol _DllMainCRTStartup
    1>C:\Users\User1\Documents\Visual Studio 2010\Projects\Test\x64\Release\Test.dll : fatal error LNK1120: 12 unresolved externals
    ========== 빌드: 성공 0, 실패 1, 최신 0, 생략 0 ==========

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

      Visual Studio 2012 Professional 에서 컴파일했고, 플랫폼을 x64 으로 하면 잘 됐던 걸로 기억하고 있습니다.

      링크 에러가 난 함수들이 Kernel32.dll 관련 함수들로 보이는데요.
      약간의 검색으로 Visual Studio 2010 기준으로 다음과 같은 해결책을 제시하는 내용을 찾아냈습니다.
      Kernel32.lib 를 64비트 버전으로 변경하는게 핵심같습니다.

      1. Project->Properties->Config Properties->General->Platform Toolset-> V100 설정
      2. Properties->VC++ Catalog->Library Catalog 를 $(WindowsSdkDir)lib\x64 로 설졍
      3. C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64 에 있는 Kernel32.lib 를 프로젝트 폴더에 복사 (답변글을 작성한 사용자의 프로젝트 폴더에 Kernel32.lib 가 있기때문에 복사했다고 함)
      4. Properties->Link->Input 에 Kernel32.lib 추가하고 msvcrt.lib 삭제

      출처:
      http://social.msdn.microsoft.com/Forums/vstudio/en-US/58f6e221-1b77-4c4c-b5d9-fca82d0ca7b3/about-error-lnk-2019-error-lnk2001

  4. flydog 2014.07.14 09:16  댓글주소  수정/삭제  댓글쓰기

    64비트 서버에 64비트용 dll 파일을 system32 폴더에 넣고 regsvr32로 등록을 했습니다.
    재배포 패키지도 설치를 했구요.
    그리고서 ASP로 만들어서 접속을 하니 "ActiveX 구성요소는 객체를 작성할 수 없습니다." 하고 오류가 나오더군요.
    설치된 dll의 등록정보에서 보안탭에서 everyone에 모든권한을 주고 해봤는데도 마찬가지네요...
    dll 이나 재배포 패키지를 설치하고, 서버를 리부팅하거나 iis를 재시작해줘야 하나요?
    아니면 무슨 문제가 있을까요?

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

      안녕하세요.
      해당 에러는 제가 찾아본 바로는 64비트 OS 에서 32비트 DLL 을 실행했을 때 에러 같은데요.
      일단 응용프로그램 풀에서 항목 선택 후 -> 고급 설정 -> 32비트 응용 프로그램 사용을 True 로 하고 테스트해 볼 필요가 있을거 같습니다.

  5. 라이언 2014.12.01 16:47  댓글주소  수정/삭제  댓글쓰기

    소스 잘 쓰고 있습니다.

    저도 flydog 님처럼 64비트 서버에 64비트 dll 을 D://dll/ 폴더에 넣고 regsvr32 로 등록하고 실행했더니

    Set objEncrypter = Server.CreateObject("Ryeol.StringEncrypter")

    이부분에서

    Microsoft VBScript 런타임 오류 오류 '800a01ad'
    ActiveX 구성 요소는 개체를 작성할 수 없습니다.

    이런 오류가 나네요.
    응용프로그램 풀 > 고급설정 > 32비트 응용 프로그램 사용은 True 로 되어있습니다.

    이전에 HyeongryeolStringEncrypter.dll 소스는 잘 쓰고 있었습니다.
    64비트로 서버를 변경하면서 64비트 지원 소스를 찾다보니 여기까지 왔는데요.
    등록은 되는데 실행이 안되네요.
    감사합니다

  6. 라이언 2014.12.01 17:29  댓글주소  수정/삭제  댓글쓰기

    왜 그런지 확인하였습니다.

    32비트 응용프로그램 사용을 True로 해 놓으면 64비트 응용프로그램의 createobject는 되지만 저런 오류가 뜨는거 같습니다.

    false로 하니까 잘 실행이 되네요.

    하지만 다른 32비트 dll 들이 사용이 안되서 실제 사이트에서는 다른 오류가 발생합니다.

    천상 32비트 dll 을 syswow64 에 있는 regsvr32 로 등록해서 써야할 거 같은데 그렇게 하니까 "지정된 모듈을 찾을 수 없습니다" 라고 나오네요.

    혹시 무슨 방법이 없을까요?

    부탁드려요.

    • Favicon of https://blog.ryeol.com BlogIcon ryeol 2014.12.06 20:26 신고  댓글주소  수정/삭제

      안녕하세요.

      RyeolStringEncrypter.dll 를 사용하시는 건가요? 그렇다면 Visual Studio 2012 용 Visual C++ 재배포 가능 패키지도 설치하셔야 합니다.

      64비트 OS에서 32 bit 버전 DLL을 사용하실 경우, C:\Windows\SysWOW64 에 복사하신 후 C:\Windows\SysWOW64\regsvr32 로 설치한 다음, 32비트 응용프로그램 사용을 True 로 하시면 동작할 거 같습니다.

  7. 차니 2015.02.03 21:01  댓글주소  수정/삭제  댓글쓰기

    초보자 여쭙니다.
    자바스크립트 소스가 있어 sha2-256값을 생성하였지만 웹 소스 보기로 string 값이 모두 보이는 까닭에
    다른 방법을 찾다가 우연히 이 글을 보게 되었습니다.
    사용 환경은 리눅스(centos 7.x) 에 php 사용중입니다.
    웹에서 string 일부만 넘기고 실제 sting 값의 대부분은 해쉬함수 생성 되는 별도 소스에 두고 싶습니다.
    그리고 여기서 만든 해쉬값과 다른 서버에서 만든 해쉬 값을 비교해서 같을 경우 실행 되도록 하고자 합니다.
    다른 서버에서의 해쉬 생성은 웹페이지에서 넘긴 일부 파라미터로 생성 됩니다.
    해쉬 값 생성을 위한 일부 파라미터만 넘겨서 해쉬 값을 생성 하려면 어떻게 하는 것이 좋을련지요?
    게시한 소스는 리눅스 + php에서도 가능할련지요? vs로 작성 된 거라?
    답변에 미리 감사드립니다.

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

      안녕하세요.

      말씀하신 내용을 제가 제대로 이해한 것인지는 모르겠지만, 일부값 해시와 전체값 해시 비교가 가능할지는 의문입니다.
      별로 도움이 되지 못해 죄송합니다.

  8. Favicon of https://kosaja.tistory.com BlogIcon KOSAJA 2016.10.28 10:05 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.
    공개 감사 드립니다.
    한가지 궁금한것이 있어서요.
    일단 asp에서 암호화 하고 복호화 하면 정상적으로 작동을 합니다.
    그런데 java에서 암호화 한값을 asp에서 공개하신 모듈로 복호화를 하면
    _GetActualSizeOfPkcs7: The padding size must be a number greater than 0 and less equal than the block size.
    이라는 오류가 나옵니다.

    이부분에 대한 조언좀 들을 수 있을까요..



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.
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST