Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Blowfish: шифрование меньше 8 байт


Автор: Alca 4.8.2009, 13:23
Можно ли данным алгоритмом (Blowfish) зашифровать данные меньше 8 байт.

Автор: cardinal 4.8.2009, 13:33
Всегда ведь можно добавить в конце парочку пробелов... smile 

Автор: Alca 4.8.2009, 13:40
Использую OpenSSL http://openssl.org/docs/crypto/blowfish.html#
Т.е. по идее текст для шифрование должен быть кратным 8 байтам. Я прав?

Автор: Alexandr87 5.8.2009, 09:40
Цитата(Alca @  4.8.2009,  16:40 Найти цитируемый пост)
Т.е. по идее текст для шифрование должен быть кратным 8 байтам. Я прав? 

блочные шрифты могут работать в нескольких режимах http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation
При этом, некоторые из режимов (CFB, OFB) позволяют использовать блочный шифр, как поточный. Как следствие не нужно добавить блок до полного.
Если используются другие режимы, то последний неполный блок дополняется до полного с помощью механизмов, которые называеются paddings http://en.wikipedia.org/wiki/Padding_%28cryptography%29

Цитата

Всегда ведь можно добавить в конце парочку пробелов... 

Ога, но не всегда потом отделить, что из пробелов было добавлено, а что уже присутствовало в шифруемом тексте.

Автор: Alca 5.8.2009, 09:54
Цитата

Ога, но не всегда потом отделить, что из пробелов было добавлено, а что уже присутствовало в шифруемом тексте.

А если вместо пробелов использовать '\0':
Код

CHAR chSymbol = '\0';

?

Добавлено через 7 минут и 3 секунды
Код

//http://openssl.org/docs/crypto/blowfish.html#
 #include <openssl/blowfish.h>
 void BF_set_key(BF_KEY *key, int len, const unsigned char *data);
 void BF_ecb_encrypt(const unsigned char *in, unsigned char *out,  BF_KEY *key, int enc);
 void BF_cbc_encrypt(const unsigned char *in, unsigned char *out,  long length, BF_KEY *schedule, unsigned char *ivec, int enc);
 void BF_cfb64_encrypt(const unsigned char *in, unsigned char *out, long length, BF_KEY *schedule, unsigned char *ivec, int *num, int enc);
 void BF_ofb64_encrypt(const unsigned char *in, unsigned char *out, long length, BF_KEY *schedule, unsigned char *ivec, int *num);
 const char *BF_options(void);
 void BF_encrypt(BF_LONG *data,const BF_KEY *key);
 void BF_decrypt(BF_LONG *data,const BF_KEY *key);

Цитата

BF_cbc_encrypt() operates on data that is a multiple of 8 bytes long, while BF_cfb64_encrypt() and BF_ofb64_encrypt() are used to encrypt an variable number of bytes (the amount does not have to be an exact multiple of 8). The purpose of the latter two is to simulate stream ciphers, and therefore, they need the parameter num, which is a pointer to an integer where the current offset in ivec is stored between calls. This integer must be initialized to zero when ivec is initialized.

Alexandr87, точно. Плохо читал мануал.

Автор: Alexandr87 6.8.2009, 06:25
Цитата(Alca @ 5.8.2009,  12:54)
Цитата

Ога, но не всегда потом отделить, что из пробелов было добавлено, а что уже присутствовало в шифруемом тексте.

А если вместо пробелов использовать '\0':
Код

CHAR chSymbol = '\0';

?

Разницы нет. Если шифруемые данные могут заканчиваться данным байтом, то при дополнении вы не сможете точно определить что является дополнением, а что частью данных.
Если вы точно знаете, что шифруемые данные не будут окончиваться данным байтом, можете остаток забить ими, иначе можно использовать PKCS#7 padding.

Автор: Alca 6.8.2009, 09:31
Цитата

Если вы точно знаете, что шифруемые данные не будут окончиваться данным байтом

Буду шифровать std::string (простой текст).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)