【发布时间】:2011-08-31 11:34:02
【问题描述】:
我正在开发单点登录解决方案,用户无需提供用户名/密码即可登录,只需使用他们的设备 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 的一半)。
有什么线索吗?
【问题讨论】:
-
你确定你的初始化向量两边都一样吗?
-
我已经将初始化向量注销到控制台,将其复制到php,应该是一样的。
-
这是一个随机字节数组:你是用base64编码然后再解码吗?
-
我不是 base64 编码 IV,因为它只是一个 NSString。我应该这样做吗?
-
我不知道
getRandomString会产生什么类型的数据,是否可以复制粘贴,以及是否可以在 PHP 中使用。 (我真的不知道objective-c 或iOS)。你可以试试。 (或者看看你的 Objective-C 程序和 PHP 中的 base64 编码版本是否相同。)
标签: objective-c ios aes