Подтвердить что ты не робот

Поиск реализации одного файла шифрования, который может обрабатывать весь файл en/de-crypt в Delphi и C

[Обновление] Я предлагаю бонус за это. Честно говоря, мне все равно, какой метод шифрования используется. Предпочтительно что-то простое, как XTEA, RC4, BlowFish... но вы выбрали.

Я хочу с минимальными усилиями, желательно просто отбросить файлы в свои проекты и построить.

В идеале вы уже должны использовать код для en/de-crypt файла в Delphi и C (я хочу обменять файлы между микропроцессором Atmel UC3 (кодирование на C) и ПК с Windows (кодирование в Delphi) en-and-de-crypt в обоих направлениях).

У меня есть параметр strong для одного блока PAS и одного файла .C/.H. Я не хочу использовать DLL или библиотеку, поддерживающую десятки алгоритмов шифрования, только один (и я, конечно, ничего не хочу с программой установки).

Надеюсь, что здесь я не выгляжу слишком придирчивым, но я уже больше недели искал код и пытался использовать код и не могу найти две реализации, которые соответствуют. Я подозреваю, что только тот, кто уже сделал это, может мне помочь...

Спасибо заранее.


В качестве продолжения моего предыдущего сообщения, я все еще ищу очень простой код с тем, почему я могу - с минимальными усилиями - en-de crypt file и обменять его между Delphi на ПК и C на U-процессоре Atmel UC3.

Это звучит просто в теории, но на практике это кошмар. Есть много возможных кандидатов, и я провожу дни в Интернете и тестирую их - безрезультатно.

Некоторые из них представляют собой юмористические библиотеки, поддерживающие многие алгоритмы шифрования, и я хочу что-то легкое (особенно на конце C/u-процессора).

Некоторые выглядят хорошо, но один набор источников предлагает только манипуляции с блоками, другие строки (я бы предпочел полный файл en/de-crypt).

Большинство из них, по-видимому, очень плохо документированы, с бессмысленными именами параметров и без кода примера для вызова функций.

В прошлый уик-энд (плюс еще несколько дней) я сжег свой путь через XTEA, XXTEA и BlowFish, но, хотя я могу зашифровать, я не могу отменить этот процесс.

Теперь я смотрю на AES-256. Кто-нибудь знает о реализации в C, который является одним файлом AES.C? (плюс AES.H, конечно)

Откровенно говоря, я возьму все, что будет делать весь файл en/de-crypt между Delphi и C, но если кто-то действительно не сделал этого сам, я ожидаю услышать только "любую реализацию, которая соответствует стандарту" это хорошая теория, но просто не работает для меня: - (

Какой-нибудь простой AES-256 в C там? У меня есть разумный вид кода Delphi, но я не буду уверен, пока не попробую их вместе.

Спасибо заранее...

4b9b3361

Ответ 1

Вот код RC4. Это очень легкий вес.

C используется в производственной системе в течение пяти лет.

Я добавил слегка проверенный код Delphi. Паскаль является линейным портом, при этом unsigned char переходит в Byte. Я только запускаю Pascal в Free Pascal с включенной опцией Delphi, а не с Delphi. Оба C и Pascal имеют простые файловые процессоры.

Скремблирование зашифрованного текста возвращает исходный текст.

Об ошибках не сообщалось. Надеюсь, это решает вашу проблему.

rc4.h

#ifndef RC4_H
#define RC4_H

/*
 * rc4.h -- Declarations for a simple rc4 encryption/decryption implementation.
 * The code was inspired by libtomcrypt.  See www.libtomcrypt.org.
 */
typedef struct TRC4State_s {
  int x, y;
  unsigned char buf[256];
} TRC4State;

/* rc4.c */
void init_rc4(TRC4State *state);
void setup_rc4(TRC4State *state, char *key, int keylen);
unsigned endecrypt_rc4(unsigned char *buf, unsigned len, TRC4State *state);

#endif

rc4.c

void init_rc4(TRC4State *state)
{
  int x;
  state->x = state->y = 0;
  for (x = 0; x < 256; x++)
    state->buf[x] = x;
}

void setup_rc4(TRC4State *state, char *key, int keylen)
{
  unsigned tmp;
  int x, y;

  // use only first 256 characters of key 
  if (keylen > 256) 
    keylen = 256;

  for (x = y = 0; x < 256; x++) {
    y = (y + state->buf[x] + key[x % keylen]) & 255;
    tmp = state->buf[x]; 
    state->buf[x] = state->buf[y]; 
    state->buf[y] = tmp;
  }
  state->x = 255;
  state->y = y;
}

unsigned endecrypt_rc4(unsigned char *buf, unsigned len, TRC4State *state)
{
  int x, y; 
  unsigned char *s, tmp;
  unsigned n;

  x = state->x;
  y = state->y;
  s = state->buf;
  n = len;
  while (n--) {
    x = (x + 1) & 255;
    y = (y + s[x]) & 255;
    tmp = s[x]; s[x] = s[y]; s[y] = tmp;
    tmp = (s[x] + s[y]) & 255;
    *buf++ ^= s[tmp];
  }
  state->x = x;
  state->y = y;
  return len;
}

int endecrypt_file(FILE *f_in, FILE *f_out, char *key)
{
  TRC4State state[1];
  unsigned char buf[4096];
  size_t n_read, n_written;

  init_rc4(state);
  setup_rc4(state, key, strlen(key));
  do {
    n_read = fread(buf, 1, sizeof buf, f_in);
    endecrypt_rc4(buf, n_read, state);
    n_written = fwrite(buf, 1, n_read, f_out);
  } while (n_read == sizeof buf && n_written == n_read);
  return (n_written == n_read) ? 0 : 1;
}

int endecrypt_file_at(char *f_in_name, char *f_out_name, char *key)
{
  int rtn;

  FILE *f_in = fopen(f_in_name, "rb");
  if (!f_in) {
    return 1;
  }
  FILE *f_out = fopen(f_out_name, "wb");
  if (!f_out) {
    close(f_in);
    return 2;
  }
  rtn = endecrypt_file(f_in, f_out, key);
  fclose(f_in);
  fclose(f_out);
  return rtn;
}

#ifdef TEST

// Simple test.
int main(void)
{
  char *key = "This is the key!";

  endecrypt_file_at("rc4.pas", "rc4-scrambled.c", key);
  endecrypt_file_at("rc4-scrambled.c", "rc4-unscrambled.c", key);
  return 0;
}
#endif

Вот слегка проверенный Паскаль. Я могу скремблировать исходный код на C и дескремблировать его с реализацией Pascal.

type
  RC4State = record
    x, y : Integer;
    buf : array[0..255] of Byte;
  end;

  KeyString = String[255];

procedure initRC4(var state : RC4State);
var
  x : Integer;
begin
  state.x := 0;
  state.y := 0;
  for x := 0 to 255 do
    state.buf[x] := Byte(x);
end;

procedure setupRC4(var state : RC4State; var key : KeyString);
var
  tmp : Byte;
  x, y : Integer;
begin
  y := 0;
  for x := 0 to 255 do begin
    y := (y + state.buf[x] + Integer(key[1 + x mod Length(key)])) and 255;
    tmp := state.buf[x];
    state.buf[x] := state.buf[y];
    state.buf[y] := tmp;
  end;
  state.x := 255;
  state.y := y;
end;

procedure endecryptRC4(var buf : array of Byte; len : Integer; var state : RC4State);
var
  x, y, i : Integer;
  tmp : Byte;
begin
  x := state.x;
  y := state.y;
  for i := 0 to len - 1 do begin
    x := (x + 1) and 255;
    y := (y + state.buf[x]) and 255;
    tmp := state.buf[x];
    state.buf[x] := state.buf[y];
    state.buf[y] := tmp;
    tmp := (state.buf[x] + state.buf[y]) and 255;
    buf[i] := buf[i] xor state.buf[tmp]
  end;
  state.x := x;
  state.y := y;
end;

procedure endecryptFile(var fIn, fOut : File; key : KeyString);
var
  nRead, nWritten : Longword;
  buf : array[0..4095] of Byte;
  state : RC4State;
begin
  initRC4(state);
  setupRC4(state, key);
  repeat
    BlockRead(fIN, buf, sizeof(buf), nRead);
    endecryptRC4(buf, nRead, state);
    BlockWrite(fOut, buf, nRead, nWritten);
  until (nRead <> sizeof(buf)) or (nRead <> nWritten);
end;

procedure endecryptFileAt(fInName, fOutName, key : String);
var
  fIn, fOut : File;
begin
  Assign(fIn, fInName);
  Assign(fOut, fOutName);
  Reset(fIn, 1);
  Rewrite(fOut, 1);
  endecryptFile(fIn, fOut, key);
  Close(fIn);
  Close(fOut);
end;

{$IFDEF TEST}
// Very small test.
const
  key = 'This is the key!';
begin
  endecryptFileAt('rc4.pas', 'rc4-scrambled.pas', key);
  endecryptFileAt('rc4-scrambled.pas', 'rc4-unscrambled.pas', key);
end.
{$ENDIF}

Ответ 2

Я бы предложил использовать .NET Micro Framework на вторичном микроконтроллере (например, Atmel SAM7X) в качестве криптопроцессора. Вы можете проверить это на Netduino, который вы можете получить за $35/£ 30. Структура включает в себя реализацию AES внутри нее, в пространстве имен System.Security.Cryptography, наряду с множеством других криптографических функций, которые могут быть полезны для вас. Преимущество здесь в том, что вы получаете полностью протестированную и эффективную реализацию, а также повышенную безопасность с помощью безопасного кода.

Вы можете использовать SPI или I2C для обмена данными между двумя микроконтроллерами или побивать собственный протокол передачи данных по нескольким линиям ввода-вывода параллельно, если требуется более высокая пропускная способность.

Я сделал именно это с Arduino и Netduino (используя Netduino для хэш-блоков данных для аппаратного устройства BitTorrent) и реализовал рудиментарную асинхронную систему, используя различные команды, отправленные между устройствами через SPI и механизм прерывания.

  • Arduino - мастер SPI, Netduino - подчиненный SPI.
  • Вывод GPIO на Netduino устанавливается как выход и привязан к другому выводу GPIO с поддержкой прерываний на Arduino, который устанавливается как вход. Это вывод прерывания.
  • Arduino отправляет 0xF1 в качестве сообщения инициализации "привет".
  • Netduino отправляет обратно 0xF2 как acknolwedgement.
  • Когда Arduino хочет хешировать блок, он отправляет 0x48 (ASCII 'H'), за которым следуют данные. Когда выполняется отправка данных, он устанавливает CS низкий. Он должен отправлять целые байты; установка CS низкая, когда количество принятых бит не делится на 8, вызывает ошибку.
  • Netduino получает данные и отправляет обратно 0x68 (ASCII 'h'), за которым следует количество принятых байтов как 2-байтовое целое без знака. Если произошла ошибка, вместо этого он отправляет обратно 0x21 (ASCII '!').
  • Если это удалось, Netduino вычисляет хеш, а затем устанавливает прерывание. Во время вычисления Arduino может продолжать свою работу во время ожидания.
  • Arduino отправляет 0x52 (ASCII 'R') для запроса результата.
  • Netduino устанавливает низкий уровень прерывания, затем отправляет 0x72 (ASCII 'r') и исходные данные хеша.

Поскольку Arduino может обслуживать прерывания через контакты GPIO, это позволило мне сделать обработку полностью асинхронной. Переменная на стороне Arduino отслеживает, ожидаем ли мы в настоящее время на сопроцессоре для выполнения своей задачи, поэтому мы не пытаемся отправить ему новый блок, пока он все еще работает над старым.

Вы можете легко адаптировать эту схему для вычисления блоков AES.

Ответ 3

Малая библиотека C для AES-256 Илья Левин. Короткая реализация, без использования, простое использование. Не уверен, как это работает на вашем текущем микропроцессоре.

[Изменить]
Вы упоминали о реализации некоторых решений delphi, но если что-то не работает вместе, попробуйте this или это.
Также я нашел модуль arduino (avr-based), используя библиотеку Ilya, поэтому он также должен работать на вашем микропроцессоре.

Ответ 4

Можете ли вы скомпилировать C-код из Delphi (вы можете скомпилировать код Delphi из С++ Builder, не уверены в VV). Или, возможно, используйте Free Borland Command С++ компилятор или даже другой компилятор C.

Идея состоит в том, чтобы использовать тот же C-код в вашем приложении Windows, что и на вашем микропроцессоре. Таким образом, вы можете быть уверены, что код будет работать в обоих направлениях.


[Обновить] См.

http://www.drbob42.com/examines/examin92.htm
http://www.hflib.gov.cn/e_book/e_book_file/bcb/ch06.htm (с использованием кода С++ в Delphi)
http://edn.embarcadero.com/article/10156#H11

Похоже, вам нужно использовать DLL, но вы можете статически связать его, если вы не хотите распространять его

Ответ 5

Легче будет получить ссылку на AES-реализацию (которая работает с блоками) и добавить код для обработки CBC (или CTR-шифрования). Это потребует от вас добавления только 30-50 строк кода, что-то вроде следующего (для CBC):

aes_expand_key();

first_block = iv;

for (i = 0; i < filesize / 16; i++)
{
  data_block = read(file, 16);
  data_block = (data_block ^ iv);
  iv = encrypt_block(data_block);
  write(outputfile, iv);  
}

// if filesize % 16 != 0, then you also need to add some padding and encrypt the last block

Ответ 6

Предполагая, что сила шифрования не является проблемой, как и для удовлетворения требований китайской стены, очень простая схема шифрования "Sawtooth" для добавления (i ++% по модулю 256) в fgetc() для каждого байта, начиная с начало файла, может работать очень хорошо.

Объявление я как UCHAR приведет к устранению требования к модулю, поскольку однобайтное целое не может не выполнить цикл через диапазон 0-255.

Код настолько прост, что не стоит публиковать. Немного фантазии, и у вас будут некоторые приукрашивания, которые могут добавить много к силе этого cypher. Основная уязвимость этого cypher - это большие блоки одинаковых символов. Исправить это - хорошее место, чтобы начать улучшать свои силы.

Этот cypher работает с каждым возможным типом файла и особенно эффективен, если вы уже 7Zipped файл.

Производительность феноменальна. Вы даже не узнаете, что код есть. Полная привязка ввода/вывода.