1. Си / Говнокод #8250

    +139

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    j = 0;
    while (len >= 8)
    {
    	N[0] = N[0] ^ in[j++];
    	N[1] = N[1] ^ in[j++];
    
    	// first round
    	S = N[0];
    	N[0] = N[0] + k[0]; 
    	N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
    	N[0] = (N[0]<<11) | (N[0]>>21);
    	N[0] = N[0]^N[1];
    	N[1]=S;
    
    	S = N[0];
    	N[0] = N[0] + k[1]; 
    	N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
    	N[0] = (N[0]<<11) | (N[0]>>21);
    	N[0] = N[0]^N[1];
    	N[1]=S;
    
    	S = N[0];
    	N[0] = N[0] + k[2]; 
    	N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
    	N[0] = (N[0]<<11) | (N[0]>>21);
    	N[0] = N[0]^N[1];
    	N[1]=S;
    
    	/* skipped k[3] - k[6] */		
    
    	S = N[0];
    	N[0] = N[0] + k[7]; 
    	N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
    	N[0] = (N[0]<<11) | (N[0]>>21);
    	N[0] = N[0]^N[1];
    	N[1]=S;
    
    	// second round
    	S = N[0];
    	N[0] = N[0] + k[0]; 
    	N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
    	N[0] = (N[0]<<11) | (N[0]>>21);
    	N[0] = N[0]^N[1];
    	N[1]=S;
    
    	/* skipped */
    
    	S = N[0];
    	N[0] = N[0] + k[7]; 
    	N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
    	N[0] = (N[0]<<11) | (N[0]>>21);
    	N[0] = N[0]^N[1];
    	N[1]=S;
    
    	len = len - 8;
    };
    
    if (len > 0)
    {
    	for (i=0;i<len;i++)
    		((uint8 *)N)[i] = ((uint8 *)N)[i]^((uint8 *)&in[j])[i];
    
    	// first round
    	S = N[0];
    	N[0] = N[0] + k[0]; 
    	N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
    	N[0] = (N[0]<<11) | (N[0]>>21);
    	N[0] = N[0]^N[1];
    	N[1]=S;
    
    	/* skipped */
    
    	S = N[0];
    	N[0] = N[0] + k[7]; 
    	N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
    	N[0] = (N[0]<<11) | (N[0]>>21);
    	N[0] = N[0]^N[1];
    	N[1]=S;
    
    	// second round
    	S = N[0];
    	N[0] = N[0] + k[0]; 
    	N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
    	N[0] = (N[0]<<11) | (N[0]>>21);
    	N[0] = N[0]^N[1];
    	N[1]=S;
    
    	/* skipped */
    
    	S = N[0];
    	N[0] = N[0] + k[7]; 
    	N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
    	N[0] = (N[0]<<11) | (N[0]>>21);
    	N[0] = N[0]^N[1];
    	N[1]=S;
    
    };

    полная версия - 250 строк.
    это не школолостудентокод, это реальный код, за который когда то кому то были заплачены деньги

    Запостил: defecate-plusplus, 20 Октября 2011

    Комментарии (12) RSS

    • гост 28147-89?
      Ответить
    • слегка развернул цикл
      Ответить
    • ничего вы не понимаете! отказ от циклов и процедур дает выигрыш в производительности!
      для тех, у кого время разработки и поддержки дешевле машинного = )
      Ответить
      • Нормальные люди пишут нормальный код на "нормальном" языке программирования, который генерит оптимизированный быдло-код на C.
        В этом отношении показателен FFTW.
        Ответить
    • Здравые идеи есть. Жесткий инлайн я тоже применял - получил хороший выигрыш в производительности. Затем, замена 8 4-битных S-блоков на 4 байтовые... но за "Sa0->b*" - убил бы.

      Ну и напоследок: в последних 8 раундах ключи надо совать в обратном порядке.
      Ответить
      • А, прошу прощения, сразу не заметил, что это генерация иммитовставки, просто автор скопипастил ее дважды.
        Ответить
        • я забыл в описание добавить, что этот код использовался в проектах, в которых на счету каждый очередной 1кб получающегося исполняемого файла
          Ответить
          • В микроконтроллерах использовался? В таком случае, быстродействие еще более критично.
            Ответить
    • а тут можно постить бинарные?
      Ответить

    Добавить комментарий