FNAm2

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

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

Безопасность

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

Пример кода на языке C

Алгоритм, как и другие варианты алгоритма 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++;

}

См. также

Ссылки

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

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.