Понимание частей алгоритма GNU Crypto DES (Java) - PullRequest
1 голос
/ 27 января 2011

В настоящее время я запутался в поведении алгоритма DES, предоставляемого пакетом GNU Crypto.Вот ссылка на рассматриваемый алгоритм: Алгоритм GNU Crypto DES

Первоначально я просто хотел извлечь состояние ключа (ей) в определенных точках, то есть после ПК-1,ПК-2, субключи и т. Д. Однако этот план не слишком удачен, так как 56-битный ключ, ожидаемый после ПК-1, представляется 48-битным, исходя из переменной pc1m (работая в предположении, что представление ключа (значение pc1m) при преобразовании из десятичной в двоичную является звуком).Поэтому я попытался выяснить этот фрагмент кода:

для (i = 0; i <56; i ++) {l = PC1 [i];pc1m | = ((kb [l >>> 3] & (0x80 >>> (l & 7)))! = 0)?(1L << (55-я)): 0;} </p>

Тем не менее, мое понимание побитовых операций является странным, и хотя у меня есть смутное представление о том, как оно оценивается, я не вижу общей логики для него и как оно работает (илискорее, почему он, кажется, на самом деле не работает - хотя алгоритм действительно шифрует и дешифрует успешно, используя официальные тестовые векторы).Где я могу получить 56-битную перестановку после ПК-1?

Мне также неясно, что делает код после «// Ключ шифрования первым», так как переменная pc1m не изменилась, и pcr появляетсяпросто скопируйте значение после всего этого.

На яркой стороне становится ясно, что «приготовление» ключей создает подключи для раундов Фейстеля.

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

Любая помощь будет очень, очень благодарна!Спасибо.

1 Ответ

0 голосов
/ 27 января 2011

Фрагмент кода действительно читает 56 бит из kb и переставляет их в pc1m (при условии, что начальное значение pc1m равно 0).

// For each of the 56 bits
for (i = 0; i < 56; i++)
{
    L = PC1[i];                 // Get i-th bit index
    L_byte = L >>> 3;           // Get the byte where that bit is stored
    L_mask = 0x80 >>> (L & 7);  // Get the bit mask
    if (kb[L_byte] & L_mask] != 0)
    {
        // The PC1[i]-th bit of kb is set
        // so set bit at position 55-i (i=0 => MSB) in pc1m
        pc1m |= (1L << (55-i));
    }
}

поэтому значение kb после 56-битной перестановки, описанной в PC1, будет доступно в pc1m как одно длинное целое число.

...