ロシアの暗号規格が構造化されすぎていることの証明
この課題の目的は、選択した言語で、次の関数の不可能なほど短い実装を見つけるpことです。これを実装するCコード(出力も印刷するこのTIOリンクを参照 )と、それを含むウィキペディアページがあります。 unsigned char pi[] = { 252,238,221,17,207,110,49,22,251,196,250,218,35,197,4,77, 233,119,240,219,147,46,153,186,23,54,241,187,20,205,95,193, 249,24,101,90,226,92,239,33,129,28,60,66,139,1,142,79, 5,132,2,174,227,106,143,160,6,11,237,152,127,212,211,31, 235,52,44,81,234,200,72,171,242,42,104,162,253,58,206,204, 181,112,14,86,8,12,118,18,191,114,19,71,156,183,93,135, 21,161,150,41,16,123,154,199,243,145,120,111,157,158,178,177, 50,117,25,61,255,53,138,126,109,84,198,128,195,189,13,87, 223,245,36,169,62,168,67,201,215,121,214,246,124,34,185,3, 224,15,236,222,122,148,176,188,220,232,40,80,78,51,10,74, 167,151,96,115,30,0,98,68,26,184,56,130,100,159,38,65, 173,69,70,146,39,94,85,47,140,163,165,125,105,213,149,59, 7,88,179,64,134,172,29,247,48,55,107,228,136,217,231,137, 225,27,131,73,76,63,248,254,141,83,170,144,202,216,133,97, 32,113,103,164,45,43,9,91,203,155,37,208,190,229,108,82, 89,166,116,210,230,244,180,192,209,102,175,194,57,75,99,182, }; unsigned char p(unsigned char x) { return pi[x]; } とは p pは、2つのロシアの暗号化標準、つまりハッシュ関数Streebogとブロック暗号Kuznyechikのコンポーネントです。で、この記事(およびISO会議中)、これらのアルゴリズムの設計者は、彼らが、配列を生成したと主張しpiたランダム8ビットの順列を選ぶことで。 「不可能」な実装 256 !≈ 21684256!≈21684256! \approx 2^{1684}あります!≈ 2 1684年 8ビットに置換。したがって、与えられたランダムな順列に対して、それを実装するプログラムは、1683ビット未満しか必要としないことが予想されます。 しかし、たとえば次のCプログラムのように、複数の異常に小さい実装(ここにリストされています)が見つかりました。 p(x){unsigned char*k="@`rFTDVbpPBvdtfR@\xacp?\xe2>4\xa6\xe9{z\xe3q5\xa7\xe8",l=0,b=17;while(--l&&x^1)x=2*x^x/128*285;return l%b?k[l%b]^k[b+l/b]^b:k[l/b]^188;} 158文字しか含まれていないため、1264ビットに収まります。ここをクリックして、動作することを確認してください。 …