Php NSString en/decode base64

Php NSString en/decode base64,php,objective-c,base64,encryption,Php,Objective C,Base64,Encryption,我正在尝试将这些php函数等效为目标c中的encrype/decrypt 但到目前为止运气不好 我在obj-c中找不到任何base64_en/解码方法,有吗 function encrypt($string, $key) { $result = '';  for($i = 0; $i < strlen($string); $i++) { $char = substr($string, $i, 1); $keychar = sub

我正在尝试将这些php函数等效为目标c中的encrype/decrypt 但到目前为止运气不好

我在obj-c中找不到任何base64_en/解码方法,有吗

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;
}
函数加密($string,$key){
$结果='';
    对于($i=0;$i

已经有了!

请查看我用于此任务的类别,它是一个用于将字符串转换为md5、base64等的
NSString
类别

NSString
NSData

+ (NSString *)encodeBase64WithString:(NSString *)strData {
    return [NSString encodeBase64WithData:[strData dataUsingEncoding:NSUTF8StringEncoding]];
}
+ (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
编码:

+ (NSString *)encodeBase64WithString:(NSString *)strData {
    return [NSString encodeBase64WithData:[strData dataUsingEncoding:NSUTF8StringEncoding]];
}
+ (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];
}
+(NSString*)encodebase64 with data:(NSData*)objData{
常量无符号字符*objRawData=[objData字节];
字符*对象指针;
char*strResult;
//获取原始数据长度并确保我们实际拥有数据
int intLength=[objData length];
如果(intLength==0),则返回nil;
//在占位符中设置基于字符串的结果占位符和指针
strResult=(char*)calloc((intLength+2)/3)*4,sizeof(char));
objPointer=strResult;
//遍历所有内容
而(intLength>2){//继续,直到少于24位
*objPointer++=_base64编码表[objRawData[0]>>2];
*objPointer++=_base64编码表[(objRawData[0]&0x03)>4];
*objPointer++=_base64编码表[(objRawData[1]&0x0f)>6];
*objPointer++=_base64编码表[objRawData[2]&0x3f];
//我们只处理了3个八位字节(24位)的数据
objRawData+=3;
intLength-=3;
}
//现在来处理事情的结尾
if(intLength!=0){
*objPointer++=_base64编码表[objRawData[0]>>2];
如果(intLength>1){
*objPointer++=_base64编码表[(objRawData[0]&0x03)>4];
*objPointer++=_base64编码表[(objRawData[1]&0x0f)0)){
//此时填充字符无效,因此整个字符串无效
免费(objResult);
返回零;
}
继续;
}
intCurrent=_base64DecodingTable[intCurrent];
如果(intCurrent==-1){
//我们在空白处--只需跳过
继续;
}else if(intCurrent==-2){
//我们的角色无效
免费(objResult);
返回零;
}
交换机(i%4){
案例0:
objResult[j]=intCurrent>4;
objResult[j]=(intCurrent&0x0f)>2;

objResult[j]=(intCurrent&0x03)次要问题:转换到Base64或从Base64转换不是加密/解密。如果您搜索“IOS Base64”你会发现一些第三方Base64转换包,比如我使用的是相同的代码,或者非常类似的代码,它不支持特殊字符。部分原因是他的加密方法增加了2个字符的ASCII码的值。使用
NSASCIIStringEncoding
只能访问ASCII表的前128个字符,因此,那些base64方法将不起作用。但它适用于常规文本。部分原因是,在您的encode方法中,您正在将NSData转换为
const unsigned char*
NSASCIIStringEncoding
。这样,您将丢失前128个字符,这将导致字符丢失。