2012-03-02 77 views
0

我在objc找不到我的错误,XOR加密

-(IBAction)click:(id)sender 
{ 
    NSURL *url = [NSURL URLWithString:@"http://localhost:8888/second.php"]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
    [request setHTTPMethod:@"POST"]; 
    NSString *data=[self transform:@"qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnm" Key:@"0800fc577294c34e0b28ad2839435945"]; 
    NSData *requestBody = [[NSString stringWithFormat:@"p=%@",data] dataUsingEncoding:NSUTF8StringEncoding]; 
    [request setHTTPBody:requestBody]; 
    NSURLResponse *response = NULL; 
    NSError *requestError = NULL; 
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError]; 
    NSString *responseString = [[[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding] autorelease]; 
    UIAlertView *alert=[[[UIAlertView alloc] initWithTitle:@"Message" message:responseString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] autorelease]; 
    [alert show]; 
    NSLog(@"log=%@",responseString); 


} 

- (NSString*) transform:(NSString*)input Key:(NSString*)key 
{ 
    NSMutableString* output = [[NSMutableString alloc] init]; 
    unsigned int vlen = [input length]; 
    unsigned int klen = [key length]; 
    unsigned int v = 0; 
    unsigned int k = 0; 


    for (v=0; v < vlen; v++) { 
     unichar c = [input characterAtIndex:v]^[key characterAtIndex:k]; 
     [output appendString:[NSString stringWithFormat:@"%C", c]]; 

     k = (++k < klen ? k : 0); 
    } 

    NSString* final = [[[NSString alloc] initWithString:output] autorelease]; 
    [output release]; 
    return final; 
} 

代码和PHP

$res=""; 
$key="0800fc577294c34e0b28ad2839435945"; 
$k=0; 
if ($_POST['p']){ 


     $vlen = strlen($_POST['p']); 
     $klen = strlen($key); 
     $v = 0; 
     $k = 0; 

     for ($v=0; $v < $vlen; $v++) { 
      $c = $_POST['p'][$v]^$key[$k]; 
      $res=$res.$c; 
      $k = (++$k < $klen ? $k : 0); 
     } 

    echo $res; 
    } 

解密,但是当我检查的结果是

qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcv > d = 1" + dssstcn | E〜DN1; 9 NVE,E9; UPG( '%& 5nqfyelfdnfll $ + f'6icr & OH#'(S4> vas6; aclkl |} brg86tp4#XZ! !HB 2" B; 6njk>'〜hpbnktvaw “!” 的pn> mp0gj9lkj`〜,3 | I6 =

但是我发送消息

qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnm

请,帮助我找到我的错误。

+0

发现我的问题,它在这里$ k =(++ $ k <$ klen?$ k:0);我把它改写,以简单,如果不三元 – SergeyM 2012-03-02 13:12:09

回答

1

在第50位,你从你的字符串,从你的钥匙,这会导致null character字母“b” XOR字符“B”。这可能被解释为控制角色并被丢弃。

你用的是“密码”;然而,你所采用的方法并不安全。也许你可以提供更多关于你想要在这里实现的细节。您是否有理由选择不使用SSL进行加密?

+0

这是一个密码。它不再被认为是安全的。 – JeremyP 2012-03-02 14:22:52

1

不能异或两个单字符和希望得到的结果是有效的单字符。正如jnic所说,这是你的算法的一个普遍问题,它首先在字符50处出错。您需要先使用-dataWithEncoding:将NSString和密钥转换为NSData,然后执行加密。然后你需要发送二进制数据到你的PHP服务器。 PHP服务器需要反转Objective-C程序中的所有步骤。