阿拉伯字符的 AES 加密 - 目标 C

Meh*_*our 5 objective-c arabic ios

我有一个加密函数,它获取数据和密钥,带有内部 iv 并返回一个加密的字符串。我可以加密每个只包含英文字符但不包含阿拉伯语的字符串。这是我的职能。请帮我找出问题所在。谢谢

-(NSString*)Encrypt:(NSString*)data second:(NSString*)key
    {
        size_t outLength;
        NSMutableData * cipherData = [NSMutableData dataWithLength:data.length + kCCBlockSizeAES128];
        字节字节[] = {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 结果 = CCCrypt( kCCEncrypt
                                        , kCC算法AES128
                                        , kCCOptionPKCS7Padding
                                        , datakey.bytes
                                        , [数据密钥长度]
                                        , 字节
                                        , datadata.bytes
                                        , [数据数据长度]
                                        , cipherData.mutableBytes
                                        , cipherData.length
                                        , &outLength);

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

Run Code Online (Sandbox Code Playgroud)

zap*_*aph 2

问题是cipherData太短了。它需要是一个比datadata可能(例如在本例中)长的块data.length

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

不正确的代码:

NSMutableData * cipherData = [NSMutableData dataWithLength:data.length + kCCBlockSizeAES128];
NSData *datadata = [NSData dataWithBytes:data.UTF8String length:data.length];
Run Code Online (Sandbox Code Playgroud)

正确代码:

NSData *datadata = [data dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData * cipherData = [NSMutableData dataWithLength: datadata.length + kCCBlockSizeAES128];  
Run Code Online (Sandbox Code Playgroud)

请注意,错误命名输入字符串data并没有帮助,它是一个字符串。重命名data->tex然后“datadata ->data”使代码更加清晰。良好的命名可以解决许多代码问题。

  • @RobNapier 哦,是的,你是对的。否则字符串仍会被截断。 (2认同)
  • 我的错!好的,我看到了错误,已更正。这就是我在没有真正查看的情况下盲目复制代码所得到的结果。 (2认同)