WikiSort.ru - Не сортированное

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

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

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

Алгоритм не был исследован криптоаналитиками, но по заявлению автора, он устойчив к большинству статистических тестов и более устойчив к криптоатакам, чем 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

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии