Objective -C AES:128位,CBC,IV加密?

时间:2014-07-28 22:10:39

标签: objective-c encryption aes shopify

我正在构建一个iOS客户端,用于为Shopify的Multipass生成令牌:http://docs.shopify.com/api/tutorials/multipass-login

我们的nodeJS代码工作正常(使用库https://github.com/beaucoo/multipassify),因此我将其用作参考。我发现的是cipherText(208字节)中生成的NodeJS的长度明显短于Objective-C(432字节)的长度。这是执行AES 128位,CBC,IV加密的功能:

NodeJS(正确)

multipassify.prototype.encrypt = function(plaintext) {
    // Use a random IV
    var iv = crypto.randomBytes(16);
    var cipher = crypto.createCipheriv('aes-128-cbc', this._encryptionKey,iv);

    // Use IV as first block of ciphertext
    var encrypted = iv.toString('binary') + cipher.update(plaintext, 'utf8', 'binary') + cipher.final('binary');
    return encrypted;
}

目标C(不正确?)

- (NSData *)encryptCustomerDict:(NSMutableDictionary *)customerDict{
    NSData *customerData    = [NSKeyedArchiver archivedDataWithRootObject:customerDict];

    // Random initialization vector
    NSData *iv = [BBAES randomIV];

    //  AES: 128 bit key length, CBC mode of operation, random IV
    NSData *cipherText = [BBAES encryptedDataFromData:customerData
                                                      IV:iv
                                                     key:self.encryptionKey
                                                 options:BBAESEncryptionOptionsIncludeIV];

    return cipherText;
}

`

NodeJS版本传入plainText作为参数,它应该是JSON对象customerDict的字符串化版本。理想情况下,两个函数返回的字节长度应相同。我正在使用BBAES库进行加密,不知道如何使用CommonCrypto库执行此操作。我是否正确实现了目标C函数?

1 个答案:

答案 0 :(得分:1)

首先我认为BBAES库会将结果转换为十六进制,但事实并非如此(我实际检查了源代码)。

所以唯一的逻辑推理似乎是输入是两倍的长度。例如,如果使用UTF-16(或任何其他多字节字符编码)来加密文本,就会出现这种情况。

此外,我确实看到BBAES也将IV添加到密文。与NodeJS相比,这个以及可能的一些额外的填充开销可以使密文的大小超过 over 两倍。

提示:查看二进制输入到函数的十六进制,以确保没有差异!