2014-02-19 10 views
0

golang 스크립트로 암호화 된 문자열의 암호를 해독하려고합니다. 암호화는 CBC, 키 크기 256입니다. 16 바이트 길이의 iv는 암호화 된 텍스트의 시작 부분에 포함됩니다 (golang 문서가 제안했듯이). objc 코드가 항상 블록 블록을 잃어 버린 것을 제외하고는 모든 것이 잘 작동합니다. 예 : 80 바이트를 반환하지만 64 비트 만 가져 오면 128을 기대하지만 112를 얻습니다. 어떤 조언이 필요합니까? 감사!CCCrypto decrypt : 정확히 한 블록 이하

golang 코드

func encrypt(text_s, key_s string) byte[] { 

    text := []byte(text_s) 

    // padding text 
    n := aes.BlockSize - (len(text) % aes.BlockSize) 
    log.Println("Need to pad:", n) 

    if n != aes.BlockSize || n != 0 { 
     text = append([]byte(strings.Repeat(" ", n)), text...) 
    } 

    log.Println("to encrypt:'", string(text), "'") 
    log.Println("padded length:", len(text)) 

    key := []byte(key_s)[:32] 
    block, _ := aes.NewCipher(key) 

    // if err != nil { 
    // panic(err) 
    // } 

    ret := make([]byte, aes.BlockSize + len(text)) 
    iv := ret[:aes.BlockSize] 

    if _, err := io.ReadFull(rand.Reader, iv); err != nil { 
     panic(err) 
    } 

    cbc := cipher.NewCBCEncrypter(block, iv) 
    cbc.CryptBlocks(ret[aes.BlockSize:], text) 

    return ret 
} 

objc 코드 :

- (NSData *)decrypt:(NSData*)data{ 
    if (!key) { 
     key = [[_token substringToIndex:32] dataUsingEncoding:NSUTF8StringEncoding]; 
    } 

// NSLog(@"decodbase64 :%@",[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]); 
// NSString *key = _token; 
//  
// char keyPtr[kCCKeySizeAES256 + 1]; // room for terminator (unused) 

    // 'key' should be 32 bytes for AES256, will be null-padded otherwise 
// bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

// BOOL patchNeeded = ([_token length] > kCCKeySizeAES256); 
// NSLog(@"need patch? %@", patchNeeded ? @"YES": @"NO"); 
//  
// if (patchNeeded) { 
//  key = [_token substringToIndex:kCCKeySizeAES256]; // Ensure that the key isn't longer than what's needed (kCCKeySizeAES256) 
// } 

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

// if (patchNeeded) { 
//  // Previous iOS version than iOS7 set the first char to '\0' if the key was longer than kCCKeySizeAES256 
//  keyPtr[0] = '\0'; 
// } 

    size_t dataLength = [data length] - kCCBlockSizeAES128; 
    NSData *iv   = [data subdataWithRange:NSMakeRange(0, kCCBlockSizeAES128)]; 
    NSData *encrypted = [data subdataWithRange:NSMakeRange(kCCBlockSizeAES128, dataLength)]; 

    //See the doc: For block ciphers, the output size will always be less than or 
    //equal to the input size plus the size of one block. 
    //That's why we need to add the size of one block here 
// size_t bufferSize = dataLength + kCCBlockSizeAES128; 
// void *buffer = malloc(dataLength); 
    NSMutableData *ret = [NSMutableData dataWithLength:dataLength + kCCBlockSizeAES128]; 

    size_t numBytesDecrypted = 0; 
    CCCryptorStatus status = CCCrypt(kCCDecrypt, kCCAlgorithmAES, 
              kCCOptionPKCS7Padding, 
              [key bytes], 
              kCCKeySizeAES256, 
              [iv bytes], 
              [encrypted bytes], dataLength, /* input */ 
              [ret mutableBytes], [ret length], /* output */ 
              &numBytesDecrypted 
             ); 

    NSLog(@"err: %d", status); 
    NSLog(@"dataLength: %d, num: %d", (int)dataLength, (int)numBytesDecrypted); 
    if (status == kCCSuccess) { 
     //the returned NSData takes ownership of the buffer and will free it on deallocation 
     return ret; 
    } 

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

답변

0

이 문제가 암호 해독 옵션입니다 밝혀 :

CCCryptorStatus status = CCCrypt(kCCDecrypt, kCCAlgorithmAES, 
              0, // change to 0 solve the problem 
              [key bytes], 
              kCCKeySizeAES256, 
              [iv bytes], 
              [encrypted bytes], dataLength, /* input */ 
              [ret mutableBytes], [ret length], /* output */ 
              &numBytesDecrypted 
             );