Я строй клиент IOS для создания маркеров для Multipass Shopify в: http://docs.shopify.com/api/tutorials/multipass-loginЦель -C AES: 128 бит, CBC, IV Шифрование?
Нашего nodeJS код работает отлично (с использованием библиотеки https://github.com/beaucoo/multipassify), поэтому я использую, что в качестве ссылки. Я выяснил, что длина cipherText
, сгенерированная в NodeJS
(208 байт), значительно короче, чем длина для 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;
}
Objective 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?
Проблема со многими из этих библиотек заключается в том, что они не обеспечивают совместимость и не документируют внутреннюю работу, то есть как примитивы используются и объединяются. Переходя с Common Crypto на стороне iOS/OSX, по крайней мере, ясно, что именно делается. – zaph