ios - 字符串加密错误

标签 ios objective-c encryption

您好,需要加密该字符串

NSString *iv = @"12345678910111211";
NSString *key = @"12345678910111211";

NSString *dataString2 = @"eJDRqD_1ME0:APA91bFRfuy6Xk0GMVHtFLKjw5eZnqoGQ7wdTYjXdLGPqOVGuApv_eaZQzHQmqhqTKN70mspUt6BpZFFnCGn4j2y0Ew-eS1SnghLQZNxNAbh9LSgCjviWGe2wwCCW132jqW5E_aaxL5g";

NSData *dataIn2 = [dataString2 dataUsingEncoding:NSUTF8StringEncoding];
NSData *result2 = [BBAES encryptedDataFromData:dataIn2 IV:ivData key:symKey options:0]; // result = 16bytes
NSData *hexaData2 = result2;
NSString *DataHexadecimalString2 = [hexaData2 hexadecimalString];
NSLog(@"Encrypted hexa  = %@", DataHexadecimalString2);

我得到的输出是:

6bd95973e91de1330e3195098104116b0f888533bfeb0f20edcbcdf66a9e5d79676b8b33b62c470454003dc5013d92efb191b1b07e320b1cff59874007191d72be18e8b2784dcfc8c2960b59879b9c14c42421105ac356d5bccc7ee0f70122f8c2a47743984ba453a02b82b7ddd770fd5284483d3581c818076f9c87569345ab558c2e286ceb1388d6444042ecb10d0ccb294488ed51c86de20b85b076bb2d85

预期输出是这样的:

6bd95973e91de1330e3195098104116b0f888533bfeb0f20edcbcdf66a9e5d79676b8b33b62c470454003dc5013d92efb191b1b07e320b1cff59874007191d72be18e8b2784dcfc8c2960b59879b9c14c42421105ac356d5bccc7ee0f70122f8c2a47743984ba453a02b82b7ddd770fd5284483d3581c818076f9c87569345ab558c2e286ceb1388d6444042ecb10d0c46530088a27a522ba365d6942a83ac41

不知道我做错了什么。谁能帮帮我吗?

最佳答案

这是一个很好的例子,说明了为什么使用mcrypt

输入字符串为 153 字节,需要填充到 160 字节,要么指定填充选项,否则会出错。在这种情况下,加密函数看起来只是采用了内存中输入后面的任何字节。

一种解决方案是指定 PKCS#7(née PKCS#5)填充。

添加信息:mcrypt 正在使用空填充,只需向加密数据添加足够的空字节即可使其达到 block 大小的精确倍数(AES block 大小为 16 字节) )。

你需要做两件事:

1) 添加尾随 0x00 字节,在本例中添加 8:

NSString *dataString2 = @"eJDRqD_1ME0:APA91bFRfuy6Xk0GMVHtFLKjw5eZnqoGQ7wdTYjXdLGPqOVGuApv_eaZQzHQmqhqTKN70mspUt6BpZFFnCGn4j2y0Ew-eS1SnghLQZNxNAbh9LSgCjviWGe2wwCCW132jqW5E_aaxL5g\x00\x00\x00\x00\x00\x00\x00\x00";

2) 在 BBAES 中删除 PKCS#7 填充

CCCryptorStatus status = CCCryptorCreate(operation, kCCAlgorithmAES128, kCCOptionPKCS7Padding, [key bytes], [key length], [iv bytes], &cryptor);

CCCryptorStatus status = CCCryptorCreate(operation, kCCAlgorithmAES128, 0, [key bytes], [key length], [iv bytes], &cryptor);

仅使用通用加密(警告,示例中不进行错误检查):

NSData *ivData  = [@"0q1z2a3a4p5a6789" dataUsingEncoding:NSUTF8StringEncoding];
NSData *keyData = [@"9876a5p4a3a2z1q0" dataUsingEncoding:NSUTF8StringEncoding];
NSData *encryptedData = [@"eJDRqD_1ME0:APA91bFRfuy6Xk0GMVHtFLKjw5eZnqoGQ7wdTYjXdLGPqOVGuApv_eaZQzHQmqhqTKN70mspUt6BpZFFnCGn4j2y0Ew-eS1SnghLQZNxNAbh9LSgCjviWGe2wwCCW132jqW5E_aaxL5g\x00\x00\x00\x00\x00\x00\x00\x00" dataUsingEncoding:NSUTF8StringEncoding];

NSMutableData *plainData = [NSMutableData dataWithLength: encryptedData.length];
size_t movedBytes = 0;
CCCryptorStatus ccStatus;
ccStatus = CCCrypt(kCCEncrypt,
                   kCCAlgorithmAES128,
                   0, // Bad idea not to use PKCS#7 padding (kCCOptionPKCS7Padding)
                   keyData.bytes, kCCKeySizeAES128,
                   ivData.bytes,
                   encryptedData.bytes, encryptedData.length,
                   plainData.mutableBytes, plainData.length,
                   &movedBytes);

plainData.length = movedBytes;
NSLog(@"Data: \n%@",plainData);

您当然可以使用代码循环添加空字节,但最好不要使用 mcrypt 并使用 PKCS#7(née PKCS#5)填充。

关于ios - 字符串加密错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42006736/

相关文章:

ios - 导入和 UIAlertView

iphone - 对于 iOS 上的所有图像文件,PNG 是否优于 JPEG?

ios - 知道如何更改 Digits 发送的消息以确认电话号码吗?

ios - isEqualToString 没有按预期工作?

ios - SpriteKit 中的 AdMob 插页式广告

iphone - @property(nonatomic)ivar @property(nonatomic,assign)ivar 相同还是不同?

iphone - PageviewController 未按正确顺序显示 View Controller

cordova - 如何加密Cordova插件源代码

ios - 使用公钥的 RSA 加密

android - 从 Whatsapp 获取所有消息