The problem is that newCStr
is not null-terminated, and does also not represent a valid
UTF-8 string. So this conversion
NSString *tempStr = [NSString stringWithUTF8String:[[NSString stringWithFormat:@"%s",newCStr] UTF8String]];
is bound to fail (or give a wrong result).
The following code avoids unnecessary conversions:
NSLog(@"--------Test begins--------");
NSString *plainText = @"abcd 測試";
NSString *keyString = @"topsecret";
/** encrypt **/
NSMutableData *plainData = [[plainText dataUsingEncoding:NSUTF8StringEncoding] mutableCopy];
NSData *keyData = [keyString dataUsingEncoding:NSUTF8StringEncoding];
uint8_t *plainBytes = [plainData mutableBytes];
const uint8_t *keyBytes = [keyData bytes];
for (int i = 0, j = 0; i < [plainData length]; i++, j++) {
if (j >= [keyData length]) j = 0;
plainBytes[i] ^= keyBytes[j];
}
NSString *base64Str = [plainData base64EncodedString];
NSLog(@"chinese : %@", plainText);
NSLog(@"--------Encrypt--------");
NSLog(@"base64 data : %@", base64Str);
/** decrypt**/
NSData *dataFrom64 = [NSData dataFromBase64String:base64Str];
NSMutableData *decodeData = [dataFrom64 mutableCopy];
uint8_t *decodeBytes = [decodeData mutableBytes];
for (int i = 0, j = 0; i < [decodeData length]; i++, j++) {
if (j >= [keyData length]) j = 0;
decodeBytes[i] ^= keyBytes[j];
}
NSString *decrypted = [[NSString alloc] initWithData:decodeData
encoding:NSUTF8StringEncoding];
NSLog(@"--------Decrypt--------");
NSLog(@"decrypt str : %@", decrypted);
Output:
--------Test begins-------- chinese : abcd 測試 --------Encrypt-------- base64 data : FQ0TF0WFysmc3ck= --------Decrypt-------- decrypt str : abcd 測試