2010-12-15 4 views
7

마지막 편집 : 문제가 무엇인지 알아 냈습니다. (내 대답은 아래를 참조하십시오.)하지만 대답은 대답으로 표시 할 수 없습니다. 누군가가 내가 아래 답변에있는 질문에 대답 할 수 있다면, Cython의 버그이거나 Cython의 의도 된 동작입니까? 대답으로 표시합니다. 그 이유는 이것이 가장 유용한 교훈이 될 수 있기 때문입니다. , IMHO.데이터 손상 : 버그가있는 곳


첫째, 나는 사흘 동안이 문제를 알아 내기 위해 노력 해왔다, 난 그냥 벽에 내 머리를 두드리는 오전 말로 시작해야합니다. 나는 문서에서 알 수있는 한 최선을 다하고 있습니다. 분명히, 나는 정확하게 일을 할 수는 없지만, 만약 그렇다면 나는 문제가 없기 때문에 (맞습니까?).

필자는 mcrypt를 파이썬에 바인딩하기 위해 노력하고 있습니다. Python 2와 Python 3 모두에서 작동해야합니다 (Python 2에서는 테스트되지 않았습니다). 그것은 on my site이 가능합니다. 링크가 너무 커서 게시글에 포함 할 수 없기 때문에 내가 알지 못하지만 무엇을하고 있습니까? 내가 잘못하고 있습니다. 문제 코드가 무엇인지 파악할 수 없습니다. 문제를 나타내는 스크립트는 also on my site입니다. 이 스크립트는 문자 "a"(암호화 알고리즘/암호화 모드가 사용하는 블록 크기에 관계없이) 만 100 블록을 제공하며 물론 라운드 트립의 결과로 "a"블록을 가져와야합니다. 하지만 항상 그렇지는 않습니다.

Wed Dec 15 10:35:44 EST 2010 
test.py:5: McryptSecurityWarning: get_key() is not recommended 
    return ''.join(['{:02x}'.format(x) for x in o.get_key()]) 

key: b'\x01ez\xd5\xa9\xf9\x1f)\xa0G\xd2\xf2Z\xfc{\x7fn\x02?,\x08\x1c\xc8\x03\x061X\xb5\xc9\x99\xd0\xca' 
key: b'\x01ez\xd5\xa9\xf9\x1f)\xa0G\xd2\xf2Z\xfc{\x7fn\x02?,\x08\x1c\xc8\x03\x061X\xb5\xc9\x99\xd0\xca' 
16 
self test result: 0 
enc parameters: {'salt': '6162636465666768', 'mode': 'cbc', 'algorithm': 'rijndael-128', 'iv': '61626364616263646162636461626364'} 
dec parameters: {'salt': '6162636465666768', 'mode': 'cbc', 'algorithm': 'rijndael-128', 'iv': '61626364616263646162636461626364'} 
enc key: 01657ad5a9f91f29a047d2f25afc7b7f6e023f2c081cc803063158b5c999d0ca 
dec key: 01657ad5a9f91f29a047d2f25afc7b7f6e023f2c081cc803063158b5c999d0ca 
Stats: 88/100 good packets (88.0%) 

#5: b'aaaaaaaaaaaaaaaa' != b'\xa6\xb8\xf9\td\x8db\xf6\x00Y"ST\xc6\x9b\xe7' 
#6: b'aaaaaaaaaaaaaaaa' != b'aaaaaaa1\[email protected]\x8d\xff\xf9\xafpy' 
#13: b'aaaaaaaaaaaaaaaa' != b'\xb9\xc8\xaf\x1f\xb8\x8c\x0b_\x15s\x9d\xecN,*w' 
#14: b'aaaaaaaaaaaaaaaa' != b'aaaaaaaaaaaaa\xeb?\x13' 
#49: b'aaaaaaaaaaaaaaaa' != b'_C\xf2\x15\xd5k\xe1XKIF5k\x82\xa4\xec' 
#50: b'aaaaaaaaaaaaaaaa' != b'aaaaaaaaaaa+\xdf>\x01\xee' 
#74: b'aaaaaaaaaaaaaaaa' != b'\x1c\xdf0\x05\xc7\x0b\xe9\x93H\xc5B\xd7\xcfj+\x03' 
#75: b'aaaaaaaaaaaaaaaa' != b'aaaaaaaaaaaaw+\xed\x0f' 
#79: b'aaaaaaaaaaaaaaaa' != b"\xf2\x89\x1ct\xe1\xeeBWo\xb4-\xb9\x085'\xef" 
#80: b'aaaaaaaaaaaaaaaa' != b'aaaaaaaaaaa\xcc\x01n\xf0<' 
#91: b'aaaaaaaaaaaaaaaa' != b'g\x02\x08\xbf\xa5\xd7\x90\xc1\x84D\xf3\x9d$a)\x06' 
#92: b'aaaaaaaaaaaaaaaa' != b'aaaaaaaaaaaaaaa\x01' 

이상한 부분이 정확히 주어진 (알고리즘 모드) 쌍에 대해 동일하다는 것이다 : 여기 단일 실행로부터 출력된다. 나는 알고리즘을 바꿀 수 있고 다른 왕복 여행을하게 될 것이지만 항상 알고리즘을 변경하지 않을 때마다 똑같이 실행됩니다. 나는 절대적으로 곤란하다. 또한, 위의 출력에서 ​​볼 수 있듯이 항상 손상된 행의 두 블록 : 블록 5와 6, 13 및 14 등. 따라서 패턴이 있지만 어떤 이유로 든 알아낼 수 없습니다. 그 패턴이 정확히 무엇을 가리키고 있는지.

저는 여기에 많은 것을 묻습니다 : 나는 작은 코드 조각을 분리 할 수 ​​없으며 mcrypt와 Python에 익숙해야 할 것 같습니다. 아아,이 일에 머리를 쓰다가 3 일이 지난 후에 나는이 문제에서 조금 벗어나야 할 필요가있다. 그래서 나는이 문제에서 벗어나기를 원할 때 여기에 이것을 올리고있다. (a) 누군가 (b) 내가 나중에 문제로 돌아 왔을 때 내 버그를 볼 수 있거나 (c) 내 코드에서 버그가 아닌 문제를 누군가 또는 자신이 발견 할 수 있지만 바인딩 프로세스 또는 라이브러리 자체의 버그

내가하지 않은 한 가지는 mcrypt 라이브러리의 다른 버전을 사용하려고 시도한 것입니다. 저는 Cython 0.13, Python 3.1 및 mcrypt 2.5.8로 작업하고 있습니다. 우분투 10.10에서 우분투에 의해 배포되었습니다 (파이썬에서 얻은 Cython 제외). 하지만 우분투 10.10에서 데이터 손상없이 mcrypt를 사용하는 PHP 응용 프로그램으로 시스템을 관리합니다. 따라서 mcrypt의 빌드라고 믿을만한 이유가 없습니다. 그래서 그냥 나뭇잎 ... 음, 어딘가에서 내 문제가 있습니다. , 나는 생각한다.

어쨌든 나는 도울 수있는 누구에게나 감사한다. 며칠 동안이 문제를 거의 직면 해 왔기 때문에 나는 미쳐 버릴 것 같은 기분이 들기 시작합니다. 솔루션이 아마 제게는 좋다고 느끼지만, 저는 그것을 볼 수 없습니다.

편집 : 누군가 strncpy 대신 memcpy를 사용해야한다고 지적했습니다. 나는 그랬지만, 지금, 테스트 스크립트는 마다 블록이 잘못되었음을 보여줍니다. 이전에 비해 혼란 스럽네요 ...여기에 새로운 출력 on pastebin이 있습니다.

편집 2 : 컴퓨터에 다시 와서 다시 보았습니다. 어디에서나 문제가 될 수있는 곳을 찾기 위해 어디에서나 인쇄 문을 추가하고 있습니다. raw_encrypt.step (입력) 함수에 다음 코드.

cdef char* buffer = <char*>malloc(in_len) 
    print in_bin[:in_len] 
    memcpy(buffer, <const_void *>in_bin, in_len) 
    print "Before/after encryption" 
    print buffer[:in_len] 
    success = cmc.mcrypt_generic(self._mcStream, <void*>buffer, in_len) 
    print buffer[:in_len] 

첫 번째 인쇄 문이 예상되는 일을 보여주고, 전달 된 일반 텍스트 그러나, 두 번째는 그것이 있어야 완전히 다른 무언가를 보여줍니다 같은. 내가 완전히 이해하지 못하는 사이언 (Cython)과 관련된 일이있는 것 같습니다.

+3

이미 파이썬의 경우 'mcrypt'에 대한 바인딩이있는 것 같습니다. http://labix.org/python-mcrypt – katrielalex

+5

가상 +1 (interrobang), 실제 +1 (real +1). – delnan

+1

@katrielalex 예,하지만 그들은 Cython에 없으며 Python 3에서 작동하지 않습니다. 이것은 대상 환경입니다. 내 목표는 Python 2와 Python 3 모두에서 작동하는 Python의 유지 보수 가능한 바인딩 세트로 바인딩을 대체하는 것입니다. –

답변

2

오이,이 질문에 답하는 것이 싫지만 답변을 찾았습니다. 조사해야 할 Cython의 변덕입니다 (의도 한 것인지 모르겠습니다). 버크 또는 버그 인 경우).

문제는 memcpy 행과 함께 제공됩니다. 두 번째 매개 변수는 < const_void * >으로 캐스팅합니다. pxd 파일의 Cython 정의와 일치하지만, Cython은 < char * >을 사용하는 것과 다르게 코드를 다르게 컴파일합니다. 실제로 후자는 Cython에서 포인터를 실제 바이트로 전달합니다 (나는 짐작 하는가?) 파이썬 객체/변수 자체에 대한 포인터. 대신이의 그래서

는 :

cdef char* buffer = <char*>malloc(in_len) 
memcpy(buffer, <const_void *>in_bin, in_len) 
success = cmc.mcrypt_generic(self._mcStream, <void*>buffer, in_len) 

그것은이 있어야합니다 :

cdef char* buffer = <char*>malloc(in_len) 
memcpy(buffer, <char *>in_bin, in_len) 
success = cmc.mcrypt_generic(self._mcStream, <void*>buffer, in_len) 

어떤 이상한 특질을. 나는 솔직히 어떤 출연진이 같은 장소를 가리킬 것으로 기대하지만, 출연진 또한 출연작에 영향을 줄 수있는 것으로 보인다.

0

내가 잘못된 초기화 벡터 (예 : 암호 해독을 위해 다른 IV 사용)와 암호 모드 선택을 조합하여 우연히 발생했을 때 이와 비슷한 결과가 발생했습니다. 온 전성 검사로서 CBC에서 ECB로 전환하십시오.

또 다른 가능성은 변수 중 하나가 (새로운 시간 기반 시드로) 무작위 화되어야한다는 것입니다. 이 경우 암호화 및 암호 해독 단계 사이에 지연을 설정하여 데이터 손상을 더 자주 발생시킬 수 있습니다.

+0

흥미롭게도 ECB 모드를 사용할 때 출력과 정확히 같은 오류 바이트가 발생합니다. 또한 암호화 및 해독 단계 사이의 시간 지연 (임의의 수면)과 같은 출력 ...그래도 좋은 아이디어. 제안 해줘서 고마워. –

+0

나는 그것을 뒤로 돌린다. 나는 여전히 잘못된 데이터를 얻고있다. 그러나 그들은 CBC 모드 바이트와 동일하지 않다. 한 번의 실행으로 모두 동일하지만 CBC 모드에서의 실행과 다릅니다. 아직도 부패한 늪지대. –

관련 문제