2013-12-09 1 views
0

내 응용 프로그램에 암호화 및 암호 해독 클래스 메서드가 있습니다. 나는 '키'를 사용하여 '데이터'를 암호화 할 수 있으며 훌륭하게 작동합니다. 그 데이터를 디스크에 기록한 다음 나중에 응용 프로그램을 사용하여 데이터를 읽을 수 있으며 decryptWithKey를 호출하여 데이터 블록을 해독 할 수 있습니다. 모든 것이 훌륭하게 작동합니다. 그러나이 .m 클래스 파일을 다른 응용 프로그램에 포함하고 해당 응용 프로그램을 컴파일하고 첫 번째 응용 프로그램으로 암호화 된 동일한 데이터를 해독하려고하면 CCCrypt (암호 해독) 호출이 실패합니다 ... 정확히 말하면 성공을 반환합니다. 그러나 데이터는 해독되지 않습니다. 두 응용 프로그램에서 데이터와 키 값을 비교했으며 바이트까지 동일합니다.다른 응용 프로그램에서 암호 해독 할 때 CCCrypt가 실패합니다.

아이디어가 있으십니까? decryptWithKey에서

+(BOOL)encryptWithKey:(NSMutableData*)data withKey:(NSString *)key 
{ 
    CCCryptorStatus result = kCCSuccess; 

    @try 
    { 
     char keyPtr1[kCCKeySizeAES256+1]; // room for terminator (unused) 
     bzero(keyPtr1, sizeof(keyPtr1)); // fill with zeroes (for padding) 
     [key getCString: keyPtr1 maxLength: sizeof(keyPtr1) encoding: NSUTF8StringEncoding]; 
     size_t numBytesEncrypted = 0; 
     size_t dataInLength = [data length]; 
     size_t dataOutLength = 18*dataInLength; 

     [data setLength:dataOutLength]; 
     result = CCCrypt(kCCEncrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding, 
             (const void*)keyPtr1, kCCKeySizeAES256, 0 /* initialization vector (optional) */, 
             [data mutableBytes], dataInLength, /* input */ 
             [data mutableBytes], dataOutLength, /* output */ 
             &numBytesEncrypted); 
     [data setLength:numBytesEncrypted]; 
    } 
    @catch (NSException *exception) 
    { 
     WDCATCH(exception); 

    } 
    return (result == kCCSuccess); 
} 

+(BOOL)decryptWithKey:(NSMutableData*)data plaintext:(NSString**)plaintext withKey:(NSString *)key 
{ 
    CCCryptorStatus result = kCCSuccess; 

    @try 
    { 
     // 'key' should be 32 bytes for AES256, will be null-padded otherwise 
     char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) 
     char szPlaintext[1024]={0}; 
     bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 
     [key getCString: keyPtr maxLength: sizeof(keyPtr) encoding: NSUTF8StringEncoding]; 
     size_t numBytesEncrypted = 0; 

     result = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
         (const void*)keyPtr, kCCKeySizeAES256, 
         0 /* initialization vector (optional) */, 
         [data mutableBytes], [data length], /* input */ 
         szPlaintext,1024,// [data mutableBytes], dataOutLength, /* output */ 
         &numBytesEncrypted); 
     if (result == kCCSuccess) 
     { 
      szPlaintext[numBytesEncrypted] = 0; 
      *plaintext = [[NSString alloc] initWithFormat:@"%s",szPlaintext]; 
     } 
    } 
    @catch (NSException *exception) 
    { 
     WDCATCH(exception); 

    } return (result == kCCSuccess); 
} 
+0

위의 코드는 매우 안전하지 않습니다 (자세한 내용은 http://robnapier.net/blog/aes-commoncrypto-564 참조). '18 * dataInLength' 또한 매우 이상합니다. 최대로, 이것은'dataInLength + 16' 일 필요가 있지만, 여전히 작동해야합니다 (너무 큽니다). 원시 데이터를 암호화하지만 ASCII (심지어 UTF-8은 아님) 문자열의 암호를 해독하는 것이 좋습니다. 해독에 실패했다면 numBytesEncrypted가 0보다 큰가요? 아마도 % s의 ASCII 변환이 실패합니다 (그래도 쓰레기가 나옵니다). "암호 해독 안함"이라고 말하면 실제 증상은 무엇입니까? –

+0

CCCrypt (kCCDecrypt)가 실행 된 후 numBytesEncrypted (이름을 numBytesDecrypted로 바꿔야 함)는 0이고 szPlainText는 비어 있으며 결과는 = 0/kCCSuccess입니다. – WebDrive

+0

좀 더 살펴 봤는데 응용 프로그램 'A', 암호화 응용 프로그램, OSX 10.7 배포/baseSDK 및 응용 프로그램 'B, 복호화 응용 프로그램을 대상으로하는 응용 프로그램과 관련이있는 것처럼 보입니다. OSX 10.9 배포를 대상으로합니다./baseSDK; @ RoNNapier, 그게 문제를 일으킬 수 있습니까? – WebDrive

답변

0
내가 목표 - C 전문가가 아니에요

하지만 char szPlaintext[1024]={0};은 나에게 매우 의심스러운 것 같다. 먼저 1024 바이트를 할당하지만 요소 0을 포함하는 배열에 포인터를 할당합니까? 문자열로서의 plaintext의 생성은 꽤 의심스러워 보일지 모르지만 ASCII로 인코딩 된 일반 텍스트 (?)에서 잘 작동합니다.

+0

the = {0}; 선언에서 bzero 또는 memset과 비슷하게 전체 버퍼를 null/0으로 초기화합니다. – WebDrive