2016-05-21 1 views
5

Прежде всего, позвольте мне сказать, что я не криптограф каким-либо образом, и я не очень хорошо пишу c-код, поэтому, пожалуйста, извините меня, если ответ на этот вопрос очевидно или ответили. Я разрабатываю программу обмена сообщениями и не могу использовать TLS на целевой платформе. В результате мне нужно найти способ шифровать каждое сообщение, используя симметричный шифр с общим общим ключом, например AES.Программа шифрования, которая работает с NodeJs и mbedtls

Я ищу способ шифрования и расшифровки данных между программой mbedtls (например, aescrypt2) на одном конце и программой nodejs на другом. Mbedtls, ранее polarssl, представляет собой библиотеку, которая обеспечивает шифрование для встроенных устройств. К исходному коду относятся некоторые примеры программ, таких как aescrypt2, rsaencrypt, ecdsa и crypt_and_hash.

Aescrypt2 прекрасно работает, когда результирующие зашифрованные данные также дешифруются с использованием aescrypt2, но я не могу получить данные, зашифрованные с помощью aescrypt, для дешифрования с использованием криптографии nodejs или любой другой программы, в том числе openssl. Например:

echo 'this is a test message' >test.txt 
aescrypt 0 test.txt test.out hex:E76B2413958B00E193 
aescrypt 1 test.out test.denc hex:E76B2413958B00E193 
cat test.denc 
this is a test message 

С OpenSSL:

openssl enc -in out.test -out outfile.txt -d -aes256 -k E76B2413958B00E193 
bad magic number 

некоторый код узла образца, который в настоящее время не работает

var crypto = require('crypto'); 
    var AESCrypt = {}; 

AESCrypt.decrypt = function(cryptkey, iv, encryptdata) { 
    encryptdata = new Buffer(encryptdata, 'base64').toString('binary'); 

    var decipher = crypto.createDecipheriv('aes-256-cbc', cryptkey, iv), 
     decoded = decipher.update(encryptdata, 'binary', 'utf8'); 

    decoded += decipher.final('utf8'); 
    return decoded; 
} 

AESCrypt.encrypt = function(cryptkey, iv, cleardata) { 
    var encipher = crypto.createCipheriv('aes-256-cbc', cryptkey, iv), 
     encryptdata = encipher.update(cleardata, 'utf8', 'binary'); 

    encryptdata += encipher.final('binary'); 
    encode_encryptdata = new Buffer(encryptdata, 'binary').toString('base64'); 
    return encode_encryptdata; 
} 

var cryptkey = crypto.createHash('sha256').update('Nixnogen').digest(), 
    iv   = 'a2xhcgAAAAAAAAAA', 
    buf  = "Here is some data for the encrypt", // 32 chars 
    enc  = AESCrypt.encrypt(cryptkey, iv, buf); 
    var dec  = AESCrypt.decrypt(cryptkey, iv, enc); 

console.warn("encrypt length: ", enc.length); 
console.warn("encrypt in Base64:", enc); 
console.warn("decrypt all: " + dec); 

Это приводит либо ошибки или мусора текста каждый раз. Я также попытался настроить различные вещи.

Я пробовал это сто разных способов, в том числе с использованием аргумента -pass pass:password безрезультатно. Используя nodejs, я либо получил плохие ошибки расшифровки, либо искаженную бессмыслицу после расшифровки. Я пробовал использовать множество обучающих программ в сети, таких как this, и предложения от this thread, и все остальное, что я могу найти. Я читал, что разные программы шифрования используют разные стандарты, поэтому совместимость между платформами/программами/языками не всегда гарантирована, но я думаю, что кто-то раньше был в этом предрассудке и знает решение?

Как бы я, используя nodejs, расшифровать данные, зашифрованные aescrypt2 (или такой программой)? Я только смог заставить его работать с помощью вызова exec системы и с помощью узла выполнить aescrypt2 для дешифрования/шифрования данных, что не является идеальным, поскольку оно значительно замедляет работу. Я открыт для использования другой программы, чем aescrypt2. Единственным требованием является то, что он должен работать в Linux, не может использовать openssl libs (потому что они не поддерживаются в целевой системе), программа должна быть небольшой и простой из-за ограничений по пространству, и, прежде всего, шифрование/дешифрование должно быть совместим с nodejs. Любая помощь приветствуется.

+1

Как этот код на C? –

+0

В настоящее время я пытаюсь использовать пример программы mesblt aescrypt: https://github.com/ARMmbed/mbedtls/blob/development/programs/aes/aescrypt2.c, и она не работает ни с одной из библиотек узла cryto. Я ищу источник, который делает, или способ заставить его работать. –

+0

замедлить работу и сделать некоторое исследование о том, как написать код. –

ответ

2

Как я, используя nodejs, расшифровывать данные, зашифрованные aescrypt2 (или такой программой)?

Извините, но лучшего ответа нет, потому что он делает то же самое, что делает aescrypt2 при расшифровке файла. Вы связались с источником самостоятельно, поэтому просто выполните те же шаги в node.js, что и в C в расшифровке.

Прежде всего, ознакомиться с layout of the file containing the encrypted data:

/* 
    * The encrypted file must be structured as follows: 
    * 
    *  00 .. 15    Initialization Vector 
    *  16 .. 31    AES Encrypted Block #1 
    *   .. 
    *  N*16 .. (N+1)*16 - 1 AES Encrypted Block #N 
    * (N+1)*16 .. (N+1)*16 + 32 HMAC-SHA-256(ciphertext) 
    */ 

Так что вам нужно извлечь IV, зашифрованные блоки и HMAC из файла, а не пытаться расшифровать все это, как вы пытаетесь с openssl (ваш пример openssl также не использует правый IV, а скорее пытается извлечь его из предоставленного ключа - прочитайте man page).

Затем нажмите ключ справа. для шифрования/дешифрования не тот, который указан в командной строке, а 8192 итерации хэширования IV с ключом, переданным в командной строке, с использованием SHA256.

Наконец, они расшифровывают, используя AES-256-ECB (ваши примеры openssl и node.js используют CBC!), Каждые 16 байт и XOR the result с пронумерованными 16 байтами (IV используется для первых 16 байтов).

Там может быть и больше, я просто перечислял наиболее очевидные вещи, которые я видел при чтении кода aescrypt2.c.

Так что я советую: попробуйте написать ту же логику в node.js и попытайтесь найти вызовы crypto node.js для соответствующих mbedtls-аналогов.

Я не эксперт в криптографии, но я уверен, что в реализации аскрипта так много сложностей (например, генерация фактического ключа), потому что они знают, как делать криптографию и просто делают это правильно ,

+0

Спасибо, честно говоря, я даже не был уверен, какой шифр aescrypt2 использовался по умолчанию, так что это окончательно помогает. Я, скорее всего, в конце концов приму этот ответ, если кто-то не предложит более легкое решение в ближайшие два дня. Я попробую ваш совет и отчитаюсь завтра. Еще раз спасибо. –

+0

рад, что я мог бы помочь. Как уже упоминалось, причина, по которой путь aescrypt2 кажется не простой, скорее всего, потому что это необходимо сделать таким образом, чтобы весь процесс шифрования был безопасным ... – grasbueschel

+0

В руководстве говорится: «Фактический IV для использования : это должно быть представлено в виде строки, состоящей только из шестнадцатеричных цифр. Когда только ключ задается с использованием опции -K, IV должен быть явно определен.Когда пароль задается с использованием одной из других опций, IV генерируется из этого пароля. ' - Означает ли это, что я буду жестко кодировать IV для использования для каждого сообщения, если он не будет получен из ключа? Если бы я использовал другое сообщение IV, это бы побеждало точку предварительного ключа, верно? –