2009-09-07 5 views
2

CommonCrypto 기능에 심각한 문제가 있습니다. BlackBerry 및 Windows Mobile에는 두 가지 기존 응용 프로그램이 있으며 둘 다 데이터 교환을 위해 ECB 모드로 Triple-DES 암호화를 사용합니다. 어느 쪽이든 암호화 된 결과는 같습니다.iPhone --- 3DES 암호화가 "잘못된"결과를 반환합니까?

는 지금은 우리의 아이폰 응용 프로그램에 3DES 암호화를 implent 할, 그래서 CommonCrypto 똑바로 갔다 : 나는 CBC 모드를 사용하는 경우 http://www.opensource.apple.com/source/CommonCrypto/CommonCrypto-32207/CommonCrypto/CommonCryptor.h

내가 어떤 결과를 얻을 수 있지만 결과와 일치하지 않는 자바 또는 C#. 어쨌든, 나는 ECB 모드를 사용하고 싶지만 전혀 작동하지 않는다. 매개 변수 오류가 나타난다. ...

이것은 ECB 모드에 대한 나의 요청이다. 비트 :

const void *vplainText; 

plainTextBufferSize = [@"Hello World!" length]; 
bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1); 

plainText = (const void *) [@"Hello World!" UTF8String]; 
NSString *key = @"abcdeabcdeabcdeabcdeabcd"; 

ccStatus = CCCrypt(kCCEncrypt, 
    kCCAlgorithm3DES, 
    kCCOptionECBMode, 
    key, 
    kCCKeySize3DES, 
    nil, // iv, not used with ECB 
    plainText, 
    plainTextBufferSize, 
    (void *)bufferPtr, // output 
    bufferPtrSize, 
    &movedBytes); 

t 여기에서 더 많거나 적은 코드 : http://discussions.apple.com/thread.jspa?messageID=9017515 그러나, 나는이 매개 변수 오류가 매번 얻을 이미 언급 ...

내가 대신 kCCOptionECBMode의 kCCOptionPKCS7Padding를 사용하여 설정 C#과 내 iPhone 코드에서 동일한 초기화 벡터, iPhone은 나에게 다른 결과를 제공합니다. bufferPtr에서 결과를 가져 와서 실수가 있습니까?

NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes]; 
result = [[NSString alloc] initWithData:myData encoding:NSISOLatin1StringEncoding]; 

내가 거의 모든 두 번 설정을 시도 것, 다른 인코딩 등등 ... 어디 내 오류가 있습니다 : 현재 내가 암호화 된 물건이 방법을 얻을?

답변

1

오류 메시지를 게시 할 수 있습니까?

이 문제를 해결하는 가장 좋은 방법 중 하나는 알려진 입력, 알려진 키 및 알려진 출력 ("test vectors")을 가져 와서 예상 출력의 바이트를 관찰 된 출력과 비교하는 것입니다. 어떻게 암호화 된 바이너리 데이터가 NSISOLatin1StringEncoding 인코딩으로 해석 될 수 있습니다 알고

NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes]; 
result = [[NSString alloc] initWithData:myData encoding:NSISOLatin1StringEncoding]; 

:

아마 출력을 테스트 할 수있는 좋은 방법 당신이 여기서 뭘하고하지?

대신 바이트를 직접 비교하거나 ([myData description] 등을 통해) 출력을 16 진수 또는 base64 인코딩으로 변환하십시오.

+0

팁 주셔서 감사합니다. kCCOptionPKCS7Padding (읽기 : CBC 모드)을 사용하여 실행 해 보았습니다. 출력물의 인코딩이 문제였던 것 같습니다. 대신이 ECB 모드를 사용 하겠지만, 왜 나는 오류가 발생하는지 궁금해합니다. kCCOptionECBMode가 사용되면 함수는 단지 kCCParamError를 반환합니다. –

1

저는 kCCOptionECBMode만으로는 충분하지 않다는 것이 문제라고 생각합니다. 패딩이 필요합니다 (블록 사이퍼이기 때문에). 둘 다 전달하면 (즉, kCCOptionPKCS7Padding | kCCOptionECBMode) 작동합니다.

0

저는 이것이 오래된 질문이라는 것을 알고 있습니다. 그러나 참고로 여러분의 키는 NSString으로 전달되면 안된다고 생각합니다. 대신 키를 16 진수에서 바이트 배열로 변환해야합니다. 이 hexToBytes NSString extension 다음을 수행하여 필요한 것을 제공해야

[[key hexToBytes] bytes] 

의 핵심은 두 배만큼 주어진 일 (16 진수의 48 자, 즉 24 바이트)로해야한다.