#c
#c
Вопрос:
Мне нужна небольшая, например, состоящая из двух частей, версия шифрования AES. Я погуглил и нашел AES — Advanced Encryption Standard (исходный код), но код, похоже, написан для Windows, и мне нужен многоплатформенный.
Существует ли какая-либо другая известная небольшая версия шифрования AES или исправление для используемых функций, которые, по-видимому, неизвестны в Linux?
Мой компилятор говорит, что это неизвестные функции:
./aes/AES.cpp:198:17: error: ‘_rotl’ was not declared in this scope
./aes/AES.cpp:608:20: error: ‘_rotr’ was not declared in this scope
Я также получил:
./aes/AES.cpp:764:34: error: ‘memset’ was not declared in this scope
./aes/AES.cpp:770:36: error: ‘memcpy’ was not declared in this scope
Как должно быть известно, учитывая, что они включают:
#include "AES.hpp"
#include <assert.h>
#include <stdio.h>
#include <cstdio>
#include <cstdlib>
#include <fstream>
#include <iostream>
Комментарии:
1. Вам нужно включить
<cstring>
, чтобы получитьmemset
иmemcpy
.2. Вам просто нужно заменить встроенные функции rotate либо кодом C, либо подходящей заменой для вашей платформы.
3. сначала решите проблему управления ключами : blogs.msdn.com/b/ericlippert/archive/2011/09/27 /…
Ответ №1:
Используйте хорошо протестированную криптографическую библиотеку, такую как cryptlib или OpenSSL, вместо некоторых случайных фрагментов, найденных на 40-й странице результатов поиска. В зависимости от того, что вы делаете, вам, вероятно, также следует использовать конструкции более высокого уровня, а не AES напрямую.
Комментарии:
1. ну, мне просто нужно немного шифрования, ничего особенного. Ничего действительно серьезного. Это всего лишь небольшой проект, который я делаю, чтобы оставаться в форме. Поэтому я предпочитаю что-то маленькое, даже если это может быть не так хорошо.
2. Даже если это действительно просто для того, чтобы «оставаться в форме», и вы никогда не расскажете об этом никому другому, вы все равно не делаете себе одолжения, делая что-то наполовину такое. Если вам нужна быстрая и небольшая библиотека, ознакомьтесь
libmcrypt
или что-то в этом роде.
Ответ №2:
Эталонную реализацию для AES можно найти здесь: http://www.efgh.com/software/rijndael.htm . Основной исходный файл включает только <stdio.h>
, но это даже не зависит от этого; у вас не должно возникнуть абсолютно никаких проблем с его использованием на любой платформе.
Ответ №3:
поскольку эта ошибка часто встречается в поиске Google для этой ошибки, вот что я сделал для своей программы, которая отказывалась компилироваться в системе CentOS x64, в которой отсутствует ia32intrin.h:
#if !defined(_rotr) amp;amp; (defined(__i386__) || defined(__x86_64__))
static inline unsigned int _rotr(unsigned int n, const int count) {
asm volatile (
"rorl %1, %0;"
: "=r" (n)
: "nI" (count), "0" (n)
);
return n;
}
#endif
как упоминал авакар, вам необходимо включить cstring или, альтернативно, string.h, чтобы получить memset и memcpy.
код для _rotl
будет идентичным, за исключением мнемонического кода операции, который будет roll
.