Реализовать безопасный алгоритм хеширования — 512 (SHA-512) как парадигму функционального программирования

Опубликовано: 16 Сентября, 2022

Учитывая строку S длины N , задача состоит в том, чтобы найти хеш-значение SHA-512 данной строки S.

Примеры:

Input: S = “GeeksforGeeks”
Output: acc10c4e0b38617f59e88e49215e2e894afaee5ec948c2af6f44039f03c9fe47a9210e01d5cd926c142bdc9179c2ad30f927a8faf69421ff60a5eaddcf8cb9c

Input: S = “hello world”
Output:
309ecc489c12d6eb4cc40f50c902f2b4d0ed77ee511a7c7a9bcd3ca86d4cd86f989dd35bc5ff499670da34255b45b0cfd830e81f605dcf7dc5542e93ae9cd76f

Подход: выполните следующие шаги, чтобы решить проблему:

  • Преобразуйте данную строку в двоичную форму.
  • Добавьте «1» к строке, а затем «0» непрерывно, пока длина строки не станет < (N%(1024 – 128)) .
  • Добавьте 128-битное двоичное представление N в строку S.
  • Найдите количество кусков размером 1024 и сохраните его в переменной, скажем, куски как N/1024 .
  • Разделите строку S на 16 фрагментов по 64 символа.
  • Увеличьте количество чанков до 80 , выполнив следующие операции:
    • Переберите диапазон [16, 80], а затем найдите 4 значения, скажем , WordA, WordB, WordC, WordD, как:
      • WordA = повернуть_вправо(Сообщение[g – 2], 19) ^ повернуть_вправо(Сообщение[g – 2], 61) ^ сдвинуть_вправо(Сообщение[g – 2], 6) .
      • WordB = Сообщение[g – 7] .
      • WordC = повернуть_вправо(Сообщение[g – 15], 1) ^ повернуть_вправо(Сообщение[g – 15], 8) ^ сдвинуть_вправо(Сообщение[g – 15], 7) .
      • WordD = Сообщение[г – 16] .
    • Обновите значение Message[g] как (WordA + WordB + WordC + WordD) .
  • Инициализируйте 8 переменных, скажем, A , B , C , D , E , F , G , H 64-битного типа, чтобы сохранить окончательное хеш-значение данной строки S .
  • Пройдите по массиву Block[] и выполните следующие шаги:
    • Обновите значение A , B , C , D , E , F , G , H с помощью хеш-функции до 80 итераций, вращая одну за другой.
    • Теперь обновите значение A , B , C , D , E , F , G , H путем суммирования предыдущих значений A , B , C , D , E , F , G , H и недавно обновленного значения A , Б , В , Г , Е , Ж , Г , Ч .
  • После выполнения вышеуказанных шагов напечатайте шестнадцатеричные значения A , B , C , D , E , F , G , H , чтобы получить хэш-значение данной строки.

Ниже приведена реализация вышеуказанного подхода:

Временная сложность: O(N)
Вспомогательное пространство: O(1)