阿拉伯字符的AES加密 - Objective C

5
我有一个加密函数,它接收数据和密钥以及内部 iv,并返回一个加密后的字符串。我可以加密只包含英文字符的每个字符串,但不能处理阿拉伯文。这是我的函数,请帮助我找出问题所在。谢谢
-(NSString*)Encrypt:(NSString*)data second:(NSString*)key
    {
        size_t outLength;
        NSMutableData * cipherData = [NSMutableData dataWithLength:data.length + kCCBlockSizeAES128];
        Byte byte[] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,}; //这不是有效的值,主要的iv需要保密
        NSData *datakey = [NSData dataWithBytes:key.UTF8String length:key.length];
        NSData *datadata = [NSData dataWithBytes:data.UTF8String length:data.length];
        CCCryptorStatus result = CCCrypt( kCCEncrypt
                                        , kCCAlgorithmAES128
                                        , kCCOptionPKCS7Padding
                                        , datakey.bytes
                                        , [datakey length]
                                        , byte
                                        , datadata.bytes
                                        , [datadata length]
                                        , cipherData.mutableBytes
                                        , cipherData.length
                                        , &outLength);

if (result == kCCSuccess) { cipherData.length = outLength; } else {
} NSData *encryptedData=cipherData; NSString *str=[encryptedData base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength]; return str; }

2
你说无法加密,是什么错误? - Shebuka
1
我敢打赌,你遇到了utf8不规则字节大小和数据缓冲区无效大小的问题。 - user28434'mstep
1
@Shebuka,在加密之前没有将其转换为base64的必要。请删除该评论。 - zaph
1
@MehdiGilanpour 这只是一种安全的做法,通常加密的目的就是为了保证安全性。 - zaph
2
@zaph 这里的密钥派生非常不安全,重复使用 IV 几乎不是最紧迫的问题。 :D (但是,Zaph 对于 IV 是完全正确的。这段代码在多个方面都非常不安全。) - Rob Napier
显示剩余6条评论
1个回答

2

问题在于cipherData太短了。它需要比datadata多一个块,而datadata可能会比data.length更长(例如在这种情况下)。

使用UTF-8编码从包含多字节数据的字符串创建数据(例如阿拉伯语、表情符号等)时,数据长度将大于字符串字符数。

错误代码:

NSMutableData * cipherData = [NSMutableData dataWithLength:data.length + kCCBlockSizeAES128];
NSData *datadata = [NSData dataWithBytes:data.UTF8String length:data.length];

正确的代码:

NSData *datadata = [data dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData * cipherData = [NSMutableData dataWithLength: datadata.length + kCCBlockSizeAES128];  

请注意,将输入字符串 data 命名错误并不能帮助解决问题,它只是一个字符串。将 data 重命名为 tex 然后 ``datadata->data` 使代码更加清晰易懂。良好的命名可以解决许多代码问题。

1
难道不应该是 data.UTF8String.length 吗?或者更好的方式是 [data dataUsingEncoding:NSUTF8StringEncoding] - Sulthan
1
@Sulthan,没有data.UTF8String.length(UTF8String是char*)。但是,是的,应该是dataUsingEncoding:NSUTF8StringEncoding。否则,你需要调用lengthOfBytesUsingEncoding: - Rob Napier
2
@RobNapier 没错,你说得对。否则字符串仍然会被截断。 - Sulthan
1
NSData *datadata = [NSData dataWithBytes:data.UTF8String length:data.length]; 是错误的,因为 data.length 是字符串中字符的数量,这个数量比 UTF-8 编码中字节数要小。 - Rob Napier
2
我的不好!好的,我看到错误了,已经改正。这就是盲目复制代码而没有认真查看的后果。 - zaph
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接