我正在构建一个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函数?
答案 0 :(得分:1)
首先我认为BBAES库会将结果转换为十六进制,但事实并非如此(我实际检查了源代码)。
所以唯一的逻辑推理似乎是输入是两倍的长度。例如,如果使用UTF-16(或任何其他多字节字符编码)来加密文本,就会出现这种情况。
此外,我确实看到BBAES也将IV添加到密文。与NodeJS相比,这个以及可能的一些额外的填充开销可以使密文的大小超过 over 两倍。
提示:查看二进制输入到函数的十六进制,以确保没有差异!