RNCryptor不能使用JSON字符串

这里是我的方法,使用RNCryptor来加密/解密我发送给Web服务的JSON字符串。 我正在使用静态IV变量,这可能是不好的做法,但请不要专注于此。 这是我如何做到的:

注意:我使用的是Matt Gallagher的NSData + Base64类别(位于页面底部)

-(NSString*)encryptString:(NSString*)plaintext withKey:(NSString*)key error:(NSError**)error{
    NSData *data = [plaintext dataUsingEncoding:NSUTF8StringEncoding];
    NSData *encryptionKey = [NSData dataFromBase64String:key];
    NSData *IV = [NSData dataFromBase64String:ENCRYPTION_IV];

    RNCryptorEngine *engine = [[RNCryptorEngine alloc] initWithOperation:kCCEncrypt settings:kRNCryptorAES256Settings key:encryptionKey IV:IV error:error];
    [engine addData:data error:error];
    NSData *encryptedData = [engine finishWithError:error];

    NSString *based64Encrypted = [encryptedData base64EncodedString];
    NSLog(@"Encrytped: %@", based64Encrypted);
    return based64Encrypted;
}
-(NSString*) decryptString:(NSString*)cipherText withKey:(NSString*)key error:(NSError**)error;{
    NSData *data = [NSData dataFromBase64String:cipherText];
    NSData *encryptionKey = [NSData dataFromBase64String:key];
    NSData *IV = [NSData dataFromBase64String:ENCRYPTION_IV];

    RNCryptorEngine *engine = [[RNCryptorEngine alloc] initWithOperation:kCCDecrypt settings:kRNCryptorAES256Settings key:encryptionKey IV:IV error:error];
    [engine addData:data error:error];
    NSData *decryptedData = [engine finishWithError:error];
    NSString *decryptedString = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
    NSLog(@"Decrypted: %@", decryptedString);
    return decryptedString;
}

当我使用像hello world这样的字符串时,它工作正常。 当我使用像{"username":"developer","password":"abcdefG*12"}这样的字符串时{"username":"developer","password":"abcdefG*12"}我想它与编码有关,但我真的知道该怎么用。

当我加密该字符串时,我得到一个base64字符串,当我尝试解密时,我得到一个空字符串。

UPDATE

它看起来像是失败了,因为:在json字符串中。 什么是weirder,它只会失败,字符串是JSON格式,我认为这是因为:我首先尝试,但如果我打破了任何JSON要求进一步调查,{ } s它停止工作。 它与RNEncryptor一起工作,所以我不确定我做错了什么。 无论如何,我认为我们可能会重新设计目前的流量

更新2

这是我调用这些方法的地方:

NSDictionary *credentials = @{@"username":@"developer",@"password":@"abcdefG*12"};
NSString *jsonString = [ credentials JSONStringWithOptions:JKSerializeOptionNone error:&error];
NSLog(@"json string: %@", jsonString); //OUTPUTS: {"username":"developer","password":"abcdefG*12"}
CCGEncryption *encryptionObject = [[CCGEncryption alloc] init]; //THIS IS THE OBJECT WHERE THE encrypt/decrypt methods are

NSString *encrypted = [encryptionObject encryptString:jsonString withKey:ENCRYPTION_KEY error:&error];
if(error){
    NSLog(@"Error:%@", error); //NO ERROR
}
NSString *decrypted = [encryptionObject decryptString:encrypted withKey:ENCRYPTION_KEY error:&error];
if(error){
    NSLog(@"Error:%@", error);  //NO ERROR
}
NSLog(@"decrypted: %@", decrypted); //OUTPUT: decrypted: 

您没有收集由addData:返回的数据addData: 。 该引擎会随时加密/解密,因此您无需在内存中保存整个明文和密文。 它不累积数据,除非它必须(为了填充的原因)。 我怀疑正在运行的测试的长度与没有测试的长度不同。

你是正确的,使用固定的IV是不好的做法。 如果您使用相同的IV并键入多条消息,则攻击者可能通过比较密文来恢复部分消息。 如果您在没有随机IV和HMAC的情况下使用AES-CBC,则您的AES在几个方面不安全。 这就是RNCryptor的目的所在,以及数据格式为何如此。

@jbtule是正确的,我并不特别指出人们直接使用引擎并且没有大量记录它,但是使用它并没有问题,并且我可以更好地记录它以支持它。 也就是说,发动机本身非常简单, 我只是将它创建为在加密器和解密器之间共享代码的一种方式。 如果您要绕过其提供的大部分安全性,则没有太多理由使用RNCryptor。 对于上面的代码,只需调用CCCrypt()就可以简单得多。

链接地址: http://www.djcxy.com/p/11719.html

上一篇: RNCryptor not working with JSON string

下一篇: Flatten an Object hierarchy created with d3.js nesting