Я работаю над упражнениями в "Страуструпе" "Программирование: принципы и практика с использованием C++". В главе 25 он вводит алгоритм крошечного шифрования (TEA). Он и веб-сайт, на котором размещены несколько статей, утверждают, что он не был сломан, и дал короткий код: "Слишком хорошо, чтобы быть правдой!"
Примечание. Мне пришлось изменить long
переменные на переменные int
поскольку бит-сдвиги предназначены для реализации в системе с sizeof(var) = 4
OS X реализует длинный 8-байтовый тип, поэтому без этого изменения код Stroustrup не работает.
Может ли кто-нибудь рекомендовать другие тривиально реализованные улучшения, чтобы получить TEA на OS X с большей эффективностью и/или лучшей безопасностью?
void encipher(
const unsigned int* const v,
unsigned int* const w,
const unsigned int* const k
)
{
unsigned int y = v[0];
unsigned int z = v[1];
unsigned int sum = 0;
unsigned int delta = 0x9E3779B9;
unsigned int n = 32;
while(n-- > 0) {
y += (z << 4 ^ z >> 5) + z ^ sum + k[sum & 3];
sum += delta;
z += (y << 4 ^ y >> 5) + y ^ sum + k[sum>>11 & 3];
}
w[0]=y;
w[1]=z;
}
Википедия (давай, человек, google!)
У TEA есть несколько недостатков. Наиболее заметно, что он страдает от эквивалентных ключей - каждый ключ эквивалентен трем другим, что означает, что размер эффективного ключа составляет всего 126 бит. В результате, TEA особенно плох как криптографическая хэш-функция. Эта слабость привела к способу взлома игровой консоли Microsoft Xbox, где шифр использовался как хеш-функция. TEA также подвержен атаке со связанными ключами, для которой требуется 2 ^ 23 выбранных открытого текста под парой связанных ключей, с временной сложностью 2 ^ 32. Из-за этих недостатков был разработан шифр XTEA.
uint32_t
(хотя и не управляемый стандартом, я еще не видел реализацию, которая не предоставляет его в<stdint.h>
)