FNAm2

Материал из Циклопедии
Перейти к навигации Перейти к поиску
FNAm2
(Feistel Net Algorithm mark 2)
Создатель:Алексей Андреевич Кобзин, Украина
Создан:2009 г.
Размер ключа:512 бит
Размер блока:128 бит
Число раундов:64
Тип:Сеть Фейстеля

FNAm2симметричный блочный крипто алгоритм типа «Сеть Фейстеля», разработанный в 2009 году. Алгоритм является продолжением идеи, предложенной создателями TEA, с увеличенным количеством раундов, размером ключа, длинной блока и с добавленной генерацией подключей.

Безопасность[править]

Алгоритм не был исследован криптоаналитиками, но по заявлению автора, он устойчив к большинству статистических тестов и более устойчив к криптоатакам, чем TEA, или XTEA.

Пример кода на языке C[править]

Алгоритм, как и другие варианты алгоритма TEA основан на операциях с 32-х разрядными двоичными целыми числами как unsigned long и int. <source lang="cpp"> void fnam2_crypt(unsigned long &b1,unsigned long &b2,unsigned long &b3,unsigned long &b4); void fnam2_decrypt(unsigned long &b1,unsigned long &b2,unsigned long &b3,unsigned long &b4); //Key initialithation int key[16]; //Num -- then number of 128-bit block in file unsigned long Num;

void fnam2_crypt(unsigned long &b1,unsigned long &b2,unsigned long &b3,unsigned long &b4) {

int subkey,i,ip,im;
for(int r=0;r<64;r++)
{
 //Selecting the part of key for a concrete stage
 i=r%16;
 if(i==16) {ip=1;im=15;}
 if(i==1) {ip=2;im=16;}
 else {ip=i+1;im=i-1;}
 //Generating the subkey on the basis of nmber part of a key,
 //number of the block in a file and number of a round
 subkey=key[i]*r+(key[im]*Num+key[ip]);
 //F - function
 b1+=(((b2>>16)^((b2<<25)+subkey))+(subkey*(~(b2<<7))));
 b1=~b1;
 r++;
 i=r%16;
 if(i==16) {ip=1;im=15;}
 if(i==1) {ip=2;im=16;}
 else {ip=i+1;im=i-1;}
 subkey=key[i]*r+(key[im]*Num+key[ip]);
 b2+=(((b3>>16)^((b3<<25)+subkey))+(subkey*(~(b3<<7))));
 b2=~b2;
 r++;
 i=r%16;
 if(i==16) {ip=1;im=15;}
 if(i==1) {ip=2;im=16;}
 else {ip=i+1;im=i-1;}
 subkey=key[i]*r+(key[im]*Num+key[ip]);
 b3+=(((b4>>16)^((b4<<25)+subkey))+(subkey*(~(b4<<7))));
 b3=~b3;
 r++;
 i=r%16;
 if(i==16) {ip=1;im=15;}
 if(i==1) {ip=2;im=16;}
 else {ip=i+1;im=i-1;}
 subkey=key[i]*r+(key[im]*Num+key[ip]);
 b4+=(((b1>>16)^((b1<<25)+subkey))+(subkey*(~(b1<<7))));
 b4=~b4;
}
Num++;

}

void fnam2_decrypt(unsigned long &b1,unsigned long &b2,unsigned long &b3,unsigned long &b4) {

int subkey,i,ip,im;
for(int r=63;r>=0;r--)
{
i=r%16;
 if(i==16) {ip=1;im=15;}
 if(i==1) {ip=2;im=16;}
 else {ip=i+1;im=i-1;}
 subkey=key[i]*r+(key[im]*Num+key[ip]);
 b4=~b4;
 b4-=(((b1>>16)^((b1<<25)+subkey))+(subkey*(~(b1<<7))));
 r--;
 i=r%16;
 if(i==16) {ip=1;im=15;}
 if(i==1) {ip=2;im=16;}
 else {ip=i+1;im=i-1;}
 subkey=key[i]*r+(key[im]*Num+key[ip]);
 b3=~b3;
 b3-=(((b4>>16)^((b4<<25)+subkey))+(subkey*(~(b4<<7))));
 r--;
 i=r%16;
 if(i==16) {ip=1;im=15;}
 if(i==1) {ip=2;im=16;}
 else {ip=i+1;im=i-1;}
 subkey=key[i]*r+(key[im]*Num+key[ip]);
 b2=~b2;
 b2-=(((b3>>16)^((b3<<25)+subkey))+(subkey*(~(b3<<7))));
 r--;
 i=r%16;
 if(i==16) {ip=1;im=15;}
 if(i==1) {ip=2;im=16;}
 else {ip=i+1;im=i-1;}
 subkey=key[i]*r+(key[im]*Num+key[ip]);
 b1=~b1;
 b1-=(((b2>>16)^((b2<<25)+subkey))+(subkey*(~(b2<<7))));
}
Num++;

}

</source>

См. также[править]

Ссылки[править]

Реализация FNAm2 на языке C

 
Потоковые шифры

A3 A5 A8 Decim MICKEY RC4 Rabbit SEAL SOSEMANUK Trivium VMPC

Сеть Фейстеля

ГОСТ 28147-89 Blowfish Camellia CAST-128 CAST-256 CIPHERUNICORN-A CIPHERUNICORN-E CLEFIA Cobra DFC DEAL DES DESX EnRUPT FEAL FNAm2 HPC IDEA KASUMI Khufu LOKI97 MARS NewDES Raiden RC5 RC6 RTEA SEED Sinople Skipjack TEA Triple DES Twofish XTEA XXTEA

SP-сеть

3-WAY ABC AES (Rijndael) • Akelarre Anubis ARIA BaseKing BassOmatic CRYPTON Diamond2 Grand Cru Hierocrypt-L1 Hierocrypt-3 KHAZAD Lucifer Present Rainbow SAFER Serpent SHARK SQUARE Threefish

Другие

FROG NUSH REDOC SHACAL SC2000