可逆地加扰NSString而不能存储原始字符串

时间:2013-08-11 18:15:18

标签: ios objective-c nsstring encryption

是否有快速而肮脏的方式来扰乱NSString然后解读它?

// i.e.
NSString *helloWorld = @"Hello World!";
[helloWorld scrambled]; //helloWorld now = @"W olell!odh"

[helloWorld unscramble]; //helloWorld now = @"Hello World!"

我已经使用Base64加密完成了与此类似的操作,但它为我的字符串增加了显着的膨胀。我不关心加扰的安全级别,只需要重新排序,这样就不会让人无法读取。

2 个答案:

答案 0 :(得分:3)

如果您无法保存原始字符串,则您的程序必须具有某种已知密钥才能使其可逆。您还关注添加到字符串中的信息量,但您并不关心它特别难以解码。我猜你是通过网络传输字符串的。

我的建议如下:使用Cæsar cipher。 ROT-13是最着名的例子。可能的输入字符集中的每个字符都排成一行,该列表以相同的顺序与另一个字符配对,但其起始点已移位。第二个列表提供每个字符的输出。如,

Original: A B C D E ...
Encoded:  F G H I J ...

(不要忘记标点符号!)

您的"Hello, world!"可能会出现以下情况:"Mjqqt; Btwqi&"

因此,您可以通过在' A'之前预先编码来轻松传输密钥。到字符串:"FMjqqt; Btwqi&",这只是一个额外的字符。这没有提供任何有意义的安全性 - 人们在早餐时解决这些问题 - 但它看起来确实看起来像胡言乱语。

答案 1 :(得分:0)

在数组中输入单词的所有字母并随机化数组。请记住将单词保存到NSString中,以便将其恢复。

NSString *myString = @"Hello Word";
NSArray *myWords = [myString componentsSeparatedByString:@""];
 NSUInteger count = [myWords count];
for (NSUInteger i = 0; i < count; ++i) {
    // Select a random element between i and end of array to swap with.
    NSInteger nElements = count - i;
    NSInteger n = (arc4random() % nElements) + i;
    [self exchangeObjectAtIndex:i withObjectAtIndex:n];
}
NSString *newWord;
for(NSString *string in myWords){
     newWord = [newWord stringByAppendingString:string];
}