【问题标题】:AES Encrypting, in objective-c, using init vector, decrypt on phpAES加密,在objective-c中,使用init向量,在php上解密
【发布时间】: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


【解决方案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 十六进制值都有一个对应的 '\315'

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

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

在你的 mcrypt 调用中使用这个 $iv 字符串

【讨论】:

    猜你喜欢
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 2011-03-06
    • 1970-01-01
    • 2015-11-09
    相关资源
    最近更新 更多