Вход Последовательного Монитора 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 ======");
...
Я получаю ожидаемый результат,
2 ответа
Лучший ответ:
Судя по вашим комментариям, я думаю Я понимаю, чего вы добиваетесь. Итак, предполагая, что вы прочитали некоторую строку в строковый
объект под названием input
и у вас есть массив в[8]
для заполнения, вы можете:
- Очистите массив
in[]
до заданного состояния - Скопируйте содержимое строки
в[]
В качестве кода:
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
#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();
}
}
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- В чем разница между библиотеками Software Serial? Какая из них совместима с Arduino Nano?
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Печать массива с помощью функции печати и последовательной записи в Arduino Uno
- Проблемы с последовательной связью от Arduino к Bluetooth HC-05
- Как Arduino может проверить, подключен ли он к ПК и включен ли компьютер?
- Как отправлять и получать беззнаковые целые (unsigned int) от одного arduino к другому arduino
- Использование массивов, двоичных данных и битового чтения
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