2014-07-28 2 views
0

Я строй клиент 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?

+1

Проблема со многими из этих библиотек заключается в том, что они не обеспечивают совместимость и не документируют внутреннюю работу, то есть как примитивы используются и объединяются. Переходя с Common Crypto на стороне iOS/OSX, по крайней мере, ясно, что именно делается. – zaph

ответ

1

Сначала я подумал, что библиотека BBAES преобразует результат в шестнадцатеричные, но это, похоже, не так (я действительно проверил исходный код).

Таким образом, единственная логическая аргументация состоит в том, что входной сигнал двойной длины. Это может быть, например, если UTF-16 (или любая другая многобайтовая кодировка символов) используется для шифрования текста.

Кроме того, я вижу, что BBAES добавляет IV к зашифрованному тексту. Это и, возможно, дополнительные дополнительные накладные расходы могут сделать достаточную разницу для того, чтобы зашифрованный текст был по сравнению с в два раза больше по сравнению с NodeJS.

Подсказка: просмотрите двоичный вход в свои функции в шестнадцатеричных цифрах, чтобы убедиться, что нет различий!

+0

+1 для просмотра гексагона! Вы должны посмотреть на гексагон, чтобы увидеть проблему, если вы не видите проблему, вы не можете решить проблему (перефразируя Willy Jack). – zaph

+0

@ Zaph Где +1? Вы * обещали * (sniff): P –

+0

К сожалению, я думал, что я нажал! – zaph

Смежные вопросы