Да, сервер естественно будет анализировать правильность, корректность, опять же отправив одну команду повторно, злоумышленник ничего не добьётся, главное чтобы он общую картину не смог повторить.
Все уже давно придумано до нас. aes256_cbc_enc(); aes256_cbc_dec();
aes256 подразумевает 256 битный ключ, а не 128, как у тебя, потом удивляются почему говнокод не работает.
Я конечно не спец по AES, но вы хоть тему то читали?
Задача при одинаковых исходных данных получить разные шифро данные, а какая нахрен разница между AES 128 AES 256?
Мой код кстати работает, и если вы расшифруете исходные данные (естественно при изменении кода шифрования из исходника) - с меня как минимум литр качественного самогона.
Почитал про AES cbc - если я правильно понял то это использование предыдущего результата шифрования блока как код для шифрования следующего, но в целях текущей задачи это хрень, поскольку первый код все равно будет одинаковым.
Разница в длине ключа, для aes128 - 128 бит, для aes256 - 256 бит. Если чо, то это 16 и 32 байта, соответственно.
andycat пишет:
если я правильно понял то это использование предыдущего результата шифрования блока как код для шифрования следующего, но в целях текущей задачи это хрень, поскольку первый код все равно будет одинаковым.
Значит неправильно понял. Для cbc режима шифрования используются вектор инициализации и ключ шифрования. Вектор инициализации заполняется случайными значениями и передается вместе с шифром. Даже если шифруешь одно и то же, результат всегда будет разным.
Разница в длине ключа, для aes128 - 128 бит, для aes256 - 256 бит. Если чо, то это 16 и 32 байта, соответственно.
andycat пишет:
если я правильно понял то это использование предыдущего результата шифрования блока как код для шифрования следующего, но в целях текущей задачи это хрень, поскольку первый код все равно будет одинаковым.
Значит неправильно понял. Для cbc режима шифрования используются вектор инициализации и ключ шифрования. Вектор инициализации заполняется случайными значениями и передается вместе с шифром. Даже если шифруешь одно и то же, результат всегда будет разным.
Приведите пример кода, я думаю многие с удовольствием будут использовать для защиты от школьников передачи через интернет.
Задача при одинаковых исходных данных получить разные шифро данные, а какая нахрен разница между AES 128 AES 256?
Если это вся проблема - используют подсолку. Перед исходными данным для шифрования добавляют пару байт случайного числа (это и есть подсолка в криптографии) и шифруют это в CBC (если все в один блок влезло - то и без CBC годно). Понятно что при одинаковых данных и разных случайных шифрованые получатся разные. После дешифрации подсолку просто игнорируют.
Задача при одинаковых исходных данных получить разные шифро данные, а какая нахрен разница между AES 128 AES 256?
Если это вася проблема - используют подсолку. Перед исходными данным для шифрования добавляют пару байт случайного числа (это и есть подсолка в криптографии) и шифруют это в CBC (если все в один блок влезло - то и без CBC годно). Понятно что при одинаковых данных и разных случайных шифрованые получатся разные. После дешифрации подсолку просто игнорируют.
И? Что вы показали данной фразой)
Почему раньше пример реального кода не привели)
Теоретик как и обычно я вам говорил)
Задача при одинаковых исходных данных получить разные шифро данные, а какая нахрен разница между AES 128 AES 256?
Если это вася проблема - используют подсолку. Перед исходными данным для шифрования добавляют пару байт случайного числа (это и есть подсолка в криптографии) и шифруют это в CBC (если все в один блок влезло - то и без CBC годно). Понятно что при одинаковых данных и разных случайных шифрованые получатся разные. После дешифрации подсолку просто игнорируют.
И? Что вы показали данной фразой) Почему раньше пример реального кода не привели) Теоретик как и обычно я вам говорил)
andycat, у тя в сообщении количество открывающих и закрывающих скобок не сходится!
ПС. Ты забыл где на форуме раздел в котором умные пишут для богатых? ;)
Здравствуйте! Я начинающий, так сказать, попытался сделать что-то вроде проверочной страницы с полем для ввода зашифрованного сообщения AES128 и применением PHP-скрипта, приведенного здесь. Но вылезли ошибки.. Короче говоря - как расшифровать в HEX данные с контроллера (скетч в начале темы) по средствам PHP? Может кто подправит.. Спасибо заранее!
В этом то и суть придумать меняющуюся метку, понятную серверу, но сложно понимаемую злоумышленнику, который например может попытаться передать фальшивые координаты авто с правильным imei. Как таковое шифрование не нужно.
придумал, работает, данные как открытый ключ + добавок индексом из закрытого массива ключей, формируем из этого хэш, на стороне PHP обратная процедура, индекс на двух сторонах синхронизируется
Именно! :)))
итак попробовал я AES - беда :( - зашифрованные данные всегда одинаковые если исходник одинаковый
тестовый скетч и результат:
#include <avr/wdt.h> #include <avr\pgmspace.h> #include <EEPROM.h> #include <AESLib.h> char gprs_imei_code[60]; // crypto key + crypro imei + crypto data char original_imei_code[20]; char testline[] = "867856037506554"; byte key[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; void setup() { Serial.begin(9600); strcpy(original_imei_code, testline); strcpy(gprs_imei_code,original_imei_code); aes128_enc_single(key, gprs_imei_code); showLog("enc",gprs_imei_code); aes128_dec_single(key, gprs_imei_code); showLog("dec",gprs_imei_code); aes128_enc_single(key, gprs_imei_code); showLog("enc",gprs_imei_code); aes128_dec_single(key, gprs_imei_code); showLog("dec",gprs_imei_code); aes128_enc_single(key, gprs_imei_code); showLog("enc",gprs_imei_code); aes128_dec_single(key, gprs_imei_code); showLog("dec",gprs_imei_code); aes128_enc_single(key, gprs_imei_code); showLog("enc",gprs_imei_code); aes128_dec_single(key, gprs_imei_code); showLog("dec",gprs_imei_code); aes128_enc_single(key, gprs_imei_code); showLog("enc",gprs_imei_code); aes128_dec_single(key, gprs_imei_code); showLog("dec",gprs_imei_code); aes128_enc_single(key, gprs_imei_code); showLog("enc",gprs_imei_code); aes128_dec_single(key, gprs_imei_code); showLog("dec",gprs_imei_code); } void loop() { } void encodeIMEI() { } void showLog (char *titlestr, char *logstr) { Serial.print(titlestr); Serial.print("~ "); byte i = 0; for (i=0;i<16;++i) { if ((logstr[i] >= 0x20) && (logstr[i] < 0x7F)) { Serial.write(logstr[i]); } else { Serial.print(" 0x"); Serial.print(logstr[i], HEX); Serial.print(" "); } } /*while (logstr[i] > 0) { if ((logstr[i] >= 0x20) && (logstr[i] < 0x7F)) { Serial.write(logstr[i]); } else { Serial.print(" 0x"); Serial.print(logstr[i], HEX); Serial.print(" "); } ++i; }*/ Serial.println(" ~"); } enc~ 0xFFFFFFB7 0xFFFFFF83 A 0xFFFFFFB8 0xFFFFFF98 0xFFFFFFC4 0xFFFFFFF6 n 0xFFFFFFE1 0xFFFFFFA5 0xFFFFFFF5 ` 0xFFFFFFF0 0xFFFFFF82 2 0xFFFFFFCB ~ dec~ 867856037506554 0x0 ~ enc~ 0xFFFFFFB7 0xFFFFFF83 A 0xFFFFFFB8 0xFFFFFF98 0xFFFFFFC4 0xFFFFFFF6 n 0xFFFFFFE1 0xFFFFFFA5 0xFFFFFFF5 ` 0xFFFFFFF0 0xFFFFFF82 2 0xFFFFFFCB ~ dec~ 867856037506554 0x0 ~ enc~ 0xFFFFFFB7 0xFFFFFF83 A 0xFFFFFFB8 0xFFFFFF98 0xFFFFFFC4 0xFFFFFFF6 n 0xFFFFFFE1 0xFFFFFFA5 0xFFFFFFF5 ` 0xFFFFFFF0 0xFFFFFF82 2 0xFFFFFFCB ~ dec~ 867856037506554 0x0 ~ enc~ 0xFFFFFFB7 0xFFFFFF83 A 0xFFFFFFB8 0xFFFFFF98 0xFFFFFFC4 0xFFFFFFF6 n 0xFFFFFFE1 0xFFFFFFA5 0xFFFFFFF5 ` 0xFFFFFFF0 0xFFFFFF82 2 0xFFFFFFCB ~ dec~ 867856037506554 0x0 ~ enc~ 0xFFFFFFB7 0xFFFFFF83 A 0xFFFFFFB8 0xFFFFFF98 0xFFFFFFC4 0xFFFFFFF6 n 0xFFFFFFE1 0xFFFFFFA5 0xFFFFFFF5 ` 0xFFFFFFF0 0xFFFFFF82 2 0xFFFFFFCB ~ dec~ 867856037506554 0x0 ~ enc~ 0xFFFFFFB7 0xFFFFFF83 A 0xFFFFFFB8 0xFFFFFF98 0xFFFFFFC4 0xFFFFFFF6 n 0xFFFFFFE1 0xFFFFFFA5 0xFFFFFFF5 ` 0xFFFFFFF0 0xFFFFFF82 2 0xFFFFFFCB ~ dec~ 867856037506554 0x0 ~итак попробовал я AES - беда :( - зашифрованные данные всегда одинаковые если исходник одинаковый
Было бы странно ожидать от AES другого поведения :) :) :)
итак попробовал я AES - беда :( - зашифрованные данные всегда одинаковые если исходник одинаковый
Было бы странно ожидать от AES другого поведения :) :) :)
я надеялся :)
буду думать дальше искать удобную и для клиента и для сервера логику работы.....
Используй CBC режим. И будет тебе щастье.
итак выбрал метод добавления случайных цифр в случаные позиции отправляемой строки с дальнейшим шифрованием AES128
ниже скетч и результат, первый столбец шестнадцатиричный набор байт, потом время кодирования (в среднем меньше 3 миллисекунд), и результат расшифровки
#include <avr/wdt.h> #include <avr\pgmspace.h> #include <EEPROM.h> #include <AESLib.h> char gprs_imei_code[70]; // crypto key + crypro imei + crypto data char original_imei_code[20]; char testline[] = "867856037506554"; byte master_key[] = {255, 1, 2, 127, 4, 5, 6, 7, 8, 9, 10, 99, 12, 13, 14, 15}; char rrnd1_imei[33]; char rrnd2_imei[17]; void setup() { Serial.begin(9600); strcpy(original_imei_code, testline); //strcpy(gprs_imei_code, original_imei_code); randomSeed(analogRead(A2)); } void loop() { unsigned long tms = micros(); encodeIMEI(); tms = micros() - tms; Serial.print(gprs_imei_code); Serial.print(" "); Serial.print(tms, DEC); Serial.print(" "); decodeIMEI(); Serial.println(gprs_imei_code); delay(1000); } void decodeIMEI() { // decode hex for (byte i = 0; i < 16; ++i) { byte pb = gprs_imei_code[i * 2]; if (pb >= 0x41) pb = pb - 0x37; else pb = pb - 0x30; rrnd1_imei[i] = pb * 16; pb = gprs_imei_code[i * 2 + 1]; if (pb >= 0x41) pb = pb - 0x37; else pb = pb - 0x30; rrnd1_imei[i] = rrnd1_imei[i] + pb; } aes256_dec_single(master_key, rrnd1_imei); for (byte i = 0; i < 16; ++i) { byte pb = gprs_imei_code[i * 2 + 32]; if (pb >= 0x41) pb = pb - 0x37; else pb = pb - 0x30; rrnd2_imei[i] = pb * 16; pb = gprs_imei_code[i * 2 + 33]; if (pb >= 0x41) pb = pb - 0x37; else pb = pb - 0x30; rrnd2_imei[i] = rrnd2_imei[i] + pb; } aes256_dec_single(master_key, rrnd2_imei); // strcat rrnd1_imei[16] = 0; rrnd2_imei[16] = 0; strcat(rrnd1_imei, rrnd2_imei); // find changed chars #define fixlenght 15 // fixed lenght real data for (byte i = 0; i < fixlenght; ++i) { for (byte j = 0; j < 4; ++j) { byte ppc = rrnd1_imei[j]; if (ppc >= 0x41) ppc -= 0x37; else ppc -= 0x30; if (i == ppc) { gprs_imei_code[i] = rrnd1_imei[4 + fixlenght + j]; break; } else { gprs_imei_code[i] = rrnd1_imei[i + 4]; } } } gprs_imei_code[fixlenght] = 0; } void encodeIMEI() { // add random chars byte orlen = strlen(original_imei_code); if (orlen > 16) orlen = 16; byte posrnd[4]; for (byte i = 0; i < 4; ++i) { l1: byte trb = random(orlen); if (i > 0) { boolean flex = false; for (byte j = 0; j < i; ++j) { if (trb == posrnd[j]) { flex = true; break; } } if (flex) goto l1; else posrnd[i] = trb; } else { posrnd[i] = trb; } if (posrnd[i] > 9) gprs_imei_code[i] = posrnd[i] + 0x37; else gprs_imei_code[i] = posrnd[i] + 0x30; } for (byte i = 0; i < orlen; ++i) { for (byte j = 0; j < 4; ++j) { if (i == posrnd[j]) { gprs_imei_code[4 + orlen + j] = original_imei_code[i]; gprs_imei_code[i + 4] = (random(10) + 0x30); break; } else { gprs_imei_code[4 + i] = original_imei_code[i]; } } } // add chars to 32 lenght byte lastlen = 32 - 8 - orlen; for (byte k = 0; k < lastlen; ++k) { gprs_imei_code[k + 8 + orlen] = (random(10) + 0x30); } for (byte k = 0; k < 16; ++k) rrnd1_imei[k] = gprs_imei_code[k]; rrnd1_imei[16] = 0; aes256_enc_single(master_key, rrnd1_imei); for (byte k = 0; k < 16; ++k) rrnd2_imei[k] = gprs_imei_code[k + 16]; rrnd2_imei[16] = 0; aes256_enc_single(master_key, rrnd2_imei); // convert to HEX for (byte i = 0; i < 16; ++i) { byte tb = rrnd1_imei[i]; byte pb = tb / 16; if (pb < 10) gprs_imei_code[i * 2] = pb + 0x30; else gprs_imei_code[i * 2] = pb + 0x37; pb = tb % 16; if (pb < 10) gprs_imei_code[i * 2 + 1] = pb + 0x30; else gprs_imei_code[i * 2 + 1] = pb + 0x37; } for (byte i = 0; i < 16; ++i) { byte tb = rrnd2_imei[i]; byte pb = tb / 16; if (pb < 10) gprs_imei_code[i * 2 + 32] = pb + 0x30; else gprs_imei_code[i * 2 + 32] = pb + 0x37; pb = tb % 16; if (pb < 10) gprs_imei_code[i * 2 + 33] = pb + 0x30; else gprs_imei_code[i * 2 + 33] = pb + 0x37; } // end line gprs_imei_code[64] = 0; }Изобретатель велосипеда.
Все уже давно придумано до нас. aes256_cbc_enc(); aes256_cbc_dec();
aes256 подразумевает 256 битный ключ, а не 128, как у тебя, потом удивляются почему говнокод не работает.
Изобретатель велосипеда.
Все уже давно придумано до нас. aes256_cbc_enc(); aes256_cbc_dec();
aes256 подразумевает 256 битный ключ, а не 128, как у тебя, потом удивляются почему говнокод не работает.
Я конечно не спец по AES, но вы хоть тему то читали?
Задача при одинаковых исходных данных получить разные шифро данные, а какая нахрен разница между AES 128 AES 256?
Мой код кстати работает, и если вы расшифруете исходные данные (естественно при изменении кода шифрования из исходника) - с меня как минимум литр качественного самогона.
Почитал про AES cbc - если я правильно понял то это использование предыдущего результата шифрования блока как код для шифрования следующего, но в целях текущей задачи это хрень, поскольку первый код все равно будет одинаковым.
Приведите пример кода, я думаю многие с удовольствием будут использовать для защиты от школьников передачи через интернет.
Если это вся проблема - используют подсолку. Перед исходными данным для шифрования добавляют пару байт случайного числа (это и есть подсолка в криптографии) и шифруют это в CBC (если все в один блок влезло - то и без CBC годно). Понятно что при одинаковых данных и разных случайных шифрованые получатся разные. После дешифрации подсолку просто игнорируют.
Если это вася проблема - используют подсолку. Перед исходными данным для шифрования добавляют пару байт случайного числа (это и есть подсолка в криптографии) и шифруют это в CBC (если все в один блок влезло - то и без CBC годно). Понятно что при одинаковых данных и разных случайных шифрованые получатся разные. После дешифрации подсолку просто игнорируют.
И? Что вы показали данной фразой)
Почему раньше пример реального кода не привели)
Теоретик как и обычно я вам говорил)
Если это вася проблема - используют подсолку. Перед исходными данным для шифрования добавляют пару байт случайного числа (это и есть подсолка в криптографии) и шифруют это в CBC (если все в один блок влезло - то и без CBC годно). Понятно что при одинаковых данных и разных случайных шифрованые получатся разные. После дешифрации подсолку просто игнорируют.
andycat, у тя в сообщении количество открывающих и закрывающих скобок не сходится!
ПС. Ты забыл где на форуме раздел в котором умные пишут для богатых? ;)
andycat, у тя в сообщении количество открывающих и закрывающих скобок не сходится!
ПС. Ты забыл где на форуме раздел в котором умные пишут для богатых? ;)
[/quote]
ничего не понял, ну и ладно, спишем на вашу интелектуальную недоразвитость :)
//прототип функции void aes128_cbc_enc(const uint8_t* key, const uint8_t* iv, void* data, const uint16_t data_len); #define DATALEN 16 //должно быть кратны 16 u8 key[16]={....};//ключ 16 байт u8 iv[16];//Вектор инициализации, заполняем случайными значениями u8 data[DATALEN ];//Данные aes128_cbc_enc(key, iv, data, DATALEN);//Шифруем Send(iv, DATALEN+16);//отправляем вектор и данныеНа приемной стороне получаем вектор инициализации и данные, вызываем
//прототип функции void aes128_cbc_enc(const uint8_t* key, const uint8_t* iv, void* data, const uint16_t data_len); #define DATALEN 16 //должно быть кратны 16 u8 key[16]={....};//ключ 16 байт u8 iv[16];//Вектор инициализации, заполняем случайными значениями u8 data[DATALEN ];//Данные aes128_cbc_enc(key, iv, data, DATALEN);//Шифруем Send(iv, DATALEN+16);//отправляем вектор и данныеНа приемной стороне получаем вектор инициализации и данные, вызываем
Спасибо, посмотрю, попробую.
На другой стороне PHP сервер, так что там уже другая задача будет все это дело разобрать.
<?php $cryptcipher = "rijndael-128"; $cryptmode = "ecb"; //$text = "5432109876543210"; $text = $_POST['str']; $key = "0123456789012345"; $str= AESCrypt($text, $key, $cryptcipher, $cryptmode, 0); echo "Crypt string: ". bin2hex($str). "<br>"; echo $str."<br>"; $str= AESCrypt($str, $key, $cryptcipher, $cryptmode, 1); echo "Decrypt string: ". bin2hex($str). "<br>"; echo $str."<br>"; /* Функция шифрования/расшифровки строки */ function AESCrypt($text, $key, $cipher, $mode, $encdec) { // Открываем модуль шифрования */ $td = mcrypt_module_open($cipher, '', $mode, ''); // Инициализация шифрования mcrypt_generic_init($td, $key, ''); // Шифрование (или расшифровка) $cr = ($encdec==0 ? mcrypt_generic($td, $text) : mdecrypt_generic($td, $text)); // Завершаем обработчик шифрования mcrypt_generic_deinit($td); // Закрываем модуль шифрования mcrypt_module_close($td); // Возвращаем результат return $cr; } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Test</title> <meta name="" content=""> </head> <body> <form method="POST"> <input type="text" name="str"> <input type="submit"> </form> </body> </html>придумал, работает, данные как открытый ключ + добавок индексом из закрытого массива ключей, формируем из этого хэш, на стороне PHP обратная процедура, индекс на двух сторонах синхронизируется