0

I am trying to 3DES encryption using Serial Read, Found this 3DES Sample code in 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 ==========");
 
 //encrypt
 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);
 
 //decrypt
 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("Decrypt...");
 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();
}

I want to get user serial input from Serial Monitor to feed byte in[]. Which will encrypt user input, I will pad user input to 8 Bytes or restrict input to 8.

Library: https://github.com/Octoate/ArduinoDES

Could any one help me to get data from user input.

Edit 1: I was able to read the String to char and feed to byte in[] changed the code,

#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(); // read the incoming data as string
 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);
 }
}

But I don't think getting the correct, Please find the below, enter image description here

But when I feed manually like below,

...
input.toCharArray(buf, input.length() + 1);
 Serial.println(buf);
 //tdesTest();
 byte out[8];
 byte in[] = {"12345678"}; //Manually feeding hardcoding the value need to get the value from serial read to here
 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 ======");
...

I get the expected output,

enter image description here

asked Jul 2, 2021 at 6:44
9
  • majenko.co.uk/blog/reading-serial-arduino Commented Jul 2, 2021 at 9:41
  • Hi @Majenko, Thanks for the reply, I can read the serial string from while (Serial.available > 0) { a = Serial.readString(); // read the incoming data as string } But I could not find a way to feed it to the "byte in[ ]" in tdesTest Method due to unable to feed the string. Commented Jul 2, 2021 at 13:05
  • Well, that all depends on what format your input is in and what format you need to feed into the in array. Commented Jul 2, 2021 at 13:10
  • I want to input String from Serial and convert it to Char and feed to in[ ] @Majenko Commented Jul 2, 2021 at 13:46
  • Yes, I gathered that. But what is in the string, and how does that relate to what would be put into in[]? Commented Jul 2, 2021 at 13:48

2 Answers 2

1

From your comments I think I understand what you are after. So, assuming you have read some string into a String object called input and you have an array in[8] to populate you can:

  1. Clear the in[] array to a preset state
  2. Copy the string content into in[]

As code:

memset(in, 0, 8); // Erase the contents of in[]
input.toCharArray((char *)in, 8); // Copy up to 8 bytes from the string
answered Jul 2, 2021 at 14:17
1
  • Comments are not for extended discussion; this conversation has been moved to chat. Commented Jul 3, 2021 at 9:02
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();
 }
}
answered Jul 3, 2021 at 7:55

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.