AES加密,在objective-c中,使用init向量,在php上解密

时间:2011-08-31 11:34:02

标签: objective-c ios aes

我正在开发解决方案的单点登录,用户只需使用设备ID就可以登录而无需提供用户名/密码。

我使用CCCrypt来加密设备ID以及i-vector。我使用以下脚本:

http://code.google.com/p/iphone-lib/source/browse/trunk/categories/NSData%2BExtension.m

它在设备本身上工作正常,加密和解密,但是当我希望PHP解密加密的设备ID时,我只得到大约一半的数据,其余的是胡言乱语。

示例:(注意,测试我只是将加密的字符串和iv直接复制/粘贴到我的php脚本中)

/**
 * Gets and encrypts the device id. Returns an array where element 0 is the id, and element 1 is the initialization vector used
 * @return NSSArray
 */
- (NSArray *)getEncryptedDeviceId
{    
    NSMutableArray *data = [[NSMutableArray alloc] init];

    NSString *deviceId = [DeviceUtil UDID];
    NSString *initVector = [[[NSString alloc] getRandomString:16] autorelease];
    NSData* encrypted = [[deviceId dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO] aesEncryptWithKey:SINGLE_SIGNON_KEY initialVector:initVector];

    NSLog(@"%@ => %@", initVector, [encrypted base64EncodedString]);

    [data addObject:[[encrypted base64EncodedString] urlencodedValue]];
    [data addObject:initVector];

    return data;
}

然后我尝试用这个php函数解密数据

public static function decryptData($data, $iv)
{   
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, self::_MCRYPT_SECRET, base64_decode($data), MCRYPT_MODE_CBC, $iv));
}

我得到的回报是这样的:5gV?eAw?Vla.5A-A756-ACE482DD53A2(大约是ID的一半)。

任何线索?

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作... 从XCode中,以十六进制格式定义16个值的初始化向量,最好是随机的...... 对于这个例子,我使用相同的(复制/粘贴)...

const char iv[16] = { 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,   0xcd, 0xcd, 0xcd, 0xcd };

然后在此iv声明之后在代码的一行中放置一个断点,并查看控制台。您会注意到每个0xcd十六进制值都有一个对应的'\ _3'

获取所有16 \ 315或控制台中出现的任何值,并在php中创建一个字符串,如下所示

$iv = "\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315";

在mcrypt调用中使用此$ iv字符串