2013-09-03 2 views
3

Я искал высоко и низко для решения, которое и зашифровать на сервере Node.js и Objective-C клиента, и наоборот, используя AES (или другой, если это уместно)Шифрование и дешифрование IOS, Node.js AES

Я Я относительно новичок в криптографии, и понимание того, почему мой зашифрованный текст отличается на каждом языке, я не знаю.

Это то, что я до сих пор:

Node.js криптографические методы Using this CryptoJS Library - node-cryptojs-aes

var node_cryptojs = require("node-cryptojs-aes"); 
var CryptoJS = node_cryptojs.CryptoJS; 

    var textToEncrypt = 'Hello'; 
var key_clear = 'a16byteslongkey!'; 

//encrypted + decrypted 

var encrypted = CryptoJS.AES.encrypt(clearText, key_clear, { iv: null }); 
var decrypted = CryptoJS.AES.decrypt(encrypted, key_clear, { iv: null }); 

//Outputs 
    console.log("encrypted: " + encrypted);  //encrypted: U2FsdGVkX1/ILXOjqIw2Vvz6DzRh1LMHgEQhDm3OunY= 
console.log("decrypted: " + decrypted.toString(CryptoJS.enc.Utf8)); // decrypted: Hello 

Objective-C методы крипто Using AESCrypt library

NSString* textToEncrypt = @"Hello"; 

// encrypt 
NSString* encryptedText = [AESCrypt encrypt:textToEncrypt password:@"a16byteslongkey!"]; 

// decrypt 
NSString* decryptedText = [AESCrypt decrypt:encryptedText password:@"a16byteslongkey!"]; 

// output 
NSLog(@"Text to encrypt: %@", textToEncrypt); // Text to encrypt: Hello 
NSLog(@"Encrypted text: %@", encryptedText);  // Encrypted text: wY80MJyxRRJdE+eKw6kaIA== 
NSLog(@"Decrypted text: %@", decryptedText);  // Decrypted text: Hello 

Я был царапая голову целую вечность и пробовал все, что я могу придумать. Может отображать основные криптологические методы из библиотек, если это необходимо. Хэш SHAR256 применяется к ключу в библиотеке AESCrypt, но я удалил это и думаю, что есть некоторая ошибка с строковой кодировкой.

ответ

0
  1. Вы уверены, что тот же ключ используется в обеих библиотеках? Вы говорите, что вы достали часть SHA-256 в AESCrypt, как библиотека теперь использует параметр пароля? Алгоритм AES может использовать только ключи длиной 16, 24 или 32 байта. Ваш пароль имеет длину 16 байт, но вы изменили соответствующий параметр на 128 (вместо 256) в функции шифрования? Знаете ли вы, как CryptoJS использует ключевой параметр? Вы уверены, что он используется напрямую или может быть некоторая обработка (например, хэширование) до того, как она будет передана в базовую примитивную функцию шифрования AES?

  2. В каком режиме шифрования используется библиотека CryptoJS? В его документации не говорится. Учитывая, что он просит IV, это, вероятно, CBC, но вам нужно будет посмотреть на источник, чтобы знать наверняка. Документация AESCrypt утверждает, что используется режим CBC, но вы не даете ему нигде. Это должно означать, что он генерирует его где-то или всегда использует фиксированный. (Какая половина проигрывает цели режима CBC, но это еще одна история). Поэтому вам нужно выяснить, что такое IV.

TL; DR: если вы не убедитесь, что тот же самый ключ и длина ключа, тот же режим, и тот же IV используются по обе библиотеки, то вы будете иметь различный шифрованный текст.

9

Я размещаю это здесь, потому что есть другие, которые пытаются объединить Node.js и iOS. Кажется, что все зацикливаются на том, чтобы держать все в правильных структурах, буферах, струнах и т. Д. Я знаю, что знаю. Итак, вот пошаговый процесс создания ключа, создания iv, шифрования, дешифрования и размещения в base64 для легкой передачи:

JavaScript (Узел.JS с помощью модуля CryptoJS)

// Generate key from password and salt using SHA256 to hash and PDKDF2 to harden 
    var password = "123456789"; 
    var salt = "gettingsaltyfoo!"; 
    var hash = CryptoJS.SHA256(salt); 
    var key = CryptoJS.PBKDF2(password, hash, { keySize: 256/32, iterations: 1000 }); 
    console.log("Hash :",hash.toString(CryptoJS.enc.Base64)); 
    console.log("Key :",key.toString(CryptoJS.enc.Base64)); 

    // Generate a random IV 
    var iv = CryptoJS.lib.WordArray.random(128/8); 
    console.log("IV :",iv.toString(CryptoJS.enc.Base64)); 

    // Encrypt message into base64 
    var message = "Hello World!"; 
    var encrypted = CryptoJS.AES.encrypt(message, key, { iv: iv }); 
    var encrypted64 = encrypted.ciphertext.toString(CryptoJS.enc.Base64); 
    console.log("Encrypted :",encrypted64); 

    // Decrypt base64 into message again 
    var cipherParams = CryptoJS.lib.CipherParams.create({ ciphertext: CryptoJS.enc.Base64.parse(encrypted64) }); 
    var decrypted = CryptoJS.AES.decrypt(cipherParams, key, { iv: iv }).toString(CryptoJS.enc.Utf8); 
    console.log("Decrypted :",decrypted); 

IOS SDK с помощью CommonCrypto

// Generate key from password and salt using SHA256 to hash and PDKDF2 to harden 
    NSString* password = @"123456789"; 
    NSString* salt = @"gettingsaltyfoo!"; 
    NSMutableData* hash = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH]; 
    NSMutableData* key = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH]; 
    CC_SHA256(salt.UTF8String, (CC_LONG)strlen(salt.UTF8String), hash.mutableBytes); 
    CCKeyDerivationPBKDF(kCCPBKDF2, password.UTF8String, strlen(password.UTF8String), hash.bytes, hash.length, kCCPRFHmacAlgSHA1, 1000, key.mutableBytes, key.length); 
    NSLog(@"Hash : %@",[hash base64EncodedStringWithOptions:0]); 
    NSLog(@"Key : %@",[key base64EncodedStringWithOptions:0]); 

    // Generate a random IV (or use the base64 version from node.js) 
    NSString* iv64 = @"ludWXFqwWeLOkmhutxiwHw==";  // Taken from node.js CryptoJS IV output 
    NSData* iv = [[NSData alloc] initWithBase64EncodedString:iv64 options:0]; 
    NSLog(@"IV : %@",[iv base64EncodedStringWithOptions:0]); 

    // Encrypt message into base64 
    NSData* message = [@"Hello World!" dataUsingEncoding:NSUTF8StringEncoding]; 
    NSMutableData* encrypted = [NSMutableData dataWithLength:message.length + kCCBlockSizeAES128]; 
    size_t bytesEncrypted = 0; 
    CCCrypt(kCCEncrypt, 
      kCCAlgorithmAES128, 
      kCCOptionPKCS7Padding, 
      key.bytes, 
      key.length, 
      iv.bytes, 
      message.bytes, message.length, 
      encrypted.mutableBytes, encrypted.length, &bytesEncrypted); 
    NSString* encrypted64 = [[NSMutableData dataWithBytes:encrypted.mutableBytes length:bytesEncrypted] base64EncodedStringWithOptions:0]; 
    NSLog(@"Encrypted : %@",encrypted64); 

    // Decrypt base 64 into message again 
    NSData* encryptedWithout64 = [[NSData alloc] initWithBase64EncodedString:encrypted64 options:0]; 
    NSMutableData* decrypted = [NSMutableData dataWithLength:encryptedWithout64.length + kCCBlockSizeAES128]; 
    size_t bytesDecrypted = 0; 
    CCCrypt(kCCDecrypt, 
      kCCAlgorithmAES128, 
      kCCOptionPKCS7Padding, 
      key.bytes, 
      key.length, 
      iv.bytes, 
      encryptedWithout64.bytes, encryptedWithout64.length, 
      decrypted.mutableBytes, decrypted.length, &bytesDecrypted); 
    NSData* outputMessage = [NSMutableData dataWithBytes:decrypted.mutableBytes length:bytesDecrypted]; 
    NSString* outputString = [[NSString alloc] initWithData:outputMessage encoding:NSUTF8StringEncoding]; 
    NSLog(@"Decrypted : %@",outputString); 

Выход должен быть таким же

/* 
     Hash : AEIHWLT/cTUfXdYJ+oai6sZ4tXlc4QQcYTbI9If/Moc= 
     Key : WdHhJ19dSBURBA25HZSpbCJ4KnNEEgwzqjgyTBqa3eg= 
     IV : ludWXFqwWeLOkmhutxiwHw== 
     Encrypted : D3JpubesPMgQTiXbaoxAIw== 
     Decrypted : Hello World! 
    */ 

Надеюсь, это спасает кого-то время я 0 потрачено впустую :)

+0

Это спасло меня после стольких ложных запусков. Я хочу организовать парад для @Aku! – user1272965

+0

СПАСИБО (да, колпачки, потому что я борется часами). – tomidelucca

+0

Рад, что я мог помочь! – Aku

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