Реализации шифрования в режиме гаммирования (шифр “МАГМА”, ГОСТ Р 34.12-2015)

нашел библиотеку по данной тематике, но работает она скажем прямо посредственно, либо просто я не понимаю как с ней работать, что наиболее вероятно.

И???
Постарайтесь сформулировать проблему более четко, иначе ваше общение на форуме сложится неудачно.

Возможно это будет полезно:

Как правильно задать вопрос, касающийся программирования

требуется реализовать шифрование данных с помощью данной библиотеки
вот пример

#include <MagmaEncryptor.h>

/* 
 * Тестовые (проверочные) наборы данных для проверки работы библиотеки.
 * 
 * test_key - ключ шифрования;
 * test_key_1 - ключ MAC;
 * test_pt - открытый текст;
 * test_nonce - nonce;
 * tesl_len - длина проверочного открытого текста;
 * test_result - проверочный шифротекст;
 * test_MAC - проверочное значение MAC;
 * test_base_s - проверочный блок для генерации ключей.
 * 
 */

byte test_key[] =   {0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff};
byte test_key_1[] = {0xfd, 0xb9, 0x53, 0x10, 0x03, 0x05, 0x07, 0x11, 0x13, 0x17, 0x19, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0x50, 0x51, 0x52, 0x53, 0x54};

byte test_pt[19] = {
  0xee, 0xee, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
  0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
  0x33, 0x55, 0x77
};

uint32_t test_nonce = 0x11335577;
uint16_t test_len = 19;

byte test_result[19] = {
  0x0F, 0xFB, 0xFE, 0x65, 0x6B, 0x17, 0xC3, 0xD6,
  0x55, 0xCD, 0xEE, 0x52, 0x4E, 0x9D, 0x4B, 0xDB,
  0xC8, 0x6C, 0x6F
};

byte test_MAC[8] = { 0x14, 0xED, 0x14, 0x37, 0x4F, 0xB4, 0x75, 0x00 };

byte test_base_s[32] = {  // RFC 4357
  0x69, 0x00, 0x72, 0x22, 0x64, 0xC9, 0x04, 0x23,
  0x8D, 0x3A, 0xDB, 0x96, 0x46, 0xE9, 0x2A, 0xC4,
  0x18, 0xFE, 0xAC, 0x94, 0x00, 0xED, 0x07, 0x12,
  0xC0, 0x86, 0xDC, 0xC2, 0xEF, 0x4C, 0xA9, 0x2B
};

MagmaEncryptor M;
uint32_t global_nonce;
byte random_pt[19];
int epoch;

void setup() {

byte pt[19];
byte ct[19];
uint32_t nonce = 1;
uint32_t i_nonce = 1;
byte MAC[8];
byte flag;
int i,q;

  Serial.begin(115200);
  Serial.println("Start.");
  pinMode(A1,INPUT);
  pinMode(A2,INPUT);
  randomSeed(analogRead(A1));

  M.setKeys(test_key,test_key_1);

  //M.KDF(test_key,test_key_1,test_base_s,1);

  nonce = test_nonce;

  Serial.print("Encryption test...");
  
  M.lock(&nonce,test_pt,ct,test_len,MAC);

  flag = 1;
  for(i = 0; i < test_len; i++){
    if(ct[i] != test_result[i]){
      flag = 0;
      Serial.print("(first unmatched byte at position ");
      Serial.print(i,DEC);
      Serial.print(")...");
      break;
    }
  }

  if(flag){
    Serial.println("passed!");
  }else{
    Serial.println("FAILED!");
  }

  Serial.print("CMAC check...");
  flag = 1;
  for(i = 0; i < 8; i++){
    if(MAC[i] != test_MAC[i]){
      flag = 0;
      Serial.print("(first unmatched byte at position ");
      Serial.print(i,DEC);
      Serial.print(")...");
      break;
    }
  }

  if(flag){
    Serial.println("passed!");
  }else{
    Serial.println("FAILED!");
  }

  nonce = test_nonce;

  Serial.print("Decryption test (1)...");
  flag = M.unlock(&nonce,pt,ct,test_len,MAC);

  if(!flag){
    
    Serial.println("FAILED!");
      
  }else{
  
    flag = 1;
    for(i = 0; i < test_len; i++){
      if(pt[i] != test_pt[i]){
        flag = 0;
        Serial.print("(first unmatched byte at position ");
        Serial.print(i,DEC);
        Serial.print(")...");
        break;
      }
    }

    if(flag){
      Serial.println("passed!");
    }else{
      Serial.println("WRONG DECRYPT, FAILED!");
    }
  }

  nonce = test_nonce;

  ct[5] = ct[5] ^ 0B01000100;

  Serial.print("Decryption test (2)...");

  flag = M.unlock(&nonce,pt,ct,test_len,MAC);

  if(flag){
    
    Serial.println("FAILED!");
      
  }else{

    Serial.println("passed!");
    
  }
  

  global_nonce = 1;
  epoch = 1;
  for(int i = 0; i < 19; i++){
    random_pt[i] = rand();
  }

  Serial.println();

}


void loop() {

byte ct[19];
byte pt[19];
byte MAC[8];
int i,q;
uint32_t stored_nonce;

  Serial.print("Nonce: ");
  Serial.println(global_nonce, DEC);
  Serial.print("sPT: ");
  for(int i = 0; i < 19; i++){
    Serial.print('[');   
    if( random_pt[i]<=15 ){ Serial.print("0"); }
    Serial.print(random_pt[i], HEX);
    Serial.print(']');
  }

  Serial.println();

  stored_nonce = global_nonce;
  
  M.lock(&global_nonce,random_pt,ct,19,MAC);
  
  Serial.print("rCT: ");
  for(int i = 0; i < 19; i++){
    Serial.print('[');   
    if( ct[i]<=15 ){ Serial.print("0"); }
    Serial.print(ct[i], HEX);
    Serial.print(']');
  }

  Serial.println();
  q = M.unlock(&stored_nonce,pt,ct,19,MAC);

  if(q){
    Serial.print("rPT: ");
    for(int i = 0; i < 19; i++){
      Serial.print('[');   
      if( pt[i]<=15 ){ Serial.print("0"); }
        Serial.print(pt[i], HEX);
        Serial.print(']');
    }
    Serial.println();
  }else{
    Serial.println("FAILED!");
  }
  Serial.println("---");
  delay(3000);

  if(global_nonce >= 17){

    if(epoch > 10){
        
        Serial.println("Restart.");
        epoch = 1;
        global_nonce = 1;
        M.setKeys(test_key, test_key_1);
        
      }else{
        
        M.KDF(test_key,test_key_1,test_base_s,epoch++);
        global_nonce = 1;
        Serial.println("New keys (KDF).");

      }
    
  }
  
}

нужно, что бы текст набранный с клавиатуры конвертировался согласно ascii и соответственно далее зашифровывался

Я все равно не вижу вопроса в вашем сообщении.

кому требуется? - вам. Вот и реализуйте.
Тем более что у вас есть готовый пример.

Если у вас есть КОНКРЕТНЫЕ вопросы по библиотеке - скажем пример не компилируется - то мы постараемся помочь.
А вот реализовывать шифрование за вас - только в платном режиме.

1 лайк

так я не говорю что на безвозмездной основе, я думал это логично исходя из раздела.

в таком случае, вопрос: “за какую цену готовы выполнить”?

1 лайк

А, сорри, не обратил внимания что это уже на бирже.

ОК, тогда желательно полное ТЗ.
Например, если правильно понял, приложенный код уже реализует нужное шифрование. Почему он не подходит?

Так же появился вопрос при тестировании данного примера.
В какой переменной(массиве в данном случае) требуется изменять открытый текст.
Изменение заполнения “test_pt” ни к чему не привело

такс , переходим к полному тз.
Есть готовая библиотека с примером работы кода.
Требуется в соответствии с данной библиотекой реализовать шифрование информации набранной с клавиатуры, на начальном этапе банально через serial port,
и вывести результат шифрования туда же. Соответственно далее дешифровать и вывести обратно, в качестве доказательства корректности работы.

Режим шифрования - гаммирование
синхропосылку для него сейчас нужно так же вводить с клавиатуры .

“требуется изменять” - не очень понятно, что Вы имеете в виду.

Если вопрос куда помещается текст, который нужно зашифровать - то в массив test_pt

данный код вроде как должен реализовывать, но при изменении открытого текста постоянно выдает один и тот же результат, как константу
либо я просто банально не там менял его конечно, но кроме как массива данных “test_pt” ничего подходящего не обнаружил

демонстрирую
вот первое заполнение

теперь изменяем заполнение

В рекомендациях по форуму, ссылку на которую я вам давал в посте 3, разве не написано не публиковать скриншоты кода и данных?
Выложите тоже самое текстом

Хотя в принципе как хотите. Я все равно не стал бы браться за заказ, так что можете подождать реального исполнителя и с ним уже договариватся.

там сказано не рекомендуется , это просто для наглядности было, код примера в полном объёме уже выложен

а тестовый пример работает?

В целом он работает, да
Но как работать с ним, я не понял :joy:
Открытый текст не меняется