key0[i] = key0[i-1]>>8 ^ crctab[key0[i-1]&0xFF ^ plaintext[i]];
key1[i] = (key1[i-1] + (key0[i]&0xFF))* Const + 1;
key2[i] = key2[i-1]>>8 ^ crctab[key2[i-1]&0xFF ^ (key1[i]>>24)];
< /code>
обновить свой клавиш или внутреннее состояние и это: < /p>
tmp = (key2[i] |3)&0xFFFF; // notice: makes the last 16 bits of key2 odd
key3[i] = ((tmp*(tmp ^ 1))>>8)&0xFF;//notice: this is ((x**2)-x)//256 mod 256 or (x*(x + or - 1))//256 mod 256
ciphertext[i] = plaintext[i] ^ key3[i];
, чтобы вывести байт-ключ3 и шифровать открытый текст в Ciphertext, но такие программы, как Pkcrak 22 Возможные значения Key2 для позиции I, что слишком много, поэтому я обнаружил это:
Учитывает 3 последовательных значения открытого текста и шифровый текст, мы можем получить 3 последовательного ключа3 Значения и каждая ключа3 значение имеет 256 возможных последних 16-битных значений, что слишком много, если только соединение между 16-битным значением для ключа3 и key3 [i-1 ] не является найдено. < /p>
Следовательно: < /p>
import math
n= int(65536)
x = 0xc90b #this is key2[i-1] |3
y = 0x2f17# this is key2 | 3
a = ((x*x) - x) % n # we havent divided this by 256 for simplicity
b = ((y*y) - y) % n # so the result of a ^ b is 16 bit or simply (e
#include
#include
#include
#include
#include
#include
#include
#include
#include
uint32_t ky0 = k0; // FNV offset basis for 32-bit
uint32_t ky1 = k1; // FNV prime for 32-bit
uint32_t ky2 = k2;
uint16_t tmp;
uint8_t bt;
for (int i = 0; i < 10; i++) {
ky0 = CRC32( ky0, pw );
ky1 = (k1 + (ky0&0xff))*CONSTx + 1;
ky2 = CRC32( ky2, MSB(ky1) );
printf("%08X %08X %08X\n",ky0,ky1,ky2);
}
t0 =ky0;
t1 = ky1;
t2 = ky2;
printf("===================================\n");
for (int i = 0; i < 8; i++) {
ky0 = CRC32( ky0, plain );
ky1 = (k1 + (ky0&0xff))*CONSTx + 1;
ky2 = CRC32( ky2, MSB(ky1) );
printf("%08X %08X %08X\n",ky0,ky1,ky2);
tmp = ky2 | 3;
bt = ((tmp*(tmp ^ 1))>>8)&0xFF;
cipher = plain ^ bt;
key3 = bt;
}
printf("===================================\n");
printf("plain : ");
for(int i =0; i
< /blockquote>
, чтобы протестировать мою теорию, но когда я использовал код ниже, чтобы увидеть, находится ли значение Key2, которое я нашел, используя вышеуказанный код для позиции 4 внутри списка. Сгенерировано алгоритмом, я не получаю его правильного значения, и теперь я смущен, является ли это моим кодированием или самого алгоритма ошибочна или неверно истолкован. : < /p>
#include
#include
#include
#include
#include
#include
#include
#include
#include
Я пытаюсь улучшить атаку на pkzip , минимизируя рабочую нагрузку и требования, поэтому Pkzip использует это: [code]key0[i] = key0[i-1]>>8 ^ crctab[key0[i-1]&0xFF ^ plaintext[i]]; key1[i] = (key1[i-1] + (key0[i]&0xFF))* Const + 1; key2[i] = key2[i-1]>>8 ^ crctab[key2[i-1]&0xFF ^ (key1[i]>>24)]; < /code> обновить свой клавиш или внутреннее состояние и это: < /p> tmp = (key2[i] |3)&0xFFFF; // notice: makes the last 16 bits of key2 odd key3[i] = ((tmp*(tmp ^ 1))>>8)&0xFF;//notice: this is ((x**2)-x)//256 mod 256 or (x*(x + or - 1))//256 mod 256 ciphertext[i] = plaintext[i] ^ key3[i]; [/code] , чтобы вывести байт-ключ3 и шифровать открытый текст в Ciphertext, но такие программы, как Pkcrak 22 Возможные значения Key2 для позиции I, что слишком много, поэтому я обнаружил это: Учитывает 3 последовательных значения открытого текста и шифровый текст, мы можем получить 3 последовательного ключа3 Значения и каждая ключа3 значение имеет 256 возможных последних 16-битных значений, что слишком много, если только соединение между 16-битным значением для ключа3 [i] и key3 [i-1 ] не является найдено. < /p> Следовательно: < /p> import math n= int(65536)
x = 0xc90b #this is key2[i-1] |3 y = 0x2f17# this is key2[i] | 3
a = ((x*x) - x) % n # we havent divided this by 256 for simplicity b = ((y*y) - y) % n # so the result of a ^ b is 16 bit or simply (e #include #include #include #include #include #include #include #include #include
uint32_t ky0 = k0; // FNV offset basis for 32-bit uint32_t ky1 = k1; // FNV prime for 32-bit uint32_t ky2 = k2; uint16_t tmp; uint8_t bt;
for (int i = 0; i < 10; i++) { ky0 = CRC32( ky0, pw[i] ); ky1 = (k1 + (ky0&0xff))*CONSTx + 1; ky2 = CRC32( ky2, MSB(ky1) ); printf("%08X %08X %08X\n",ky0,ky1,ky2); } t0 =ky0; t1 = ky1; t2 = ky2; printf("===================================\n"); for (int i = 0; i < 8; i++) { ky0 = CRC32( ky0, plain[i] ); ky1 = (k1 + (ky0&0xff))*CONSTx + 1; ky2 = CRC32( ky2, MSB(ky1) ); printf("%08X %08X %08X\n",ky0,ky1,ky2); tmp = ky2 | 3; bt = ((tmp*(tmp ^ 1))>>8)&0xFF; cipher[i] = plain[i] ^ bt; key3[i] = bt; } printf("===================================\n"); printf("plain : "); for(int i =0; i < /blockquote> , чтобы протестировать мою теорию, но когда я использовал код ниже, чтобы увидеть, находится ли значение Key2, которое я нашел, используя вышеуказанный код для позиции 4 внутри списка. Сгенерировано алгоритмом, я не получаю его правильного значения, и теперь я смущен, является ли это моим кодированием или самого алгоритма ошибочна или неверно истолкован. : < /p> #include #include #include #include #include #include #include #include #include
Я очень новичок в C#. Я делал простую игру рока, бумаги и ножницы. Каждый раз, когда я запускаю код, я застрял в бесконечном цикле. > using System.ComponentModel.Design;
using System.Runtime.CompilerServices;