我有一个加密函数,它获取数据和 key ,带有内部 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,}; //It`s not valid. The main iv is secret
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;
}
最佳答案
问题是 cipherData
太短了。它需要比 datadata
长一个 block ,而 datadata
可能(例如在本例中)比 data.length
长。
当使用 utf-8 编码从包含多字节数据(如阿拉伯语、表情符号等)的字符串创建数据时,数据将比字符串字符长。
错误的代码:
NSMutableData * cipherData = [NSMutableData dataWithLength:data.length + kCCBlockSizeAES128];
NSData *datadata = [NSData dataWithBytes:data.UTF8String length:data.length];
Correct code:
NSData *datadata = [data dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData * cipherData = [NSMutableData dataWithLength: datadata.length + kCCBlockSizeAES128];
请注意,错误命名输入字符串 data
没有帮助,它是一个字符串。重命名 data
-> tex
然后重命名 ``datadata->
data` 使代码更清晰。好的命名可以解决很多代码问题。
关于ios - 阿拉伯字符的AES加密-Objective C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47266318/