2017-02-02 198 views
2

喜的需要加密这个字符串加密字符串错误

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

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

+0

嗨Praveen,你所期望的输出是什么意思,是由别人加密它从java或.net等不同平台与你共享。 – prasad

+0

雅我从先进的休息客户端@prasad得到的输出时,PHP的家伙试图解密数据,他说他正在收到一些特殊的字符 – Praveen

+0

你的意思是你打电话给一些web api和它的输出作为回应? – prasad

回答

2

这是为什么不是使用mcrypt的一个很好的例子。

输入字符串是153个字节,它需要填充到160个字节,要么指定填充选项,要么会出现错误。在这种情况下,它看起来像加密函数只需要在内存中的输入之后的任何字节。

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

加信息:mcrypt和空填充正在被使用,只需要添加足以空字节到加密数据,以使其达到块大小的整数倍(AES的块大小为16字节)。

你需要做两件事情:

1)添加尾随0×00字节,在这个例子中添加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(姓PKCS #5)填充。

+2

我喜欢它的拼写校正以前更好。 :) – matt

+1

@matt哦,亚光,亚光,亚光,我们要和你做什么。 – zaph