2012-10-17 87 views
1

我想使這些php函數equilvant加密/解密在目標c但迄今沒有運氣。NSString恩/解碼base64

我沒有在obj-c中找到任何base64_en/decode方法,有沒有?

function encrypt($string, $key) { 

    $result = ''; 

 for($i = 0; $i < strlen($string); $i++) { 

     $char = substr($string, $i, 1); 
     $keychar = substr($key, ($i % strlen($key))-1, 1); 
     $char = chr(ord($char) + ord($keychar)); 
     $result .= $char; 
 } 
 
    return base64_encode($result); 
} 


function decrypt($string, $key) { 

    $result = ''; 
    $string = base64_decode($string); 

    for($i = 0; $i < strlen($string); $i++) { 

     $char = substr($string, $i, 1); 
     $keychar = substr($key, ($i % strlen($key))-1, 1); 
     $char = chr(ord($char) - ord($keychar)); 
     $result.=$char; 
    } 

    return $result; 
} 

Ty already!

+5

次要點:從Base64編碼轉換到/未加密/解密。 –

+2

如果你的谷歌「IOS BASE64」,你會發現幾個第三方Base64轉換包,如https://github.com/l4u/NSData-Base64/ –

回答

2

退房這一類我用這個非常任務,這是一個NSString類別字符串轉換爲MD5,BASE64等..

https://gist.github.com/3907443

NSStringNSData

+ (NSString *)encodeBase64WithString:(NSString *)strData { 
    return [NSString encodeBase64WithData:[strData dataUsingEncoding:NSUTF8StringEncoding]]; 
} 

編碼來自NSData

+ (NSString *)encodeBase64WithData:(NSData *)objData { 
    const unsigned char * objRawData = [objData bytes]; 
    char * objPointer; 
    char * strResult; 

    // Get the Raw Data length and ensure we actually have data 
    int intLength = [objData length]; 
    if (intLength == 0) return nil; 

    // Setup the String-based Result placeholder and pointer within that placeholder 
    strResult = (char *)calloc(((intLength + 2)/3) * 4, sizeof(char)); 
    objPointer = strResult; 

    // Iterate through everything 
    while (intLength > 2) { // keep going until we have less than 24 bits 
     *objPointer++ = _base64EncodingTable[objRawData[0] >> 2]; 
     *objPointer++ = _base64EncodingTable[((objRawData[0] & 0x03) << 4) + (objRawData[1] >> 4)]; 
     *objPointer++ = _base64EncodingTable[((objRawData[1] & 0x0f) << 2) + (objRawData[2] >> 6)]; 
     *objPointer++ = _base64EncodingTable[objRawData[2] & 0x3f]; 

     // we just handled 3 octets (24 bits) of data 
     objRawData += 3; 
     intLength -= 3; 
    } 

    // now deal with the tail end of things 
    if (intLength != 0) { 
     *objPointer++ = _base64EncodingTable[objRawData[0] >> 2]; 
     if (intLength > 1) { 
      *objPointer++ = _base64EncodingTable[((objRawData[0] & 0x03) << 4) + (objRawData[1] >> 4)]; 
      *objPointer++ = _base64EncodingTable[(objRawData[1] & 0x0f) << 2]; 
      *objPointer++ = '='; 
     } else { 
      *objPointer++ = _base64EncodingTable[(objRawData[0] & 0x03) << 4]; 
      *objPointer++ = '='; 
      *objPointer++ = '='; 
     } 
    } 

    // Terminate the string-based result 
    *objPointer = '\0'; 

    // Return the results as an NSString object 
    return [NSString stringWithCString:strResult encoding:NSASCIIStringEncoding]; 
} 

解碼:

+ (NSData *)decodeBase64WithString:(NSString *)strBase64 { 
    const char * objPointer = [strBase64 cStringUsingEncoding:NSASCIIStringEncoding]; 
    int intLength = strlen(objPointer); 
    int intCurrent; 
    int i = 0, j = 0, k; 

    unsigned char * objResult; 
    objResult = calloc(intLength, sizeof(char)); 

    // Run through the whole string, converting as we go 
    while (((intCurrent = *objPointer++) != '\0') && (intLength-- > 0)) { 
     if (intCurrent == '=') { 
      if (*objPointer != '=' && ((i % 4) == 1)) {// || (intLength > 0)) { 
       // the padding character is invalid at this point -- so this entire string is invalid 
       free(objResult); 
       return nil; 
      } 
      continue; 
     } 

     intCurrent = _base64DecodingTable[intCurrent]; 
     if (intCurrent == -1) { 
      // we're at a whitespace -- simply skip over 
      continue; 
     } else if (intCurrent == -2) { 
      // we're at an invalid character 
      free(objResult); 
      return nil; 
     } 

     switch (i % 4) { 
      case 0: 
       objResult[j] = intCurrent << 2; 
       break; 

      case 1: 
       objResult[j++] |= intCurrent >> 4; 
       objResult[j] = (intCurrent & 0x0f) << 4; 
       break; 

      case 2: 
       objResult[j++] |= intCurrent >>2; 
       objResult[j] = (intCurrent & 0x03) << 6; 
       break; 

      case 3: 
       objResult[j++] |= intCurrent; 
       break; 
     } 
     i++; 
    } 

    // mop things up if we ended on a boundary 
    k = j; 
    if (intCurrent == '=') { 
     switch (i % 4) { 
      case 1: 
       // Invalid state 
       free(objResult); 
       return nil; 

      case 2: 
       k++; 
       // flow through 
      case 3: 
       objResult[k] = 0; 
     } 
    } 

    // Cleanup and setup the return NSData 
    NSData * objData = [[[NSData alloc] initWithBytes:objResult length:j] autorelease]; 
    free(objResult); 
    return objData; 
} 
+0

我使用相同的代碼,或非常相似,它doesn不支持特殊字符。部分原因是他的加密方法增加了2個字符的ASCII碼的值。使用'NSASCIIStringEncoding'只能讓你訪問ASCII表的前128個字符,因此這些base64方法將不起作用。儘管如此,它仍然適用於普通文本。部分原因是,在你的編碼方法中,你將你的NSData轉換成'const unsigned char *'到'NSASCIIStringEncoding'。那樣,你會失去前128個字符,這會導致字符丟失。 –