Эту статью следует викифицировать. |
FNAm2(Feistel Net Algorithm mark 2) | |
---|---|
Создатель | Алексей Андреевич Кобзин, Украина |
Создан | 2009 г. |
Размер ключа | 512 бит |
Размер блока | 128 бит |
Число раундов | 64 |
Тип | Сеть Фейстеля |
FNAm2 —симметричный блочный крипто алгоритм типа «Сеть Фейстеля», разработанный в 2009 году. Алгоритм является продолжением идеи, предложенной создателями TEA, с увеличенным количеством раундов, размером ключа, длинной блока и с добавленной генерацией подключей.
Алгоритм не был исследован криптоаналитиками, но по заявлению автора, он устойчив к большинству статистических тестов и более устойчив к криптоатакам, чем TEA, или XTEA.
Алгоритм, как и другие варианты алгоритма TEA основан на операциях с 32-х разрядными двоичными целыми числами как unsigned long и int.
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++;
}
Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".
Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.
Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .