CryptoCode Software Test

Best Binary Options Brokers 2020:
  • BINARIUM
    BINARIUM

    The Best Binary Options Broker 2020!
    Perfect For Beginners and Middle-Leveled Traders!
    Free Education.
    Free Demo Account.
    Get Your Sign-Up Bonus Now!

  • BINOMO
    BINOMO

    Recommended Only For Experienced Traders!

Contents

Платформа для заработка Crypto-Code и генерация персональных кодов для майнинга криптовалют

Электронные деньги сегодня у всех на слуху. Появилось немало лохотронов, основанных на незнании людьми всех нюансов. Недавно появилась платформа для заработка Crypto-Code, которую активно рекламирует некая Виктория Самойленко. Рассмотрим, что представляет собой система, зачем нужна генерация персональных кодов для майнинга криптовалют и какой доход тут предлагают.

Платформа для заработка Crypto-Code

blog.money-kode.ru – блог, где Виктория Самойленко рассказала о заработке;
money-kode.ru – платформа для заработка Crypto-Code;
home.money-kode.ru – генерация персональных кодов для майнинга криптовалют.

В своем блоге Виктория Самойленко сообщает, что решила писать о поисках заработка в сети. На её главной странице рассказывается о найденном способе, дающем от 300 долларов в день. Он основан на такой вещи, как майнинг.

Майнинг – создание криптовалюты с помощью своего компьютера. Для этого устанавливается программа, которая сильно нагружает технику. Чем более мощным является устройство, тем больше «добывается» валюты. По-настоящему хорошие деньги (миллионы в месяц) получают владельцы промышленных ферм, занимающих сотни квадратных метров. Эта тема до сих пор мало понятна обычному человеку, чем и пользуются мошенники. Последний из лохотронов, связанных с криптоденьгами – Ежедневный заработок на обналичивании кошельков Code-Checker.

Важно: сам по себе майнинг – реально работающий способ получить доход. Однако он предполагает существенные вложения в дорогостоящую технику, а заработок в месяц обычно не превышает пары сотен долларов даже при наличии очень мощного компьютера. Здесь же нам обещают ту же сумму в день. Вкладывать сперва пару миллионов на покупку оборудования не требуют. Уже это заставило отнестись к проекту с подозрением.

Самый простой способ проверить правдивость слов автора – определить возраст сайта. Если дата публикации статей датирована мартом 2020, то сам адрес вебсайта зарегистрирован только в октябре. Более того – все 3 проекта созданы не просто в один день, а в одну и ту же секунду! Таких совпадений не бывает.

В том, что платформа для заработка Crypto-Code лохотрон, нас убедили и следующие слова: «Используя параметры вашего устройства (компьютер, телефон или планшет) платформа Krypto-kode добывает криптовалюту». Обратим внимание на 2 момента:

• Название проекта написано с ошибкой;
• Если мы на самом деле хотим майнить криптоденьги, не надо подключаться к каким-то сервисам. Достаточно скачать в сети бесплатную программу и запустить компьютер.

И уж точно с помощью телефона или обычного компьютера не получится зарабатывать сотни долларов за минуты (как якобы происходит в данном случае). Даже при работе на полную мощность и круглые сутки с типового компьютера не получить более пары долларов за день! Мифическая платформа для заработка Crypto-Code не дала бы никакого преимущества.

Генерация персональных кодов для майнинга криптовалют

Виктория Самойленко рассказала, как заработать с прорекламированным ею сервисом:

• Регистрируетесь на сайте;
• Заходите на 2 проект и получаете код вашего компьютера, который вставляете в спецполе платформы по майнингу;
• Ждете с минуту, после чего счет пополняется на приличную сумму.

В чем тут развод? Да в том, что код платный и стоит 160 рублей. Зачем он нужен? Если бы вы майнили на самом деле, просто запустили бы бесплатную программу у себя на компьютере. (Можете прочесть тут как это делается в реальности.) Если бы майнинг происходил на стороннем сервере (хотя тут и пишут, что это не так), никакие коды компьютеров/телефонов все равно не нужны.

Покупка кода – повод получить с нас деньги. Чтобы доказать это, мы решили пройти всю цепочку до конца. Сразу уточним, что лохотрон платформа для заработка Crypto-Code сделан довольно качественно и действительно пришлось проходить регистрацию для доступа к системе.

В личном кабинете ничего лишнего нет. Но нет и данных о компании, процедуре майнинга. Сайт, где происходила генерация персональных кодов для майнинга криптовалют, тоже «не поделился» информацией о проекте. Поиск по названию в интернете ничего стоящего не выявил.

• Внесли код в соответствующее поле;
• Запустили систему;
• Определен потенциальный заработок – 632 доллара;
• Менее чем за минуту «заработаны» криптоденьги на соответствующую сумму

Выше уже говорили, что в теории такой заработок возможен, но только если вы сперва вложите намного больше (цифры минимум с шестью нулями на конце). Никакая генерация персональных кодов для майнинга криптовалют или «особая» платформа не дадут что-то «из воздуха» и почти без вложений.

Если думаете, что на 160 рублях мошенник остановится, то ошибаетесь. Вас попросят заплатить еще 270 рублей за подключение кошелька (бессмысленная формулировка). Но и после этого придется переводить мошеннику деньги снова и снова, не получая ничего взамен! Смотрите на скриншоте выше полный перечень запланированных платежей.

Не доверяйте сайтам, предлагающим легкие деньги. Такого не бывает! Сперва придется изучить материал и потратить силы. Готовы? Читайте обзоры из раздела «Проверенные курсы» и зарабатывайте честно и по-настоящему.

Crypto++ ® Library 8.2

Crypto++ Library is a free C++ class library of cryptographic schemes. The library contains the following algorithms:

Algorithm Name
authenticated encryption schemes GCM, CCM, EAX, ChaCha20Poly1305, XChaCha20Poly1305
high speed stream ciphers ChaCha (8/12/20), ChaCha (IETF) HC (128/256), Panama, Rabbit (128/256), Sosemanuk, Salsa20 (8/12/20), XChaCha (8/12/20), XSalsa20
AES and AES candidates AES (Rijndael), RC6, MARS, Twofish, Serpent, CAST-256
other block ciphers ARIA, Blowfish, Camellia, CHAM, HIGHT, IDEA, Kalyna (128/256/512), LEA, SEED, RC5, SHACAL-2, SIMECK, SIMON (64/128), Skipjack, SPECK (64/128), Simeck, SM4,Threefish (256/512/1024), Triple-DES (DES-EDE2 and DES-EDE3), TEA, XTEA
block cipher modes of operation ECB, CBC, CBC ciphertext stealing (CTS), CFB, OFB, counter mode (CTR)
message authentication codes BLAKE2b, BLAKE2s, CMAC, CBC-MAC, DMAC, GMAC (GCM), HMAC, Poly1305, SipHash, Two-Track-MAC, VMAC
hash functions BLAKE2b, BLAKE2s, Keccack (F1600), SHA-1, SHA-2, SHA-3, SHAKE (128/256), SipHash, Tiger, RIPEMD (128/160/256/320), SM3, WHIRLPOOL
public-key cryptography RSA, DSA, Determinsitic DSA (RFC 6979), ElGamal, Nyberg-Rueppel (NR), Rabin-Williams (RW), EC-based German Digital Signature (ECGDSA), LUC, LUCELG, DLIES (variants of DHAES), ESIGN
padding schemes for public-key systems PKCS#1 v2.0, OAEP, PSS, PSSR, IEEE P1363 EMSA2 and EMSA5
key agreement schemes Diffie-Hellman (DH), Unified Diffie-Hellman (DH2), Menezes-Qu-Vanstone (MQV), Hashed MQV (HMQV), Fully Hashed MQV (FHMQV), LUCDIF, XTR-DH
elliptic curve cryptography ECDSA, Determinsitic ECDSA (RFC 6979), ed25519, ECGDSA, ECNR, ECIES, x25519, ECDH, ECMQV
insecure or obsolescent algorithms retained for backwards compatibility and historical value MD2, MD4, MD5, Panama Hash, DES, ARC4, SEAL 3.0, WAKE-OFB, DESX (DES-XEX3), RC2, SAFER, 3-WAY, GOST, SHARK, CAST-128, Square

Other features include:

  • pseudo random number generators (PRNG): ANSI X9.17 appendix C, RandomPool, VIA Padlock, DARN, RDRAND, RDSEED, NIST Hash and HMAC DRBGs
  • password based key derivation functions: PBKDF1 and PBKDF2 from PKCS #5, PBKDF from PKCS #12 appendix B, HKDF from RFC 5869, Scrypt from RFC 7914
  • Shamir’s secret sharing scheme and Rabin’s information dispersal algorithm (IDA)
  • fast multi-precision integer (bignum) and polynomial operations
  • finite field arithmetics, including GF(p) and GF(2^n)
  • prime number generation and verification
  • useful non-cryptographic algorithms
    • DEFLATE (RFC 1951) compression/decompression with gzip (RFC 1952) and zlib (RFC 1950) format support
    • Hex, base-32, base-64, URL safe base-64 encoding and decoding
    • 32-bit CRC, CRC-C and Adler32 checksum
  • class wrappers for these operating system features (optional):
    • high resolution timers on Windows, Unix, and Mac OS
    • /dev/random, /dev/urandom, /dev/srandom
    • Microsoft’s CryptGenRandom and BCryptGenRandom on Windows
  • x86, x64 (x86-64), x32 (ILP32), ARM A-32, Aarch32, Aarch64, POWER4 and POWER8 code for the commonly used algorithms
    • run-time CPU feature detection and code selection
    • supports GCC-style and MSVC-style inline assembly, and MASM for x64
    • x86, x64 (x86-64), x32 provides SSE2, SSE4 and AVX implementations
    • ARM A-32, Aarch32 and Aarch64 provides ARMv7, NEON, ASIMD and ARMv8 implementations
    • PowerPC provides POWER4, POWER7 and POWER8 implementations
    • AES, CRC, GCM and SHA use ARM, Intel and PowerPC hardware acceleration when available
  • A high level interface for most of the above, using a filter/pipeline metaphore
  • benchmarks and validation testing

License

Crypto++ Library is copyrighted as a compilation and (as of version 5.6.2) licensed under the Boost Software License 1.0, while the individual files in the compilation are all public domain.

Platforms

The current version of Crypto++ supports the following compilers:

  • Visual Studio 2003 – 2020
  • GCC 3.3 – 9.0
  • Apple Clang 4.3 – 9.0
  • LLVM Clang 2.9 – 7.0
  • C++Builder 2020
  • Intel C++ Compiler 9 – 16.0
  • Sun Studio 12u1 – 12.6
  • IBM XL C/C++ 10.0 – 13.1

For detailed build status and notes on various compiler/OS/CPU combinations as well as information about compiling earlier versions of Crypto++, please see this wiki entry.

What’s new?

The following is a short list of recent releases and other news. For the complete list please see History.txt.

  • 04/28/2020 – Version 8.2.0 released
    • minor release, no recompile of programs required
    • expanded community input and support
      • 56 unique contributors as of this release
    • use PowerPC unaligned loads and stores with Power8
    • add SKIPJACK test vectors
    • fix SHAKE-128 and SHAKE-256 compile
    • removed IS_NEON from Makefile
    • fix Aarch64 build on Fedora 29
    • fix missing GF2NT_233_Multiply_Reduce_CLMUL in FIPS DLL
    • add missing BLAKE2 constructors
    • fix missing BlockSize() in BLAKE2 classes
  • 02/22/2020 – Version 8.1.0 released
    • minor release, no recompile of programs required
    • expanded community input and support
      • 56 unique contributors as of this release
    • fix OS X PowerPC builds with Clang
    • add Microsoft ARM64 support
    • fix iPhone Simulator build due to missign symbols
    • add CRYPTOPP_BUGGY_SIMD_LOAD_AND_STORE
    • add carryless multiplies for NIST b233 and k233 curves
    • fix OpenMP build due to use of OpenMP 4 with down-level compilers
    • add SignStream and VerifyStream for ed25519 and large files
    • fix missing AlgorithmProvider in PanamaHash
    • add SHAKE-128 and SHAKE-256
    • fix AVX2 build due to _mm256_broadcastsi128_si256
    • add IETF ChaCha, XChaCha, ChaChaPoly1305 and XChaChaPoly1305
  • 12/28/2020 – Version 8.0.0 released
    • major release, recompile of programs required
    • expanded community input and support
      • 54 unique contributors as of this release
    • add x25519 key exchange and ed25519 signature scheme
    • add limited Asymmetric Key Package support from RFC 5958
    • add Power9 DARN random number generator support
    • add CHAM, HC-128, HC-256, Hight, LEA, Rabbit, Simeck
    • fix FixedSizeAllocatorWithCleanup may be unaligned on some platforms
    • cutover to GNU Make-based cpu feature tests
    • rename files with dashes to underscores
    • fix LegacyDecryptor and LegacyDecryptorWithMAC use wrong MAC
    • fix incorrect AES/CBC decryption on Windows
    • avoid Singleton when possible, avoid std::call_once completely
    • fix SPARC alignment problems due to GetAlignmentOf () on word64
    • add ARM AES asm implementation from Cryptogams
    • remove CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS support
  • 04/08/2020 – Version 7.0.0 released
    • major release, recompile of programs required
    • expanded community input and support
      • 48 unique contributors as of this release
    • fix incorrect result when using Integer::InverseMod
      • may be CVE worthy, but request was not submitted
    • fix ARIA/CTR bus error on Sparc64
    • fix incorrect result when using a_exp_b_mod_c
    • fix undeclared identifier uint32_t on early Visual Studio
    • fix iPhoneSimulator build on i386
    • fix incorrect adler32 in ZlibDecompressor
    • fix Power7 test using PPC_FEATURE_ARCH_2_06
    • workaround incorrect Glibc sysconf return value on ppc64-le
    • add KeyDerivationFunction interface
    • add scrypt key derivation function
    • add Salsa20_Core transform callable from outside class
    • add sbyte, sword16, sword32 and sword64
    • remove s_nullNameValuePairs from unnamed namespace
    • ported to MSVC 2020, Xcode 9.3, Sun Studio 12.5, GCC 8.0.1, MacPorts GCC 7.0, Clang 5.0, Intel C++ 17.00, IBM XL C/C++ 13.1
  • 02/22/2020 – Version 6.1.0 released
    • minor release, maintenance items
    • expanded community input and support
      • 46 unique contributors as of this release
    • use 2048-bit modulus default for DSA
    • fix build under Linuxbrew
    • use /bin/sh in GNUmakefile
    • fix missing flags for SIMON and SPECK in GNUMakefile-cross
    • fix ARM and MinGW misdetection
    • port setenv-android.sh to latest NDK
    • fix Clang check for C++11 lambdas
    • convert Simon and Speck to little-endian implementation
    • use LIB_MAJOR for ABI compatibility
    • fix ODR violation in AdvancedProcessBlocks_ templates
    • handle C++17 std::uncaught_exceptions
    • ported to MSVC 2020, Xcode 8.1, Sun Studio 12.5, GCC 8.0.1, MacPorts GCC 7.0, Clang 4.0, Intel C++ 17.00, IBM XL C/C++ 13.1
  • 01/22/2020 – Version 6.0 released
    • Major release, recompile of programs required
    • expanded community input and support
      • 43 unique contributors as of this release
    • fixed CVE-2020-9939 (Issue 346, transient DoS)
    • fixed CVE-2020-9434 (Issue 414, misidentified memory error)
    • converted to BASE+SIMD implementation
      • BASE provides an architecture neutral C++ implementation
      • SIMD provides architecture specific hardware acceleration
    • improved PowerPC Altivec, POWER7 and POWER8 support
    • added ARIA, EC German DSA, Deterministic signatures (RFC 6979), Kalyna, NIST Hash and HMAC DRBG, Padlock RNG, Poly1305, SipHash, Simon, Speck, SM3, SM4, Threefish algorithms
    • added NaCl interface from the compact library
      • x25519 key exhange and ed25519 signing provided through NaCl interface
    • improved Testing and QA
    • ported to MSVC 2020, Xcode 8.1, Sun Studio 12.5, GCC 7.0, MacPorts GCC 7.0, Clang 4.0, Intel C++ 17.00, IBM XL C/C++ 13.1
  • Download

    The downloads for the most recent Crypto++ libraries from the last several years are below. If you need older downloads, from Crypto++ 5.5 to Crypto++ 2.3, then visit the Downloads page. The Downloads page provides checksums for all releases hosted on the website. Release signatures can be verified using GnuPG according to Release Signing.

    Release Date
    (YYYY-MM-DD)
    US Original
    (Website)
    Release Notes
    (with Hashes)
    GitHub
    (Mirror)
    2020-04-28 Crypto++ 8.2.0 [sig] 8.2.0 Release Crypto++ 8.2.0
    2020-02-22 Crypto++ 8.1.0 [sig] 8.1.0 Release Crypto++ 8.1.0
    2020-12-28 Crypto++ 8.0.0 [sig] 8.0.0 Release Crypto++ 8.0.0
    2020-04-08 Crypto++ 7.0.0 [sig] 7.0.0 Release Crypto++ 7.0.0
    2020-02-22 Crypto++ 6.1.0 [sig] 6.1.0 Release Crypto++ 6.1.0
    2020-01-22 Crypto++ 6.0.0 [sig] 6.0.0 Release Crypto++ 6.0.0
    2020-10-11 Crypto++ 5.6.5 [sig] 5.6.5 Release Crypto++ 5.6.5
    2020-09-11 Crypto++ 5.6.4 [sig] 5.6.4 Release Crypto++ 5.6.4
    2020-11-20 Crypto++ 5.6.3 [sig] 5.6.3 Release Crypto++ 5.6.3
    2020-02-20 Crypto++ 5.6.2 [sig] 5.6.2 Release Crypto++ 5.6.2

    Remember to use the “-a” auto-convert text files option when unzipping on a Unix machine. After downloading, please read the Readme.txt included in the zip archive for build instructions and other important notes.

    While You Are Downloading

    • Take a look at the related links page. It includes links to crypto libraries for other languages, products that use Crypto++, etc.
    • Consider the list of recommended books for Crypto++ users.
    • Examine the Crypto++ license agreement.
    • Read the Crypto++ User Guide.
    • Browse the Crypto++ Reference Manual.
    • View these Crypto++ class hierarchy charts to see how Crypto++ is organized. Note that these charts only include a small number of actual algorithms as examples.
      • symmetric algorithms and hash functions
      • public key algorithms

    FIPS 140-2 Validation

    Crypto++ is listed on the CMVP’s Historical Validation List. It effectively means the library is no longer validated. If you are interested in sponsoring a validation, then please send a message to the mailing list to start an offline conversation.

    Mailing Lists

    There are two mailing lists for Crypto++. The first is [email protected], and the second is [email protected]

    As a courtesy, please join the discussion list with your real name instead of an online handle. Alternate webviews are for the lists are available at Crypto++ Announce – Google Groups and Crypto++ Users – Google Groups.

    When posting a question to the Crypto++ user mailing list, please provide the following information, if applicable:

    • exact error message
    • stack trace (please copy from the call stack window of your debugger, or use the “bt” command in gdb)
    • a minimal program with a main() function, that reproduces the problem
    • version of Crypto++, operating system (output of “uname -a” command if using Unix), and compiler (output of “gcc -v” if using GCC)

    Side Channel Attacks

    Crypto++ attempts to resist side channel attacks using various remediations. We believe the library is hardened but the remdiations may be incomplete. The first line of defense uses hardware instructions when possible. The library also uses cache-aware algoirthms and access patterns to minimize leakage. If you suspect or find an information leak then please report it.

    Crypto++ does not enagage Specter remediations at this time. The GCC options for Specter are -mfunction-return=thunk and -mindirect-branch=thunk. If you want the Specter workarounds then add the GCC options to your CXXFLAGS when building the library. The library tests uses the options and they should work as expected.

    Source Code and Contributions

    The source code and its planned changes are available at the following locations.

    • The Crypto++ GitHub repository allows you to view the latest (unreleased) Crypto++ source code via the Linux kernel’s git beginning around June 2020. Its also serves as an incubator to nuture and grow the library.
    • The Roadmap on the wiki provides the general direction the library is heading. It includes planned features and releases, and even some wishlist items.

    Contributions of all types are welcomed. Contributions include the following.

    • Bug finding and fixes
    • Features and enhancements
    • Test scripts and test cases
    • Branch and release testing
    • Documentation and updates

    If you think you have found a bug in the library, then you should discuss it on the Users mailing list. Discussing it will help bring the issue to the attention of folks who can help resolve the issue. If you want to contribute a bug fix to the library, then make a Pull Request or make a Diff available somewhere. Also see Bug Reports on the wiki.

    Features and enhancements are welcomend additions to the library. This category tends to be time consuming because algorithms and their test cases need to be reviewed and merged. Please be mindful of the test cases, and attempt to procure them from an independent source.

    Best Binary Options Brokers 2020:
    • BINARIUM
      BINARIUM

      The Best Binary Options Broker 2020!
      Perfect For Beginners and Middle-Leveled Traders!
      Free Education.
      Free Demo Account.
      Get Your Sign-Up Bonus Now!

    • BINOMO
      BINOMO

      Recommended Only For Experienced Traders!

    The library cherishes test scripts and test cases. They ensure the library is fit and they help uncover issues with the library before users experience them. If you have some time, then write some test cases, especially the ones that are intended to break things.

    Branch and release testing is your chance to ensure Master (and planned merges) meets your expectations and perform as expected. If you have a few spare cycles, then please test Master on your favorite platform. We need more testing on MinGW, Windows Phone, Windows Store, Solaris 10 (and below), and modern iOS and OS X (including TV and Watch builds).

    Documentation and updates includes both the inline source code annotations using Doxygen, and the online information provided in the wiki. The wiki is more verbose and usually provides more contextual information than the API reference. Besides testing, documentation is one of the highest returns on investment.

    If you are interested in paid support for Crypto++ or consulting on a Crypto++ related project, then please see this list of companies and individuals providing services on the wiki. This listing is a free service for the Crypto++ community, and anyone may sign up to be listed by creating an account on the wiki.

    Использование Crypto API

    Автор: Юрий Строжевский
    свободный художник
    Источник: RSDN Magazine #5-2004

    Опубликовано: 23.04.2005
    Исправлено: 10.12.2020
    Версия текста: 2.0

    Введение

    Эта статья основана на моем личном опыте в деле написания программных продуктов криптографической направленности. Несмотря на данный, прежде всего коммерческий, опыт, здесь я постараюсь абстрагироваться от какого-то конкретного направления в Crypto API, и рассмотреть общий случай его применения.

    Предполагается, что читатель знаком с некоторыми общими для криптографии понятиями: ключ шифрования, симметричные/ассиметричные алгоритмы шифрования, понятия протоколов шифрования и т.п. Также предполагается, что читатель имеет доступ к MSDN как можно более новой редакции.

    Общие основы


    Строение и возможности Crypto API

    Прежде всего, постараемся описать круг задач, на решение которых ориентирован Crypto API:

    • надежное сокрытие данных;
    • возможность передачи сокрытых данных третьим лицам;
    • надежная система проверки достоверности пришедшей от третьих лиц информации;
    • расшифровывание полученных конфиденциальных данных;
    • работа с «идентификационными удостоверениями» третьих лиц;
    • обеспечение работы с признанными криптографическими стандартами;
    • возможность расширения и работы с пока еще неизвестными алгоритмами.

    Сперва я постараюсь рассмотреть решение задачи расширения. В Crypto API эту задачу решили довольно элегантно. Реализация всех алгоритмов (шифрования, цифровой подписи и т.п.) полностью выведена из состава самого Crypto API и реализуется в отдельных, независимых динамических библиотеках – «криптопровайдерах» (Cryptographic Service Provider – CSP). Сам же Crypto API просто предъявляет определенные требования к набору функций (интерфейсу) криптопровайдера и предоставляет конечному пользователю унифицированный интерфейс работы с CSP. Конечному пользователю для полноценного использования всех функций криптопровайдера достаточно знать его строковое имя и номер типа.

    Кроме задачи расширения одной из основных задач Crypto API является возможность однозначной идентификации передающей/принимающей стороны в протоколе передачи данных. Общепризнанным решением в данном вопросе является использование механизма сертификатов. Сертификаты как бы стали «цифровыми паспортами», несущими информацию о своих владельцах. Полный рассказ о данном механизме последует несколько позже, а сейчас стоит упомянуть, что Crypto API также полно реализует весь спектр функций работы с ним. Большинство функций Crypto API, работающих с передаваемыми данными, так или иначе, используют сертификаты в своей работе.

    В программных решениях рано или поздно встает вопрос стандартизации передаваемых между приложениями данных. В сфере криптографии для решения данного вопроса уже давно и успешно применяет набор стандартов «PKCS», предложенный компанией RSA Security. В данном комплекте стандартов учитываются все возможные случаи, возникающие в криптографических приложениях. Предусмотрены стандарты для обмена сертификатами, зашифрованными и подписанными данными и многое другое. Crypto API, как основная библиотека для обеспечения работы с криптографическими данными в Windows, также достаточно полно поддерживает данный комплект стандартов и позволяет формировать криптографические приложения, которые могут быть обработаны в дальнейшем любыми программными продуктами.

    Таким образом, мы можем разделить весь интерфейс Crypto API на 5 функциональных групп:

    1. Базовые криптографические функции:

    • функции шифрования/расшифровывания данных;
    • функции хеширования и получения цифровой подписи данных;
    • функции инициализации криптопровайдера и работы с полученным контекстом;
    • функции генерации ключей;
    • функции обмена ключами.

    2. Функции кодирования/декодирования. Под кодированием в данном случае подразумевается получение на выходе информации, кодированной в формате ASN.1 (Abstract Syntax Notation One).

    3. Функции работы с сертификатами.

    4. Высокоуровневые функции обработки криптографических сообщений.

    5. Низкоуровневые функции обработки криптографических сообщений.

    Криптопровайдеры

    Криптопровайдером называют независимый модуль, обеспечивающий непосредственную работу с криптографическими алгоритмами. Каждый криптопровайдер должен обеспечивать:

    • реализацию стандартного интерфейса криптопровайдера;
    • работу с ключами шифрования, предназначенными для обеспечения работы алгоритмов, специфичных для данного криптопровайдера;
    • невозможность вмешательства третьих лиц в схему работы алгоритмов.

    Как уже говорилось выше, сами криптопровайдеры реализуются в виде динамически загружаемых библиотек (DLL). Таким образом, достаточно трудно повлиять на ход алгоритма, реализованного в криптопровайдере, поскольку компоненты криптосистемы Windows (все) должны иметь цифровую подпись (то есть подписывается и DLL криптопровайдера). У криптопровайдеров должны отсутствовать возможности изменения алгоритма через установку его параметров. Таким образом решается задача обеспечения целостности алгоритмов криптопровайдера. Задача обеспечения целостности ключей шифрования решается с использованием контейнера ключей, о котором рассказывается ниже.

    Функции работы c криптопровайдерами можно разделить на следующие группы:

    • функции инициализации контекста и получения параметров криптопровайдера;
    • функции генерации ключей и работы с ними;
    • функции шифрования/расшифровывания данных;
    • Функции хеширования и получения цифровой подписи данных.

    В группу функций инициализации контекста входят следующие функции:

    • CryptAcquireContext . С помощью данной функции в первую очередь производится инициализация контекста криптопровайдера (получение ссылки на HANDLE, которую в дальнейшем можно использовать в других функциях). Также с помощью последнего параметра данной функции можно создать или удалить контейнер ключей.
    • CryptContextAddRef . Данная функция служит для увеличения внутреннего счетчика ссылок криптопровайдера. Эту функцию рекомендуется использовать при передаче контекста криптопровайдера в качестве члена различных структур, передаваемых функциям.
    • CryptReleaseContext . Данная функция предназначена для освобождения контекста криптопровайдера, полученного с помощью функции CryptAcquireContext . Фактически, производится только уменьшение внутреннего счетчика ссылок криптопровайдера (нечто вроде механизма подсчета ссылок у COM-объекта). Когда внутренний счетчик ссылок становится равным нулю, данный контекст криптопровайдера полностью освобождается и не может быть более нигде использован.
    • CryptGetProvParam . С помощью этой функции можно получить значение различных параметров криптопровайдера. Нужно сказать, что для всех криптопровайдеров стандартом определен лишь ограниченный набор параметров. Набор параметров криптопровайдера может сильно варьироваться в зависимости от реализации криптопровайдера.

    В группу генерации и работы с ключами входят следующие функции:

    • CryptGenKey . Данная функция предназначена для генерации сессионного ключа (ключ, используемый только в течение текущей сессии работы), а также для генерации пар ключей для обмена (публичный и закрытый ключ) и цифровой подписи.
    • CryptDuplicateKey . Функция предназначена для копирования ключа.
    • CryptGetUserKey . Функция предназначена для получения значения публичного ключа для указанного контейнера ключей. Используется для получения значений публичных ключей, предназначенных для обмена ключами и цифровой подписи.
    • CryptDestroyKey . Функция предназначена для освобождения ранее полученного хэндла ключа. Функцию следует вызывать всегда для предотвращения утечек памяти в приложении.
    • CryptGetKeyParam . Функция предназначена для получения различных параметров ключа. В качестве параметров используются алгоритм ключа (его цифровой обозначение в системе), флаги разрешения использования ключа (например, если отсутствует установленный флаг ключа CRYPY_ENCYPT, данным ключом невозможно будет зашифровать данные), данные о длине блока ключа и многое другое. В практических реализациях данной функции следует уделять достаточно большое внимание, так как зачастую именно от параметров ключа зависит работа используемого алгоритма криптопровайдера.
    • CryptSetKeyParam . Функция, обратная предыдущей. Используется для установки параметров ключа.
    • CryptDeriveKey . Функция предназначена для генерации сессионного ключа на основе хеша данных. То есть данная функция генерирует один и тот же сессионный ключ, если ей передаются одинаковые значения хеша данных. Функция полезна в случае генерации сессионного ключа на основе пароля.
    • CryptGenRandom . Функция используется для заполнения переданного ей буфера случайными данными. Используется, например, для генерации нового имени контейнера ключей.
    • CryptExportKey . Функция экспорта ключа для его передачи по каналам информации. Возможны различные варианты передачи ключа, включая передачу публичного ключа пары ключей, а также передачу секретного или сессионного ключа.
    • CryptImportKey . Функция, обратная предыдущей. Предназначена для получения из каналов информации значения ключа.

    В группу функций шифрования/расшифровывания данных входят:

    • CryptEncrypt . Основная базовая функция шифрования данных. В качестве параметров использует ранее полученные контексты криптопровайдера и сессионного ключа. Данные, генерируемые на выходе этой функции, не являются форматированными и не содержат никакой другой информации, помимо шифрованного контента (в отличие от, скажем, стандарта PKCS #7, использующего совместную передачу кодированных данных и экспортированного сессионного ключа).
    • CryptDecrypt . Основная базовая функция расшифровывания данных. В качестве параметров используются ранее полученные контекст криптопровайдера и хэндл сессионного ключа.

    В группу функций хеширования и получения цифровой подписи входят:

    • CryptCreateHash . Функция создающая хеш-объект, предназначенный для генерации хеш-значения данных. В качестве основных параметров принимает ранее полученные контекст криптопровайдера и алгоритм формирования хеша данных.
    • CryptHashData . Основная функция хеширования данных. Самым важным параметром этой функции является ссылка на хешируемые данные.
    • CryptGetHashParam . Функция используется в основном для получения значения сформированного хеша данных. Функция CryptGetHashParam завершает процедуру создания хеш-значения, и дальнейшие вызовы функции CryptHashData будут возвращать ошибку.
    • CryptSetHashParam . Функция используется для установки параметров хеша. Может быть использована, скажем, для изменения алгоритма формирования хеша.
    • CryptDestroyHash . Функция используется для освобождения хеш-объекта.
    • CryptDuplicateHash . Функция получения копии хеша. Используется при передаче хеша между функциями.
    • CryptSignHash . Основная базовая функция получения цифровой подписи данных. Нужно отметить, что в Crypto API для уменьшения длины цифровой подписи (и ускорения работы ассиметричных алгоритмов, используемых для формирования цифровой подписи) в качестве входных данных используют хеш. Функций, использующих для получения цифровой подписи сами данные, в Crypto API нет.
    • CryptVerifySignature . Основная базовая функция проверки цифровой подписи. В качестве входных данных опять-таки используется значение хеша.

    В Crypto API криптопровайдеры принято группировать по их названиям (строковые величины), а также по номерам их типов. Тип криптопровайдера, в общем случае, ничего не сигнализирует обычному пользователю и служит лишь для вспомогательной группировки провайдеров. Исключение составляет тип PROV_RSA_FULL (его номер – 1), который присваивают себе только те криптопровайдеры, которые полностью поддерживают работу со стандартом RSA.

    Сначала получим полный перечень строковых имен криптопровайдеров. Наиболее простым способом для этого является использование функции CryptEnumProviders :

    Для перечисления типов криптопровайдеров, установленных в системе, можно использовать функцию CryptEnumProviderTypes :

    Но, к сожалению, использование данных функций иногда вызывает трудности, так как в Windows 98 эти функции не работают. В качестве выхода из ситуации используют прямое обращение к реестру для перечисления как всех криптопровайдеров, так и их типов.

    Пример перечисления криптопровайдеров с прямым обращением к реестру:

    Пример перечисления типов криптопровайдеров при прямом обращении к реестру:

    Контейнеры ключей

    Контейнером ключей называют часть базы данных ключей, которая содержит пару ключей для обмена ключами и формирования цифровой подписи. В качестве контейнеров ключей (хранилищ пар ключей) используют, например, область временной памяти, участок реестра, файл на диске, смарт-карты. Контейнеры ключей в системе могут быть двух типов: пользовательские и уровня системы. Пользовательские контейнеры существуют в контексте работы текущего пользователя. По умолчанию доступа к ним больше никто не имеет (правда, существуют возможности выдачи доступа к контейнерам для других пользователей). Контейнеры ключей уровня системы используются, в основном, не в пользовательских программах, а, например, в сервисах (доступ к контейнерам ключей уровня системы возможен без интерактивной идентификации пользователя в системе). Контейнеры ключей не существуют сами по себе, а существуют только в контексте криптопровайдера. Для каждого криптопровайдера существует свой собственный набор контейнеров ключей. Это объясняется тем, что разные криптопровайдеры могут по-разному реализовывать даже один и тот же математический алгоритм. Следовательно, и способы хранения ключей могут также сильно варьироваться от криптопровайдера к криптопровайдеру.

    Основными операциями с контейнерами ключей можно считать:

    • Создание нового контейнера ключей. Выполняется посредством функции CryptAcquireContext , описанной ранее в разделе о криптопровайдерах. Для создания нового контейнера ключей в качестве последнего параметра данной функции передается значение CRYPT_NEWKEYSET. Необходимо также заметить, что исходно в новом контейнере ключей никаких данных не содержится, и пары ключей необходимо генерировать самостоятельно посредством вызова функции CryptGenKey , или импортировать.
    • Удаление существующего контейнера ключей. Выполняется посредством вызова функции CryptAcquireContext с последним параметром, установленным в CRYPT_DELETEKEYSET.
    • Генерация новой пары ключей. Выполняется посредством вызова функции CryptGenKey . При генерации пары ключей для обмена ключами третий параметр данной функции устанавливают в AT_KEYEXCHANGE, а при генерации пары ключей для формирования цифровой подписи – AT_SIGNATURE. Нужно заметить, что многие криптопровайдеры позволяют использовать пару ключей, созданную для обмена, также и для формирования цифровой подписи.
    • Получение значения пары ключей. Выполняется посредством вызова функции CryptGetUserKey . Флаги, передаваемые в данную функцию, соответствуют флагам для генерации пары ключей.
    • Установка параметров. Выполняется посредством вызова функции CryptSetProvParam . В основном устанавливают только один параметр – дескриптор безопасности контейнера ключей. Данный параметр используется, например, для выдачи доступа к контейнеру не только пользователю, создавшему контейнер. Остальные параметры контейнера ключей могут сильно варьироваться от криптопровайдера к криптопровайдеру, и обычно хорошо расписаны в документации, поставляемой непосредственно с криптопровайдером.
    • Получение параметров. Выполняется посредством вызова функции CryptGetProvParam . Набор получаемых параметров также может сильно варьироваться в зависимости от криптопровайдера. В качестве интересного стандартного параметра можно назвать параметр PP_UNIQUE_CONTAINER. В качестве возвращаемого параметра передается уникальная (в масштабах всей системы) строка, идентифицирующая контейнер ключей. В частности, по этой строке часто можно узнать физическое расположение контейнера ключей (например, для контейнера ключей, расположенного в регистре системы, в начале возвращаемой строки будет «REGISTRY»).
    • Перечисление контейнеров ключей. Выполняется отдельно для каждого криптопровайдера в системе с помощью вызова функции CryptGetProvParam c параметром dwParam установленным в PP_ENUMCONTAINERS.

    Алгоритмы

    В Crypto API все криптографические алгоритмы реализуются внутри криптопровайдеров. Таким образом, криптопровайдер позволяет устанавливать или получать различные параметры алгоритма, получать выходную информацию алгоритма и многое другое. Внутри Crypto API алгоритмы принято делить на следующие группы:

    • алгоритмы шифрования/расшифровывания;
    • алгоритмы получения значения хеша;
    • алгоритмы получения цифровой подписи;
    • алгоритмы обмена криптографическими ключами.

    Для дальнейшего понимания сущности работы с алгоритмами необходимо также ввести понятия симметричных и ассиметричных алгоритмов шифрования. Симметричным алгоритмом называют алгоритм, в котором для шифрования и расшифровывания используется один и тот же ключ. Ассиметричными называют алгоритмы, в которых используется пара ключей (в общем случае может быть и более двух ключей), один из которых используется для шифрования (и только для шифрования) информации, а другой – для расшифровывания. В качестве ассиметричных алгоритмов принято применять так называемые алгоритмы с открытым ключом. В таких алгоритмах существует пара ключей – открытый (публичный) и закрытый (секретный) ключи. В большинстве случаев для шифрования информации используется публичный ключ, а для расшифровывания – секретный. Публичный ключ не является предметом секретности и предназначен для передачи по открытым каналам. Лицо, получившее публичный ключ, может зашифровать им данные и отослать их по тем же открытым каналам лицу, владеющему секретным ключом. В свою очередь на стороне получателя расшифровывание возможно только при наличии секретного ключа из той пары ключей, к которой принадлежит публичный ключ, применявшийся для шифрования. Таким образом, достигается возможность обмениваться шифрованными сообщениями, не заботясь о том, что ключ может быть перехвачен в процессе пересылки.

    Ассиметричные алгоритмы в обычной жизни мало применимы. Причина тому – высокая трудоемкость шифрования, обусловленная повышенной сложностью ассиметричных алгоритмов. Обычно используют следующую схему: шифрование данных выполняется симметричным криптографическим алгоритмом некоторым сгенерированным для этого сессионным ключом. Затем для передачи получателю этот ключ шифруется с помощью асимметричного алгоритма (длина ключа несущественно мала по сравнению с возможным размером данных). На стороне получателя с помощью асимметричного алгоритма расшифровывается сессионный ключ, который используется для расшифровывания полученных данных с помощью симметричного алгоритма. Такой способ передачи шифрованной информации позволяет использовать преимущества обоих подходов.

    Именно такой подход использован во всех ключевых алгоритмах работы Crypto API. Контейнеры ключей хранят пары ключей, необходимые для обмена сессионными ключами, а для непосредственно шифрования данных необходимо каждый раз генерировать новые сессионные ключи.

    Рассмотрим основные операции, выполняемые над алгоритмами в Crypto API:

    • Перечисление всех криптографических алгоритмов. Выполняется посредством вызова функции CryptGetProvParam с параметром dwParam, установленным в PP_ENUMALGS.
    • Получение параметров алгоритмов. Обычно выполняется прямо во время перечисления алгоритмов посредством вызова функции CryptGetProvParam с параметром dwParam установленным в PP_ENUMALGS_EX. В этом случае получаемая структура может содержать практически всю информацию об алгоритме.

    Зачастую также требуется найти криптопровайдер, реализующий некий известный нам алгоритм. Для идентификации алгоритмов в пределах системы все алгоритмы криптопровайдеров имеют уникальный цифровой номер. Данный номер в системе имеет тип ALG_ID и представляет собой простое число типа DWORD. Наряду с нумерацией алгоритмов на основе ALG_ID существует и другой идентификатор – OID. Данный идентификатор пришел из спецификаций криптографических стандартов фирмы RSA Security и представляет собой строку, состоящую из групп цифр, разделенных точками. В стандартах жестко закреплено значение каждой группы цифр в OID, и по данному номеру можно получить некоторую дополнительную информацию (например, фирму-разработчика алгоритма). Преобразование между типами номеров алгоритмов осуществляется функциями CertAlgIdToOID и CertOIDToAlgId .

    Сертификаты

    Полное пояснение по данному понятию будет дано в отдельном разделе. Здесь же о сертификатах упомянуто, поскольку сертификаты все-таки используются в высокоуровневых функциях обработки криптографических сообщений типа CryptSignMessage . Пока важно понимать, что сертификаты в системе используются для:

    • хранения дополнительной информации о владельце сертификата;
    • хранения значения публичного ключа владельца;
    • получения ссылки на контейнер ключей. С сертификатом, установленным в системе, может быть физически связан контейнер ключей. То есть, имея только ссылку на контекст сертификата можно установить однозначную связь с секретным ключом и использовать это, например, при проверке цифровой подписи или расшифровывании данных.

    В упрощенном виде сертификаты можно считать некоторыми удостоверениями личности. Правами выдавать сертификаты (как и паспорта), в идеале должны обладать только доверенные центры (например, ФСБ или милиция). Но, в принципе, можно генерировать сертификаты и самому. В этом случае тот пользователь, который будет использовать данный сертификат, вправе либо доверять, либо не доверять сертификату («. паспорт можно и самому нарисовать. »). Для целей дальнейшего изучения высокоуровневых функций обработки криптографической информации нам важны лишь два последних случая использования сертификатов из перечисленных: сертификаты хранят публичный ключ и могут быть связаны с контейнером ключей, в котором хранится секретный ключ. Этой информации на данном этапе будет достаточно.

    Если вы не имели опыта работы с сертификатами, то для ознакомления с ними, можно вызвать Internet Explorer, выбрать в его меню пункт «Сервис / Свойства обозревателя» («Tools / Internet Options»), а затем на закладке «Содержание» («Content») нажать на кнопку «Сертификаты» («Certificates»). Вашему вниманию будет представлен список сертификатов, установленных в системе.

    Базовые функции


    Шифрование

    Базовая функция шифрования данных имеет следующее объявление:

    Первым параметром данной функции передается хендл сессионного ключа, применяемого для шифрования. Второй параметр достаточно редко используется и предназначен для получения хеша данных одновременно с их шифрованием. Такая возможность достаточно полезна при формировании одновременно как шифрованных данных, так и цифровой подписи этих же данных.

    Эта функция может обрабатывать данные блоками. То есть нет необходимости сразу загружать в память целиком весь массив данных, а лишь потом передавать ссылку на него криптографической функции. Достаточно передавать массив данных поблочно, специальным образом отметив лишь последний блок данных (это обычно нужно, чтобы криптопровайдер провел некоторые действия после использования сессионного ключа). Для указания того, что это последний блок данных, в функции CryptEncrypt используется третий параметр Final . Четвертый параметр служит указателем на массив входных/выходных данных. Здесь нужно сразу отметить некоторую общую схему работы с данными в Crypto API. Если возвращаемые данные могут быть любого размера (а это возможно, ведь, скажем, в алгоритме может происходить простая замена, когда одна буква кодируется четырьмя цифрами), то работа с функцией состоит из двух этапов. На первом этапе в функцию передается общий размер входных данных и NULL в качестве ссылки на сам массив выходных данных. Функция возвращает длину выходного массива данных, пользователь инициализирует память необходимого размера и лишь затем заново передает функции ссылку на этот массив. Такая же схема используется и в работе с функцией CryptEncrypt . Параметр pdwDataLen служит для возврата размера данных, возвращаемых функцией. Параметр dwBufLen служит для указания длины входного буфера данных. Параметр dwFlags обычно не используется и устанавливается в 0.

    Пример использования функции CryptEncrypt приведен ниже:

    Экспорт сессионных ключей

    После выполнения операции шифрования встает проблема передачи шифрованных данных. Сами по себе данные, конечно, передавать можно, вследствие их защищенности. Но напомним еще раз, что в Crypto API используются симметричные алгоритмы шифрования, и если на принимающей стороне не будет использован тот же самый сессионный ключ, который был использован для шифрования, то расшифровать данные на принимающей стороне не удастся. В самих шифрованных данных Crypto API самостоятельно сессионные ключи также не передает. Вместо этого Crypto API предоставляет развитые механизмы экспорта значения сессионного ключа во внешний массив данных.

    Базовая функция экспорта ключей имеет следующее описание:

    Первым параметром данной функции передается хендл ключа, который будет экспортирован. Фактически, экспорт ключа можно представить как отдельную операцию шифрования ключа. Следовательно, для такой операции необходим еще один ключ шифрования. Обычно в Crypto API сессионный ключ шифруют с помощью асимметричного алгоритма. Параметр hExpKey в большинстве случаев инициализируют контекстом публичного ключа получателя. Параметр dwBlobType определяет формат получаемого блока экспорта. Возможно, скажем, указать, что экспорту будет подлежать только лишь публичный ключ. В этом случае параметр hExpKey должен быть равен 0 (шифрование публичного ключа не нужно) и на выходе функции получается простое значение публичного ключа. Для такого случая параметр dwBlobType должен быть равен PUBLICKEYBLOB. Обычно же, при экспорте сессионного ключа используется значение SIMPLEBLOB. Остальные значения данного параметра достаточно специфичны и применяются редко. Параметры pbData и pdwDataLen указывают на массив, выделенный для получения экспортируемого ключа, и на его размер.

    СОВЕТ

    Хотелось бы также обратить внимание читателя на достаточно важный момент: иногда для обмена ключами используются несколько более сложные схемы, чем просто шифрование данных сессионного ключа публичным ключем. Примером подобной усложненной схемы обмена может служить алгоритм обмена ключами по методу Диффи-Хеллмана. В данном алгоритме используются оба публичных ключа – как отправителя, так и получателя. Более подробную информацию о данном алгоритме читатель может найти в специализированной литературе.

    Пример использования этой функции приведен ниже:

    Импорт сессионных ключей

    Базовая функция импорта ключей имеет следующее описание:

    В качестве первого параметра в данную функцию передается инициализированный контекст криптопровайдера. Должен отметить, что для успешного завершения работы функции CryptImportKey необходимо, чтобы при инициализации криптопровайдера был указан контейнер ключей. В частности, это необходимо для успешного импорта секретных ключей в контейнер ключей. Параметр pbData представляет собой ссылку на импортируемые данные, параметр dwDataLen – длину этих данных. В параметре hPubKey указывают хендл ключа, применяемого при импорте (для расшифровывания сессионного ключа). Параметр dwFlags обычно не применяется и может быть установлен в 0. В параметре phKey возвращается импортированный ключ.

    Пример использования данной функции приведен ниже:

    Расшифровывание

    Базовая функция расшифровывания имеет следующее описание:

    Первым параметром данной функции передается инициализированный контекст сессионного ключа, применяемого для расшифровывания данных. Второй параметр, как и в предыдущем примере, связан, по большей части, с функцией получения и проверки цифровой подписи. Обычно он не используется и устанавливается в 0. Параметр dwFlags чаще всего не используется и также устанавливается в 0. Параметры pbData и pdwDataLen используются точно так же, как и у CryptEncrypt и представляют собой ссылку на входной/выходной массив данных и длину этого массива данных.

    Пример использования функции CryptDecrypt приведен ниже:

    Хеширование

    Под хешированием понимают применение некоторой математической функции (называемой хеш-функцией) к некоторым данным. При применении хеш-функции к произвольному объему данных всегда получается массив данных фиксированного размера. К хеш-значению предъявляется требование «устойчивости к коллизиям». Это значит, что хеш-функция тем лучше, чем труднее найти два таких случайных входных массива данных, для которых совпадали бы генерируемые хеш-значения. При обработке одних и тех же данных хеш-функция обязана возвращать одно и то же хеш-значение. Это свойство хеш-функций используется, прежде всего, для контроля над целостностью данных. Ведь если мы изменим хоть бит во входном массиве информации, то результат работы хеш-функции (с высокой вероятностью) будет другим.

    В Crypto API для манипуляции с хэшем используется специальный хэш-объект. Взаимодействие с этим объектом осуществляется с помощью следующих трех функций:

    • CryptCreateHash ;
    • CryptHashData ;
    • CryptGetHashParam .

    Для первичной инициализации хэш-объекта применяют функцию CryptCreateHash . Данная функция имеет следующее описание:

    В качестве первого параметра данной функции передается инициализированный контекст криптопровайдера. Вторым параметром указывается алгоритм получения значения хеша. Параметр hKey необходим лишь в случае применения специализированных алгоритмов типа MAC и HMAC .

    СОВЕТ

    MAC (Message Authentication Code, русский термин – «имитовставка»), переводится как «код проверки подлинности сообщения». Фактически, MAC предназначен для проверки значения хеш-значения только людьми, имеющими необходимый ключ. Можно воспринимать это как дополнительное шифрование значения, полученного с помощью хеш-функции (хотя это и не совсем так). Также MAC можно использовать в качестве простейшей цифровой подписи. HMAC (Hash-based Message Authentication Code) является разновидностью MAC .

    Параметр dwFlags зарезервирован под возможное будущее использование и должен быть всегда равен 0. Через параметр phHash функция возвращает хендл созданного ей хеш-объекта. После того, как хеш-объект станет ненужным, нужно освободить хеш-объект с помощью вызова функции CryptDestroyHash.

    После инициализации хеш-объекта можно начать передачу данных хеш-функции с помощью вызова CryptHashData . Данная функция имеет следующее описание:

    В качестве первого параметра данной функции передается ранее инициализированный хендл хеш-объекта. Вторым параметром передается порция данных для хеш-функции. Параметр dwDataLen представляет собой длину передаваемых данных. Параметр dwFlags обычно равен нулю.

    После полной передачи всего массива входных данных функции CryptHashData возникает необходимость в получении значения хеш-функции. Данная задача решается с применением функции CryptGetHashParam . Данная функция имеет следующее описание:

    В качестве первого параметра данной функции передается ранее инициализированный хендл хеш-объекта. Второй параметр, dwParam, функции определяет тип запрашиваемого значения. Для получения хеш-значения необходимо передать вторым аргументом значение HP_HASHVAL. Параметры pdData и pdwDataLen отвечают за блок памяти, используемый под возвращаемое значение. Параметр dwFlags зарезервирован для будущего использования и должен быть равен нулю.

    Для проверки правильности хеш-значения нужно получить хэш-значение данных и сверить его с проверяемым хэш-значением.

    Пример получения хеш-значения приведен ниже:

    Цифровая подпись

    Под цифровой подписью понимают некую производную данных, по которой однозначно можно определить целостность и отправителя присланных данных. В простейшем случае под цифровой подписью можно понимать даже собственно шифрованный контент в случае, когда ключ шифрования не скомпрометирован и однозначно принадлежит известному отправителю информации. На практике же используют гораздо более интересный метод: первично используют получение хеша данных, а затем шифруют полученное хеш- значение с помощью алгоритма с открытым ключом. Таким образом, по полученной цифровой подписи можно судить как о целостности данных (расшифровав цифровую подпись, мы можем затем проверить полученное значение хеша), так и об отправителе данных (для получения цифровой подписи используется не публичный ключ отправителя, а секретный, который может быть использован только самим отправителем).

    Именно такой подход к формированию цифровой подписи используется в базовых функциях Crypto API для работы с подписью. Базовая функция получения подписи хеша данных имеет следующее описание:

    В качестве первого параметра используется значение хендла хеш-объекта, уже инициализированного данными (с помощью функции CryptHashData ). Параметр dwKeySpec определяет, какая именно пара ключей будет использована для формирования подписи ( AT_KEYEXCHANGE (пара для обмена ключами) или AT_SIGNATURE (пара для формирования цифровой подписи)). Еще раз хочется обратить внимание читателя, что во многих криптопровайдерах пара ключей, предназначенная для обмена ключами, может также использоваться и для формирования цифровой подписи (но не во всех криптопровайдерах). Параметр sDescription более не используется в данной функции и его значение должно всегда быть установлено в NULL . Параметр dwFlags обычно устанавливают также в 0. Параметры pbSignature и pdwSigLen используют для корректного указания ссылки на массив выходных данных и его размера.

    Пример использования данной функции приведен ниже:

    Проверка цифровой подписи

    Для проверки цифровой подписи хеш-значения используется базовая функция, имеющая следующее описание:

    В качестве первого параметра в функцию передается хендл хеш-объекта, предварительно инициализированный данными посредством функции CryptHashData . Второй и третий параметры отвечают за передачу значения проверяемой подписи. Параметр hPubKey используется для указания хендла публичного ключа отправителя подписи (того, кто собственно сформировал цифровую подпись). Параметр sDescription в настоящее время более не используется и его значение должно быть установлено в NULL . Параметр dwFlags также обычно не несет полезной нагрузки и устанавливается в 0.

    Пример использования данной функции приведен ниже:

    Высокоуровневые функции обработки сообщений


    Введение

    В рассмотренных выше базовых функциях работы с криптографическими сообщениями все выглядит достаточно хорошо. За исключением работы на уровне общепринятых в криптографии форматов данных. То есть выходные данные, полученные с помощью базовых функций Crypto API, можно обработать только этими же базовыми функциями Crypto API. Этот недостаток устраняется путем применения высокоуровневых функций для работы с криптографическими приложениями.

    В основе работы данных функций лежит стандарт PKCS #7 (RFC 2315). Более подробно об этом стандарте будет рассказано несколько позднее, а здесь будет сказано лишь о его основных особенностях.

    Основу стандарта PKCS #7 составляют способы кодирования и описания различных данных, используемых в криптографических приложениях. Так, предоставляются стандарты по кодированию шифрованных и подписанных сообщений, стандарт кодирования сессионного ключа, стандарт кодирования информации о сертификате и многое другое. Работа со стандартом PKCS #7 реализована на многих платформах, отличных от MS Windows, что позволяет создавать кроссплатформенные приложения . Высокоуровневые функции скрывают многие не очень существенные моменты использования стандарта PKCS #7, благодаря чему упрощается работа с криптографическими данными.

    Между тем, одним из ограничений в работе высокоуровневых функций следует признать недопустимость поблочной загрузки входных данных – эти функции работают только с одним, загруженным в память блоком. Для работы с большими объемами данных и более тонкого использования всех возможностей Crypto API в работе со стандартом PKCS предназначены низкоуровневые функции обработки сообщений, о которых будет рассказано позднее.

    Шифрование

    Для шифрования используется функция CryptEncryptMessage . Данная функция имеет следующее описание:

    В качестве первого параметра данной функции передается указатель на структуру CRYPT_ENCRYPT_MESSAGE_PARA. В полях данной структуры передается информация об используемом для шифрования криптопровайдере, используемом алгоритме и вспомогательная информация, нужная для правильной работы выбранного алгоритма. Параметр cRecipientCert передает количество используемых сертификатов получателей. Сам массив используемых сертификатов получателей передается в параметре rgpRecipientCert .

    СОВЕТ

    Собственно сертификаты в данных функциях используются, в основном, для экспорта сессионного ключа, сформированного при шифровании. Того, что сертификаты сами по себе хранят публичные ключи получателей, вполне должно хватить для экспорта сессионного ключа. В случае нескольких получателей данных для каждого получателя формируется свой массив экспортированного ключа. Кроме того, используется также другое свойство сертификатов: каждый из них имеет некий уникальный идентификационный номер. Вставляя этот номер в полученный массив экспортированных сессионных ключей, мы получаем возможность на стороне получателя найти необходимый для корректного импорта сессионного ключа элемент данного массива.

    Параметры pbToBeEncrypted и cbToBeEncrypted идентифицируют область обрабатываемых данных. Зашифрованный контент и его размер возвращается через параметры pbEncryptedBlob и pcbEncryptedBlob соответственно.

    Пример использования данной функции приведен ниже:

    Расшифровывание

    Для расшифровывания зашифрованного контента применяется функция CryptDecryptMessage , имеющая следующее описание:

    В качестве первого параметра данной функции передается указатель на структуру типа CRYPT_DECRYPT_MESSAGE_PARA. В полях данной структуры передается список хранилищ сертификатов, в которых будет производиться поиск сертификата для импорта сессионного ключа (сертификата обмена). В параметрах pbEncryptedBlob и cbEncryptedBlob передается информация о блоке входных данных, подлежащих расшифровке. В параметрах pbDecrypted и pcbDecrypted передаются принимающий буфер и его размер соответственно. В этот буфер будут помещены расшифровываемые данные. В параметре ppXchgCert возвращается ссылка на контекст сертификата, который был использован для обмена (если эта информация не нужна, то данный параметр должен быть установлен в NULL ).

    ПРЕДУПРЕЖДЕНИЕ

    Необходимо отметить, что сертификат, используемый для импорта сессионного ключа (сертификат обмена) на стороне получателя должен быть связан с локальным контейнером ключей. Иначе не будет найден секретный ключ пары ключей, и функция будет выполнена с ошибкой (никаких расшифрованных данных получить не удастся).

    Пример использования этой функции приведен ниже:

    Цифровая подпись

    В отличие от простейшего случая формирования цифровой подписи базовыми функциями в стандарте PKCS предусмотрено существование двух видов цифровой подписи: подпись, совмещенная с подписываемыми данными ( attached signature ) и подпись, отдельная от данных ( detached signature ). Функция CryptSignMessage , формирующая оба эти вида подписей, имеет следующее описание:

    В качестве первого параметра данной функции передается указатель на структуру типа CRYPT_SIGN_MESSAGE_PARA. В полях данной структуры передается информация о сертификате, с помощью которого будет производиться подпись (сертификат, заверяющий подписчика), алгоритм формирования хеш-значения переданных данных, массив дополнительных сертификатов, которые необходимо включить в состав цифровой подписи, и некоторые вспомогательные величины. Параметр fDetachedSignature задает тип получаемой цифровой подписи (отделенная или совмещенная с данными). Параметр cToBeSigned указывает на количество элементов массива подписываемых данных.

    ПРЕДУПРЕЖДЕНИЕ

    Если флаг fDetachedSignature установлен в false , параметр cToBeSigned всегда должен быть равен 1. Это связано с особенностями реализации низкоуровневых функций работы с криптографическими сообщениями, особенности которых будут рассмотрены позднее.

    Параметр rgpbToBeSigned представляет собой массив данных, передаваемых для формирования цифровой подписи. Параметр rgcbToBeSigned представляет собой массив размеров элементов переданного массива данных. Выходное значение функции (цифровая подпись) формируется в параметрах pbSignedBlob и pcbSignedBlob .

    Пример использования данной функции приведен ниже:

    Проверка цифровой подписи

    Для проверки цифровой подписи в состав высокоуровневых функций работы с сообщениями входят функции CryptVerifyMessageSignature и CrypVerifyDetachedMessageSignature . Первая функция предназначена для проверки цифровой подписи, совмещенной с данными. Результат проверки (правильна или неправильна цифровая подпись) можно узнать, проанализировав возвращаемое значение этой функции. Вторая функция предназначена для проверки цифровой подписи, не содержащей сами подписываемые данные. Первая из этих функций имеет следующее описание:

    В качестве первого параметра данной функции передается указатель на структуру типа CRYPT_VERIFY_MESSAGE_PARA. В полях данной структуры передается информация о контексте криптопровайдера, применяемом для проверки подписи, и ссылке на функцию, с помощью которой находится сертификат подписчика в локальных хранилищах данных. В случае, когда ссылка на данную функцию равна NULL , функция CryptVerifyMessageSignature ищет данный сертификат внутри самой цифровой подписи. Параметр dwSignerIndex задает номер подписчика, для которого необходимо проверить подпись (в одном файле подписи потенциально может быть несколько цифровых подписей от различных подписчиков). Для первого подписчика параметр dwSignerIndex должен быть равным 0. В параметрах pbSignedBlob и cbSignedBlob передается информация о входном блоке данных, подлежащем проверке. В параметрах pbDecoded и pcbDecoded может быть передана информация о блоке памяти, в который помещается раскодированное проверяемое сообщение (для которого, собственно, и была сформирована цифровая подпись). В случае, когда данная информация не нужна, параметры pbDecoded и pcbDecoded должны быть установлены в NULL . В параметре ppSignerCert возвращается двойной указатель на контекст сертификата подписчика.

    Пример использования этой функции примерно соответствует примеру для функции CryptVerifyDetachedMessageSignature , приведенному ниже.

    Функция, проверяющая отсоединенную от данных цифровую подпись, имеет следующее описание:

    Параметры pVerifyPara и dwSignerIndex имеют точно такой же смысл, что и соответствующие параметры функции CryptVerifyMessageSignature . Параметры pbDetachedSignedBlob и cbDetachedSignedBlob описывают область памяти, которая хранит собственно проверяемые данные. Параметр cToBeSigned описывает количество элементов в массивах, передаваемых в параметрах rgpbToBeSigned и rgcbToBeSigned . Параметр rgpbToBeSigned представляет собой массив областей памяти, содержащий в себе данные, для которых проверяется цифровая подпись. Параметр rgcbToBeSigned содержит массив размеров блоков памяти, указанных в параметре rgpbToBeSigned . В параметре ppSignerCert возвращается двойной указатель на контекст сертификата подписчика. Результат проверки (правильна или неправильна цифровая подпись) возвращается как результат выполнения функции CryptVerifyDetachedMessageSignature .

    Пример использования данной функции приведен ниже:

    Совмещение цифровой подписи и шифрованных данных

    Кроме применения формирования отдельно шифрованного и отдельно подписанного контентов в стандарте PKCS #7 предусмотрено получение контента, который представляет собой цифровую подпись, совмещенную с зашифрованными данными (сначала формируется цифровая подпись открытых данных, затем данные шифруются). Таким образом, собственно проверка данных может быть осуществлена получателем шифрованных данных, для которого они предназначались. Такой способ передачи данных хорош, прежде всего, отсутствием передачи проверяемых данных в открытом виде.

    Функция CryptSignAndEncryptMessage , осуществляющая подобную работу в Crypto API, имеет следующее описание:

    Так как, по сути, выполнение данной функции состоит из последовательного применения функций для получения цифровой подписи и функции шифрования, то параметры у функции CryptSignAndEncryptMessage точно совпадают с параметрами составляющих ее функций. Значение всех этих параметров было объяснено ранее в соответствующих разделах.

    Пример использования данной функции приведен ниже:

    Расшифровывание и проверка совмещенной цифровой подписи и шифрованных данных

    Для расшифровывания и проверки совмещенных цифровой подписи и шифрованных данных применяют специальную функцию CryptDecryptAndVerifyMesageSignature , имеющую следующее описание:

    Значения параметров данной функции полностью аналогичны значениям параметров функций CryptDecryptMessage и CryptVerifyMessageSignature . Результат проверки (правильна или неправильна цифровая подпись) получается как результат функции CryptDecryptAndVerifyMessageSignature .

    Пример использования данной функции приведен ниже:

    Работа с форматом Base64 (PEM)

    Кроме стандарта PKCS #7 достаточно часто можно встретить употребление другого стандарта – PEM (Privacy-Exchanged Mail). Фактически же в данном стандарте применяются два последовательных кодирования: первичное в PKCS #7 и вторичное в Base64 . То есть если мы после завершения шифрования высокоуровневой функцией CryptEncryptMessage закодируем полученный результат в кодировке Base64 , то полученный результат можно принять за образец применения стандарта PEM .

    Работа с Base64 крайне проста и реализована во многих библиотеках. В частности, я бы хотел порекомендовать читателям средства, предоставляемые функциями Base64Encode и Base64Decode . Данные функции объявлены в заголовочном файле библиотеки ATL “atlenc.h” . Работа с данными функциями достаточно проста. Ниже приведен пример использования данных функций.

    CAPICOM

    Зачастую применение непосредственно функций Crypto API достаточно проблематично. Например, в Web-клиентах, где вызовы процедур напрямую невозможны. Для подобных целей, а также для упрощения работы с Crypto API был создан тип объектов CAPICOM (Crypto API COM-object). В своей реализации данный объект почти полностью охватывает все то, о чем говорилось выше в данной статье: от шифрования до работы с сертификатами. Благодаря использованию дуальных интерфейсов, доступ к данному объекту возможен как из клиентов с ранним связыванием (C++), так и с поздним (VBscript).

    В основе работы всех функций CAPICOM лежит использование высокоуровневых функций работы с криптографическими сообщениями, которые были рассмотрены ранее. Таким образом, базовым стандартом для выходных данных является стандарт PKCS #7 , вторично кодированный Bas64 . Так же, как и в случае высокоуровневых функций, работа ведется только с относительно небольшим участком данных, загруженных в память. Работа с данными большого объема или работа с поблочной загрузкой данных в объекте не предусмотрена.

    ПРЕДУПРЕЖДЕНИЕ

    Несмотря на то, что объект CAPICOM в качестве выходных данных использует общепринятый стандарт PKCS #7 , используемый в функциях Crypto API, полной прямой совместимости между функциями Crypto API и CAPICOM нет. То есть выходная информация объекта CAPICOM не может быть использована в качестве входной для функций Crypto API. Дело в том, что в объекте CAPICOM происходит некоторое предварительное изменение входных данных перед выполнениями функций. То есть алгоритм выполнения, например, функции подписи, выглядит так:

    1. Получить входные данные.

    2. Изменить их (для внутреннего использования).

    3. Вызвать стандартные функции Crypto API.

    В качестве «изменения» входных данных используется простое дополнение к каждому символу исходной информации символа с кодом 0x00.

    Подробно работа с объектом типа CAPICOM в данной статье рассматриваться не будет, так как сам по себе объект не входит в состав Crypto API и рассказ о нем несколько выходит за рамки этой статьи.

    CryptoCode Software Test

    Any questions or suggestions? Write us an email [email protected]

    Best Binary Options Brokers 2020:
    • BINARIUM
      BINARIUM

      The Best Binary Options Broker 2020!
      Perfect For Beginners and Middle-Leveled Traders!
      Free Education.
      Free Demo Account.
      Get Your Sign-Up Bonus Now!

    • BINOMO
      BINOMO

      Recommended Only For Experienced Traders!

    Like this post? Please share to your friends:
    Binary Options Brokers, Signals and Strategies
    Leave a Reply

    ;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: