2012-04-05 2 views
1

암호화/암호 해독 문자열 값에 CCCrypt를 사용하고 있습니다. 해독 된 값이 초기 값과 같기 때문에 정상적으로 작동하는 것으로 보이지만 문제는 해독 된 데이터에서 적절한 NSString 객체를 추출 할 수 없다는 것입니다.CCCrypt 암호화 결과 문제

@implementation NSData (AES256) 

- (NSData *)AES256EncryptWithKey:(NSString *)key 
{ 
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) 
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

    // fetch key data 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 

    NSUInteger dataLength = [self length]; 

    size_t bufferSize = dataLength + kCCBlockSizeAES128; 
    void *buffer = malloc(bufferSize); 

    size_t numBytesEncrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
             keyPtr, kCCKeySizeAES256, 
             NULL /* initialization vector (optional) */, 
             [self bytes], dataLength, /* input */ 
             buffer, bufferSize, /* output */ 
             &numBytesEncrypted); 
    if (cryptStatus == kCCSuccess) { 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; 
    } 

    free(buffer); //free the buffer; 
    return nil; 
} 

- (NSData *)AES256DecryptWithKey:(NSString *)key { 
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) 
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

    // fetch key data 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 

    NSUInteger dataLength = [self length]; 

    size_t bufferSize = dataLength + kCCBlockSizeAES128; 
    void *buffer = malloc(bufferSize); 

    size_t numBytesDecrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
             keyPtr, kCCKeySizeAES256, 
             NULL /* initialization vector (optional) */, 
             [self bytes], dataLength, /* input */ 
             buffer, bufferSize, /* output */ 
             &numBytesDecrypted); 

    if (cryptStatus == kCCSuccess) { 
     //the returned NSData takes ownership of the buffer and will free it on deallocation 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; 
    } 

    free(buffer); //free the buffer; 
    return nil; 
} 

나는 잘못한 것을 얻을 수 없으므로 누구든지 도울 수 있다면 매우 감사하겠습니다.

질문의 두 번째 부분 - 어떻게 CES 모드를 AES 암호화 방법으로 설정할 수 있습니까? 문서에서는이 모드가 기본적으로 사용되지만 CCCrypt 메서드에서 세 번째 인수로 전달해야하는 것은 무엇입니까?

답변

1

initWithData:encoding: 기능은 nil를 반환합니다.

철저한 대답과 동일한 질문 : Why does my initWithData return nil indicating an error after converting NSData to NSString returning from encrypting via CommonCrypto?하지만 base64는 암호화 된 데이터를 보이는 문자열로 만들지는 않지만 표시 할 수있는 ASCII 문자열을 만들기 위해 추가로 변경합니다. 이 문자열은 암호화 된 데이터와 동일하거나 데이터를 암호화하는 것과 동일하게 간주해서는 안되지만 키 체인과 같이 문자열로 사용하는 경우에는 정상적으로 작동합니다.

+0

제안 해 주셔서 감사합니다! :) – Solomiya

0

암호 해독 후 정확한 문자열을 얻으려면 Decrypted Data을 base64로 디코딩 한 다음 NSUTF8StringEncoding을 사용하여 NSString을 만들어야합니다.

NSString decryptedString = [[NSString alloc]initWithData:decryptedData]; 

    NSData *data = [NSData dataByBase64DecodingString:decryptedString]; 

    decryptedString = [data dataUsingEncoding:NSUTF8StrinEncoding]; 

decryptedString 암호화하기 전에 문자열을 그대로 유지하십시오.

base64 디코딩의 경우 this 게시를 참조하십시오. 암호화 된 데이터가 암호화되어 있다는 사실 주어진, NSUTF8StringEncoding와 일치하는 것은 매우 가능성이 있기 때문에 이전 답변에 댓글을 달았 문제를 해결

+0

암호 해독 된 문자열은 정확히 같아야합니다. 문제는 문자열처럼 암호화 된 데이터를 볼 수 없다는 것입니다. NSString * encryptedString = [[NSString alloc] initWithData : encryptedData encoding : NSUTF8StringEncoding]; 그리고'encryptedString'을 출력하면'(null)'이됩니다. . 아니면 암호화 된 데이터 나 그와 비슷한 것을 조사하지 않아도 되는가? – Solomiya