2014-12-27 3 views
0

ASI http 라이브러리를 사용하여 AES 암호화 알고리즘 (ECB) &을 사용하고 있지만 권한이 부여되지 않았기 때문에 요청이 실패했습니다. 아래 코드를 첨부했습니다.요청 실패 Asi HTTP

암호화 너 한테. (AES 암호화 128)

+ (NSData*)encryptData:(NSData*)data key:(NSData*)key iv:(NSData*)iv; 
{ 
    NSData* result = nil; 

    // setup key 
    unsigned char cKey[FBENCRYPT_KEY_SIZE]; 
    bzero(cKey, sizeof(cKey)); 
    [key getBytes:cKey length:FBENCRYPT_KEY_SIZE]; 

    // setup iv 
    char cIv[FBENCRYPT_BLOCK_SIZE]; 
    bzero(cIv, FBENCRYPT_BLOCK_SIZE); 
    if (iv) { 
     [iv getBytes:cIv length:FBENCRYPT_BLOCK_SIZE]; 
    } 

    // setup output buffer 
    size_t bufferSize = [data length] + FBENCRYPT_BLOCK_SIZE; 
    void *buffer = malloc(bufferSize); 

    // do encrypt 
    size_t encryptedSize = 0; 

///CCCryptorStatus cryptStatus2 = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, [data bytes], [data length], NULL, [cipherData bytes], outLength, [decodedData mutableBytes], [decodedData length], &outLength); 

    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, 
              FBENCRYPT_ALGORITHM, 
              kCCOptionPKCS7Padding | kCCOptionECBMode, 
              cKey, 
              FBENCRYPT_KEY_SIZE, 
              cIv, 
              [data bytes], 
              [data length], 
              buffer, 
              bufferSize, 
              &encryptedSize); 
    if (cryptStatus == kCCSuccess) { 
     result = [NSData dataWithBytesNoCopy:buffer length:encryptedSize]; 
    } else { 
     free(buffer); 
     NSLog(@"[ERROR] failed to encrypt|CCCryptoStatus: %d", cryptStatus); 
    } 

    return result; 
} 

해독 너 한테. (AES 128 암호 해독)

+ (NSData*)decryptData:(NSData*)data key:(NSData*)key iv:(NSData*)iv; 
{ 
    NSData* result = nil; 

    // setup key 
    unsigned char cKey[FBENCRYPT_KEY_SIZE]; 
    bzero(cKey, sizeof(cKey)); 
    [key getBytes:cKey length:FBENCRYPT_KEY_SIZE]; 

    // setup iv 
    char cIv[FBENCRYPT_BLOCK_SIZE]; 
    bzero(cIv, FBENCRYPT_BLOCK_SIZE); 
    if (iv) { 
     [iv getBytes:cIv length:FBENCRYPT_BLOCK_SIZE]; 
    } 

    // setup output buffer 
    size_t bufferSize = [data length] + FBENCRYPT_BLOCK_SIZE; 
    void *buffer = malloc(bufferSize); 

    // do decrypt 
    size_t decryptedSize = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, 
              FBENCRYPT_ALGORITHM, 
              kCCOptionECBMode, 
              cKey, 
              FBENCRYPT_KEY_SIZE, 
              cIv, 
              [data bytes], 
              [data length], 
              buffer, 
              bufferSize, 
              &decryptedSize); 

    if (cryptStatus == kCCSuccess) { 
     result = [NSData dataWithBytesNoCopy:buffer length:decryptedSize]; 
    } else { 
     free(buffer); 
     NSLog(@"[ERROR] failed to decrypt| CCCryptoStatus: %d", cryptStatus); 
    } 

    return result; 
} 

기본 64 ALGO.

- (NSString *)base64EncodedString 
{ 
    size_t outputLength; 
    char *outputBuffer = 
     NewBase64Encode([self bytes], [self length], true, &outputLength); 

    NSString *result = 
     [[[NSString alloc] 
      initWithBytes:outputBuffer 
      length:outputLength 
      encoding:NSASCIIStringEncoding] 
     autorelease]; 
    free(outputBuffer); 
    return result; 
} 

필요한 조치를 수행하십시오. 미리 감사드립니다.

+0

무슨 문제가 암호화라고 생각합니까? 키의 16 진 덤프는 어디에 있고, 데이터는 들어갔다가 나오지? ECB는 이미지에 특히 안전하지 않지만 코드를 설정해야합니다. 저자가 그것을 사용하지 않을 것을 제안 할 때 ASI를 사용하는 이유는 무엇입니까, AFNetworking은 현재이며 적극적으로 유지 관리되고 있습니다. Apple에서 제공하는 타사 Base64 코드를 사용하는 이유는 무엇입니까? 왜 ARC를 사용하지 않습니까? – zaph

+0

나는 대부분의 질문이 선택된 제 3 자 프로젝트의 선택에 의해 대답 될 수 있다고 생각한다. RNCryptor는 현재 사용되고 사용자의 요구에 맞을 수 있습니다. – zaph

+0

당신이 응답 주셔서 고마워하지만 거기에 CBC를 그렇지 않으면 PHP는 서버가 내 요청을 해독 할 수 없다는 사용할 수 없습니다 그래서 PHP 측면에서 구현되었습니다. – user1066642

답변

0

다음은 기본적인 암호화/해독 방법입니다. 키는 올바른 길이 여야합니다. 값 컨텍스트는 kCCEncrypt 또는 kCCDcrypt입니다.

문자열을 데이터로 변환하고 데이터를 암호화/해독 한 다음 필요한 모든 형식으로 다시 변환하십시오. Base64 인코딩의 경우 NSData에서 제공하는 방법을 사용하십시오.

PKCS7Padding이 암호화에는 사용되었지만 암호 해독에는 사용되지 않았다는 점에서 두 가지 모두에서 동일해야합니다.

+ (NSData *)doCipher:(NSData *)dataIn 
       key:(NSData *)symmetricKey 
      context:(CCOperation)encryptOrDecrypt 
       error:(NSError **)error 
{ 
    CCCryptorStatus ccStatus = kCCSuccess; 
    size_t   cryptBytes = 0; 
    NSMutableData *dataOut = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128]; 

    ccStatus = CCCrypt(encryptOrDecrypt, 
         kCCAlgorithmAES128, 
         kCCOptionPKCS7Padding | kCCOptionECBMode, 
         symmetricKey.bytes, 
         kCCKeySizeAES128, 
         nil, 
         dataIn.bytes, dataIn.length, 
         dataOut.mutableBytes, dataOut.length, 
         &cryptBytes); 

    if (ccStatus == kCCSuccess) { 
     dataOut.length = cryptBytes; 
    } 
    else { 
     if (error) { 
      *error = [NSError errorWithDomain:@"kEncryptionError" code:ccStatus userInfo:nil]; 
     } 
     dataOut = nil; 
    } 
    return dataOut; 
} 
+0

귀하의 방법을 시도했지만 여전히 동일한 응답 요청이 실패했습니다 : ( – user1066642

+0

상태 코드 : 401, 상태 메시지 : HTTP/1.1 401 Unauthorized – user1066642

+0

정확히 무엇이 필요한지 정확히 검사해야합니다. – zaph

관련 문제