2015-02-24 5 views
0

Я получаю сообщение «Ошибка: ошибка: 06065064: подпрограммы с цифровым конвертом: EVP_DecryptFinal_ex: плохой дешифровать», когда я пытаюсь расшифровать строку на стороне nodejs ,Шифрование AES128-CBC на mbed микроконтроллере (C++) и дешифрование AES128-CBC в nodejs

Я знаю, что для лучшей безопасности я должен использовать случайный IV и всегда менять IV для каждого нового шифрования, и я также должен реализовать аутентификацию, но для того, чтобы понять это и исправить проблему «плохой расшифровки», я будет придерживаться чего-то простого. Как только я могу зашифровать и расшифровать на mbed и nodejs, я буду реализовывать случайные/изменяющиеся IV и HMAC для повышения безопасности.

Я хотел был бы зашифровать данные датчика на стороне mbed и расшифровать данные датчика в nodejs, однако при попытке расшифровать данные со стороны nodejs я получаю ошибку «плохой расшифровки». Как исправить ошибку «плохой дешифровки»?

mbed зашифрованные данные:
D90E1518FF2E5D79D6F848BCB4A49BCAE3ADDC6F1D6E04265613968CFF242855C10C619C8E281A33DA690039274AA65ECAFA05631C7BB38815442E780E27E34F2B6C4B9FE1B18678077227A05ACB233D8B8A81412E584A6ECAD10397FCF36072B043F93D67B63678A5D385B402D88AF99A62E12413E7BBFDB920B51F732C0933

mbed C++ код:

#include "mbed.h" 
#include "Crypto.h" 
#include "MbedJSONValue.h" 
#include "LinearTempSensor.h" 
#include "TimeUtilities.h" 
#include <string> 

Serial pc(USBTX, USBRX); 

RealTimeClock rtc; 

LinearTempSensor sensor(p20, 1000, LinearTempSensor::MCP9701); 

//unsigned char myKEY[16] = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,}; 
//unsigned char myIV[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, }; 
unsigned char myKEY[16] = { 'm', 'n', 'b', 'v', 'c', 'x', 'z', 'l', 'k', 'j', 'h', 'g', 'f', 'd', 's', 'a' }; 
unsigned char myIV[16] = { 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'p', 'o', 'i', 'u', 'y', 't', 'r' }; 

unsigned char a[0x80] = { }; 

float Vout, Tav, To; 

int main() 
{ 
    pc.baud(115200); 

    MbedJSONValue sensorResults; 
    std::string s; 

    //Create JSON 
    sensorResults["Data1"][0] = "Result"; 
    sensorResults["Data1"][1] = 5.5; 
    sensorResults["Data2"][0] = "Result"; 
    sensorResults["Data2"][1] = 700; 
    sensorResults["Data3"][0] = "Result"; 
    sensorResults["Data3"][1] = 65.7; 

    Vout = sensor.Sense();   // Sample data (read sensor) 
    Tav = sensor.GetAverageTemp(); // Calculate average temperature from N samples 
    To = sensor.GetLatestTemp(); // Calculate temperature from the latest sample 

    //Serialize JSON 
    s = sensorResults.serialize(); 
    //sl = s.size(); 

    //Print JSON string 
    pc.printf("json: %s\r\n", s.c_str()); 

    //Convert JSON string to a char array to encrypt 
    //char *a=new char[s.size()+1]; 
    a[s.size()]=0; 
    memcpy(a,s.c_str(),s.size()); 

    //Print the char array to serial terminal 
    pc.printf("\r\nJSON Char array"); 

    for(char i=0; i<s.size(); i++) 
    { 
     if(i%16==0) pc.printf("\r\n"); 
     pc.printf("%.2X",s[i]); 
    } 

    AES myAES(AES_128, myKEY, myIV, CBC_MODE); // specify all params, look at BlockCipher.h for modes 
    pc.printf("\r\n\r\nFirst run\r\n"); 
    myAES.encrypt(a,a,0x80); // same in and out buffer can be used 
    pc.printf("\r\nEncrypted"); 
    for(char i=0; i<0x80; i++) 
    { 
     //if(i%16==0) pc.printf("\r\n"); 
     pc.printf("%.2X",a[i]); 
    } 

    pc.printf("\r\nDecrypted again"); 
    myAES.decrypt(a,a,0x80); 
    for(char i=0; i<0x80; i++) 
    { 
     //if(i%16==0) pc.printf("\r\n"); 
     pc.printf("%.2X",a[i]); 
    } 

} 

nodejs код:

var crypto = require("crypto") 

function encrypt(key, data, iv) { 
     var cipher = crypto.createCipheriv('aes-128-cbc', key, iv); 
     var crypted = cipher.update(text, 'utf-8', 'hex'); 
     crypted += cipher.final('hex'); 

     return crypted; 
} 

function decrypt(key, data, iv) { 
     var decipher = crypto.createDecipheriv('aes-128-cbc', key, iv); 
     var decrypted = decipher.update(data, 'hex', 'utf-8'); 
     decrypted += decipher.final('utf-8'); 

     return decrypted; 
} 

var key = "mnbvcxzlkjhgfdsa"; 
var iv = "asdfghjklpoiuytr"; 

var text = "{\"Data1\":[\"Result\",5.50],\"Data2\":[\"Result\",700],\"Data3\":[\"Result\",65.70]}"; 
console.log("Original Text: " + text); 

var endata = "D90E1518FF2E5D79D6F848BCB4A49BCAE3ADDC6F1D6E04265613968CFF242855C10C619C8E281A33DA690039274AA65ECAFA05631C7BB38815442E780E27E34F2B6C4B9FE1B18678077227A05ACB233D8B8A81412E584A6ECAD10397FCF36072B043F93D67B63678A5D385B402D88AF99A62E12413E7BBFDB920B51F732C0933"; 
var decryptedText = decrypt(key, endata, iv); 
console.log("Decrypted Text: " + decryptedText); 

UPDATE:
Я послал C++ зашифрованы/расшифрованные данные на мой последовательный терминал, чтобы увидеть, что выглядит данные, как:

json: {"Data1":["Result",5.50],"Data2":["Result",700],"Data3":["Result",65.70]}

JSON Char array 7B224461746131223A5B22526573756C 74222C352E35305D2C22446174613222 3A5B22526573756C74222C3730305D2C 224461746133223A5B22526573756C74 222C36352E37305D7D

First run

Encrypted D90E1518FF2E5D79D6F848BCB4A49BCAE3ADDC6F1D6E04265613968CFF242855C10C619C8E281A33DA690039274AA65ECAFA05631C7BB38815442E780E27E34F2B6C4B9FE1B18678077227A05ACB233D8B8A81412E584A6ECAD10397FCF36072B043F93D67B63678A5D385B402D88AF99A62E12413E7BBFDB920B51F732C0933

Decrypted again 7B224461746131223A5B22526573756C74222C352E35305D2C224461746132223A5B22526573756C74222C3730305D2C224461746133223A5B22526573756C74222C36352E37305D7D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

+0

@StefanoSanfilippo Нет, Node.js не работает правильно. Nodejs выдает ошибку «плохой расшифровки». – dottedquad

+0

Так что 'endata' - это то, что ваш код на C++ отправляет в JS, а' text' - это то, что должен быть вход, не так ли? –

+0

@StefanoSanfilippo Да, endata - это то, что мой код на C++ отправляет в JS, а текст - это то, как должны выглядеть дешифрованные данные. Я обновлю свое сообщение, чтобы показать, как должны выглядеть шифрованные/незашифрованные данные C++. – dottedquad

ответ

2

Ваше сообщение не дополняется, но Расшифруйте в Node ожидает PKCS#7 padding входа и не выполняется, когда ни один не найден. Отключение отступы по телефону Decipher.setAutoPadding():

function decrypt(key, data, iv) { 
     var decipher = crypto.createDecipheriv('aes-128-cbc', key, iv); 
     decipher.setAutoPadding(false); 
     var decrypted = decipher.update(data, 'hex', 'utf-8'); 
     decrypted += decipher.final('utf-8'); 

     return decrypted; 
} 
+0

Я все еще получаю «плохой Расшифровать» ошибка 'вар endata = новый буфер («D90E1518FF2E5D79D6F848BCB4A49BCAE3ADDC6F1D6E04265613968CFF242855C10C619C8E281A33DA690039274AA65ECAFA05631C7BB38815442E780E27E34F2B6C4B9FE1B18678077227A05ACB233D8B8A81412E584A6ECAD10397FCF36072B043F93D67B63678A5D385B402D88AF99A62E12413E7BBFDB920B51F732C0933»,«наговор»); // var endatabuffer = new Buffer (endata, "hex"); var decryptedText = decrypt (ключ, endata, iv); console.log («Расшифрованный текст:» + decryptedText); ' – dottedquad

+0

Я копировал длинную огромную строку. Кажется, что строка была перемещена так, чтобы она могла вписываться в область комментариев без прокрутки. [Вот изображение моей IDE] http://imagizer.imageshack.us/a/img661/8391/HiIq9B.png – dottedquad

+1

Yup ...После нескольких проверок выяснилось, что проблема была дополнением, фактический ввод в порядке, и вам не нужен буфер (я должен был прочитать 'update' docs). –

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