Вход Последовательного Монитора Arduino, шифрование 3DES

Я пытаюсь использовать шифрование 3DES с помощью последовательного чтения, нашел этот пример кода 3DES в Github,

#include <DES.h>
DES des;
void setup() {
  Serial.begin(9600);
  Serial.println("Hello!");
}
void loop() {
  desTest();
  tdesTest();
  delay(2000);
}
void desTest()
{
  byte out[8];
  byte in[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
  byte key[] = { 0x3b, 0x38, 0x98, 0x37, 0x15, 0x20, 0xf7, 0x5e };
  
  Serial.println();
  Serial.println("========= DES test ==========");
  
  //шифрование
  Serial.print("Encrypt...");
  unsigned long time = micros();
  des.encrypt(out, in, key);
  time = micros() - time;
  Serial.print("done. (");
  Serial.print(time);
  Serial.println(" micros)");
  printArray(out);
  
  //расшифровать
  for (int i = 0; i < 8; i++)
  {
    in[i] = out[i];
  }
  Serial.print("Decrypt...");
  time = micros();
  des.decrypt(out, in, key);
  time = micros() - time;
  Serial.print("done. (");
  Serial.print(time);
  Serial.println(" micros)");
  printArray(out);
}
void tdesTest()
{
  byte out[8];
  byte in[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
  byte key[] = { 
                  0x3b, 0x38, 0x98, 0x37, 0x15, 0x20, 0xf7, 0x5e, // key A
                  0x92, 0x2f, 0xb5, 0x10, 0xc7, 0x1f, 0x43, 0x6e, // key B
                  0x3b, 0x38, 0x98, 0x37, 0x15, 0x20, 0xf7, 0x5e, // key C (in this case A)
                };
  
  Serial.println();
  Serial.println("====== Triple-DES test ======");
  
  //encrypt
  Serial.print("Encrypt...");
  unsigned long time = micros();
  des.tripleEncrypt(out, in, key);
  time = micros() - time;
  Serial.print("done. (");
  Serial.print(time);
  Serial.println(" micros)");
  printArray(out);
  
  //decrypt
  for (int i = 0; i < 8; i++)
  {
    in[i] = out[i];
  }
  Serial.print("Зашифровать...");
  time = micros();
  des.tripleDecrypt(out, in, key);
  time = micros() - time;
  Serial.print("done. (");
  Serial.print(time);
  Serial.println(" micros)");
  printArray(out);
}
void printArray(byte output[])
{
  for (int i = 0; i < 8; i++)
  {
    if (output[i] < 0x10)
    {
      Serial.print("0");
    }
    Serial.print(output[i], HEX);
    Serial.print(" ");
  }
  Serial.println();
}

Я хочу получить последовательный ввод пользователя с последовательного монитора для ввода байта в[]. Который будет шифровать ввод пользователя, я увеличу ввод пользователя до 8 байт или ограничу ввод до 8.

Библиотека: https://github.com/Octoate/ArduinoDES

Может ли кто-нибудь помочь мне получить данные из пользовательского ввода.

Правка 1: Я смог прочитать строку в символ и передать в байт в[] изменил код,

#include <DES.h>
DES des;

String  input;

char buf[30];
void setup() {
  Serial.begin(9600);
  Serial.println("Hello!");

}


void printArray(byte output[])
{
  for (int i = 0; i < 8; i++)
  {
    if (output[i] < 0x10)
    {
      Serial.print("0");
    }
    Serial.print(output[i], HEX);
    Serial.print(" ");
  }
  Serial.println();
}
void loop() {

  while (Serial.available() > 0) {

    String  input = Serial.readString(); // считывает входящие данные в виде строки
    char buf[30];
/*
    input.toCharArray(buf, 9);
    Serial.println(buf);
*/
    input.toCharArray(buf, input.length() + 1);
    Serial.println(buf);

    
    byte out[8];
    byte in[] = {buf};
    Serial.println(buf);
    byte key[] = {
      0x3b, 0x38, 0x98, 0x37, 0x15, 0x20, 0xf7, 0x5e, // key A
      0x92, 0x2f, 0xb5, 0x10, 0xc7, 0x1f, 0x43, 0x6e, // key B
      0x3b, 0x38, 0x98, 0x37, 0x15, 0x20, 0xf7, 0x5e, // key C (in this case A)
    };

    Serial.println();
    Serial.println("====== Triple-DES test ======");

    //encrypt
    Serial.print("Encrypt...");
    unsigned long time = micros();
    des.tripleEncrypt(out, in, key);
    time = micros() - time;
    Serial.print("done. (");
    Serial.print(time);
    Serial.println(" micros)");
    printArray(out);

    //decrypt
    for (int i = 0; i < 8; i++)
    {
      in[i] = out[i];
    }
    Serial.print("Decrypt...");
    time = micros();
    des.tripleDecrypt(out, in, key);
    time = micros() - time;
    Serial.print("done. (");
    Serial.print(time);
    Serial.println(" micros)");
    printArray(out);
    delay(2000);
  }


}

Но я не думаю, что получаю правильное, Пожалуйста, найдите ниже,

Но когда я кормлю вручную,как показано ниже,

...
input.toCharArray(buf, input.length() + 1);
    Serial.println(buf);

    //tdesTest();
    byte out[8];
    byte in[] = {"12345678"}; //Ручная подача жесткого кодирования значения, необходимого для получения значения из последовательного чтения сюда
    Serial.println(buf);
    byte key[] = {
      0x3b, 0x38, 0x98, 0x37, 0x15, 0x20, 0xf7, 0x5e, // key A
      0x92, 0x2f, 0xb5, 0x10, 0xc7, 0x1f, 0x43, 0x6e, // key B
      0x3b, 0x38, 0x98, 0x37, 0x15, 0x20, 0xf7, 0x5e, // key C (in this case A)
    };

    Serial.println();
    Serial.println("====== Triple-DES test ======");
...

Я получаю ожидаемый результат,

, 👍0

Обсуждение

https://majenko.co.uk/blog/reading-serial-arduino, @Majenko

Привет @Majenko, Спасибо за ответ, я могу прочитать последовательную строку из while (Serial.available > 0) { a = Serial.ReadString(); // считывает входящие данные в виде строки } Но я не смог найти способ передать его в "байт в[ ]" в методе tdesTest из-за невозможности передать строку., @Vinod Amarathunga

Ну, это все зависит от того, в каком формате вы вводите данные и в каком формате вам нужно вводить данные в массив "in"., @Majenko

Я хочу ввести "Строку из последовательного и преобразовать ее в "Символ" и передать в " в[ ] @Majenko, @Vinod Amarathunga

Да, я это понял. Но *что находится в строке* и *как это связано с тем, что будет помещено в " в[]`*?, @Majenko

Строка-это данные, которые необходимо зашифровать, которые будут отправлены в " в [ ]` для шифрования с использованием библиотеки DES., @Vinod Amarathunga

байт в[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; будет заменен на Символ в [] = {Data_from_SerialRead}, @Vinod Amarathunga

'a.c_str() дает вам указатель массива char *` на внутренний буфер данных строки. Это то, что вам нужно?, @Majenko

@Majenko Спасибо, не могли бы вы привести мне пример, найденный в Интернете, но я понятия не имею, как его использовать., @Vinod Amarathunga


2 ответа


Лучший ответ:

1

Судя по вашим комментариям, я думаю Я понимаю, чего вы добиваетесь. Итак, предполагая, что вы прочитали некоторую строку в строковый объект под названием input и у вас есть массив в[8] для заполнения, вы можете:

  1. Очистите массив in[] до заданного состояния
  2. Скопируйте содержимое строки в[]

В качестве кода:

memset(in, 0, 8); // Стереть содержимое in[]
input.toCharArray((char *)in, 8); // Скопируйте до 8 байт из строки

,

Комментарии не предназначены для расширенного обсуждения; этот разговор был [перенесен на chat](https://chat.stackexchange.com/rooms/127135/discussion-on-answer-by-majenko-arduino-serial-monitor-input-3des-encryption)., @Majenko


1
#include <DES.h>
DES des;
byte in[8];
String  input;

char buf[30];
void setup() {
  Serial.begin(9600);
  Serial.println("Hello!");

}

void tdesTest() {
  byte out[8];


  byte key[] = {
    0x3b, 0x38, 0x98, 0x37, 0x15, 0x20, 0xf7, 0x5e, // key A
    0x92, 0x2f, 0xb5, 0x10, 0xc7, 0x1f, 0x43, 0x6e, // key B
    0x3b, 0x38, 0x98, 0x37, 0x15, 0x20, 0xf7, 0x5e, // key C (in this case A)
  };

  Serial.println();
  Serial.println("====== Triple-DES test ======");

  //encrypt
  Serial.print("Encrypt...");
  unsigned long time = micros();
  des.tripleEncrypt(out, in, key);
  time = micros() - time;
  Serial.print("done. (");
  Serial.print(time);
  Serial.println(" micros)");
  printArray(out);

  //decrypt
  for (int i = 0; i < 8; i++)
  {
    in[i] = out[i];
  }
  Serial.print("Decrypt...");
  time = micros();
  des.tripleDecrypt(out, in, key);
  time = micros() - time;
  Serial.print("done. (");
  Serial.print(time);
  Serial.println(" micros)");
  printArray(out);
  delay(2000);
}


void printArray(byte output[])
{
  for (int i = 0; i < 8; i++)
  {
    if (output[i] < 0x10)
    {
      Serial.print("0");
    }
    Serial.print(output[i], HEX);
    Serial.print(" ");
  }
  Serial.println();
}

void loop() {

  while (Serial.available() > 0) {

    String  input = Serial.readString(); // read the incoming data as string
    memset(in, 0, 9); // Erase the contents of in[]
    input.toCharArray((char *)in, 9); // Copy up to 8 bytes from the string
    tdesTest();


  }
}
,