마지막 편집 : 문제가 무엇인지 알아 냈습니다. (내 대답은 아래를 참조하십시오.)하지만 대답은 대답으로 표시 할 수 없습니다. 누군가가 내가 아래 답변에있는 질문에 대답 할 수 있다면, 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)과 관련된 일이있는 것 같습니다.
이미 파이썬의 경우 'mcrypt'에 대한 바인딩이있는 것 같습니다. http://labix.org/python-mcrypt – katrielalex
가상 +1 (interrobang), 실제 +1 (real +1). – delnan
@katrielalex 예,하지만 그들은 Cython에 없으며 Python 3에서 작동하지 않습니다. 이것은 대상 환경입니다. 내 목표는 Python 2와 Python 3 모두에서 작동하는 Python의 유지 보수 가능한 바인딩 세트로 바인딩을 대체하는 것입니다. –