Маячня програміста Цифровий підпис великих файлів на

Програмування, збочення та все інше

понеділок, 27 травня 2013 р.

Цифровий підпис великих файлів на .NET у потоковому режимі

Стандартний механізм у .NET підпису через SignedCms, дуже симпатичний, але є одна проблема: для підпису необхідно передати масив байт, тобто. якщо треба підписати великий файл, то спочатку прочитати на згадку в .NET потім засунути цей обсяг системному API, що дуже затратно по пам'яті.

Звичайно, у CryptoPro є чудовий метод SignHash, який дозволяє заздалегідь порахувати хеш та його підписати (що ідентично підпису самого файлу), але це тільки у CryptoPro, стандартне API навіть на низькому рівні не дозволяє провести таке.

Гуглення видало код, який може шифрувати в потоковому режимі, але у нього виявилося кілька проблем:

  • Чомусь використовується FileStream, хоча досить просто Stream
  • Реально все одно читається весь вміст (!), а потім підписується в потоковому режимі
  • Немає підтримки Detached підписи, хоча додати його нескладно
  • Нахабно з сертифіката береться приватний ключ, який знову ж таки вважається RSA (наївні! зовсім не знають що в Україні твориться)

Загалом, я поправив цей код, і викладаю його тут, бо взяв із блогу вихідники, треба їх так само повернути, щоб людям було приємно.

Код, являє собою компіляцію того, що було, про те, що треба, по-доброму його треба зачесати, але для демонстрації можливостей, піде.