2013-03-28 3 views
-2

저는 해시를 생성하고 암호화를 사용하는 완전한 Python 코드를 작성했습니다. 이것은 MS-CHAPV2 GenerateNTResponse() 메서드의 구현이므로 SHA1, MD4DES을 사용합니다.Python 해싱 + DES : PyCuda로 마이그레이션

나는 거의 10000000 개의 해시를 처리해야하므로 CUDA를 사용하여 속도를 향상시킬 방법을 찾고있었습니다.

순수 파이썬 버전은 모든 해시의 90 % 정도를 생성하는 데 2 ​​시간 정도 걸립니다.

이제 문제는 : Python 코드를 재사용하고 PyCuda에 적용 할 수 있습니까?

필자는 어떤 종류의 정보도 발견하지 못 했으므로 일부 예제에 따라 PyCuda의 SourceModule을 사용하여 C에서 수행하려고합니다.

kernel.cu(7): error: calling a host function("SHA1_Init") from a __device__/__ global__ function("operator ") is not allowed 

그래서, 내가 아는 한, __device__ 선언 함수 만이 SourceModule에서 사용할 수 있습니다

그러나 여기에는 또 다른 문제가 온다.

하지만 openssl/sha.h 기능으로 어떻게해야합니까?

가 여기에 내가 PyCuda

짧은 대답은
import pycuda.driver as drv 
import pycuda.autoinit 
from pycuda.compiler import SourceModule 

from pycuda.elementwise import ElementwiseKernel 
mod = SourceModule(
        ''' 
        #include <openssl/sha.h> 
        __global__ void _challengeHash(char* peer_challenge, char* server_challenge, char* username, char* hashResult){ 
         // Object to hold the current state of the hash 
         SHA_CTX ctx; 
         SHA1_Init(&ctx); 
         SHA1_Update(&ctx, peer_challenge, 16); 
         SHA1_Update(&ctx, server_challenge, 16); 
         SHA1_Update(&ctx, username, strlen(username)); 
         unsigned char hash[SHA_DIGEST_LENGTH]; 
         SHA1_Final(hash, &ctx); 
         memcpy(hash, hashResult, SHA_DIGEST_LENGTH); 
        } 
        ''', include_dirs=['/usr/include/']) 
sha1 = mod.get_function("_challengeHash") 
hash = "" 
sha1(drv.In("\x41\x13\xAB\xC5\x45\x31\x2E\x8F\x68\x11\x19\x3B\x0D\x18\x1B\xBD"), drv.In("\x5A\x05\x70\x5D\xC2\x5C\xA1\x51\x23\xC8\xE4\x75\x0B\x80\xD0\xA9"), drv.In("a"), drv.Out(hash)) 
print hash 

답변

0

와 SHA1을 계산하는 데 사용하고 간단한 테스트 코드, 당신은하지 않습니다. GPU 코드에서 OpenSSL 라이브러리의 호스트 함수를 사용할 수 없습니다. 먼저 전체 라이브러리를 GPU에 이식해야합니다.

그러나 CUDA 가속화 해싱 코드는 검색하는 데 신경 쓰면 사용할 수 있습니다. 유명해진 Daniel Bernstein과 네덜란드 연구자 그룹은 유명한 CUDA 가속 SHA1 해더를 Engineyard가 후원하는 해쉬 브레이크 경쟁에서 이기기 위해 유명하게 유명했습니다.

+0

실제로 나는 소스가없는 도구를 찾아서 나를 도울 수 없습니다. 당신이 말하는 코드는 단지 SHA1이지만, DES와 MD4도 작동해야합니다. (CUDA5.0 툴킷을 사용하면 컴파일되지 않으며 cutil.h도 없습니다. – StepTNT