Хэш-функции и криптографические функции
|
В данном разделе при описании функций приняты следующие обозначения:
|
Функции хэширования и контрольных сумм
crc
Вычисляет CRC — контрольную сумму value. Используемый алгоритм вычисления задается опционально.
Спецификация функции
crc(value: <строка>, [algorithm: <строка>])
:: <строка>, <ошибка>
| Аргумент | Тип | Описание | По умолчанию | Обязателен |
|---|---|---|---|---|
|
строка |
Строка, для которой вычисляется контрольная сумма. |
да |
|
|
строка |
Алгоритм CRC. Допустимые значения см. ниже. |
|
нет |
Допустимые алгоритмы CRC:
-
"CRC_3_GSM"; -
"CRC_3_ROHC"; -
"CRC_4_G_704"; -
"CRC_4_INTERLAKEN"; -
"CRC_5_EPC_C1G2"; -
"CRC_5_G_704"; -
"CRC_5_USB"; -
"CRC_6_CDMA2000_A"; -
"CRC_6_CDMA2000_B"; -
"CRC_6_DARC"; -
"CRC_6_GSM"; -
"CRC_6_G_704"; -
"CRC_7_MMC"; -
"CRC_7_ROHC"; -
"CRC_7_UMTS"; -
"CRC_8_AUTOSAR"; -
"CRC_8_BLUETOOTH"; -
"CRC_8_CDMA2000"; -
"CRC_8_DARC"; -
"CRC_8_DVB_S2"; -
"CRC_8_GSM_A"; -
"CRC_8_GSM_B"; -
"CRC_8_HITAG"; -
"CRC_8_I_432_1"; -
"CRC_8_I_CODE"; -
"CRC_8_LTE"; -
"CRC_8_MAXIM_DOW"; -
"CRC_8_MIFARE_MAD"; -
"CRC_8_NRSC_5"; -
"CRC_8_OPENSAFETY"; -
"CRC_8_ROHC"; -
"CRC_8_SAE_J1850"; -
"CRC_8_SMBUS"; -
"CRC_8_TECH_3250"; -
"CRC_8_WCDMA"; -
"CRC_10_ATM"; -
"CRC_10_CDMA2000"; -
"CRC_10_GSM"; -
"CRC_11_FLEXRAY"; -
"CRC_11_UMTS"; -
"CRC_12_CDMA2000"; -
"CRC_12_DECT"; -
"CRC_12_GSM"; -
"CRC_12_UMTS"; -
"CRC_13_BBC"; -
"CRC_14_DARC"; -
"CRC_14_GSM"; -
"CRC_15_CAN"; -
"CRC_15_MPT1327"; -
"CRC_16_ARC"; -
"CRC_16_CDMA2000"; -
"CRC_16_CMS"; -
"CRC_16_DDS_110"; -
"CRC_16_DECT_R"; -
"CRC_16_DECT_X"; -
"CRC_16_DNP"; -
"CRC_16_EN_13757"; -
"CRC_16_GENIBUS"; -
"CRC_16_GSM"; -
"CRC_16_IBM_3740"; -
"CRC_16_IBM_SDLC"; -
"CRC_16_ISO_IEC_14443_3_A"; -
"CRC_16_KERMIT"; -
"CRC_16_LJ1200"; -
"CRC_16_M17"; -
"CRC_16_MAXIM_DOW"; -
"CRC_16_MCRF4XX"; -
"CRC_16_MODBUS"; -
"CRC_16_NRSC_5"; -
"CRC_16_OPENSAFETY_A"; -
"CRC_16_OPENSAFETY_B"; -
"CRC_16_PROFIBUS"; -
"CRC_16_RIELLO"; -
"CRC_16_SPI_FUJITSU"; -
"CRC_16_T10_DIF"; -
"CRC_16_TELEDISK"; -
"CRC_16_TMS37157"; -
"CRC_16_UMTS"; -
"CRC_16_USB"; -
"CRC_16_XMODEM"; -
"CRC_17_CAN_FD"; -
"CRC_21_CAN_FD"; -
"CRC_24_BLE"; -
"CRC_24_FLEXRAY_A"; -
"CRC_24_FLEXRAY_B"; -
"CRC_24_INTERLAKEN"; -
"CRC_24_LTE_A"; -
"CRC_24_LTE_B"; -
"CRC_24_OPENPGP"; -
"CRC_24_OS_9"; -
"CRC_30_CDMA"; -
"CRC_31_PHILIPS"; -
"CRC_32_AIXM"; -
"CRC_32_AUTOSAR"; -
"CRC_32_BASE91_D"; -
"CRC_32_BZIP2"; -
"CRC_32_CD_ROM_EDC"; -
"CRC_32_CKSUM"; -
"CRC_32_ISCSI"; -
"CRC_32_ISO_HDLC"; -
"CRC_32_JAMCRC"; -
"CRC_32_MEF"; -
"CRC_32_MPEG_2"; -
"CRC_32_XFER"; -
"CRC_40_GSM"; -
"CRC_64_ECMA_182"; -
"CRC_64_GO_ISO"; -
"CRC_64_MS"; -
"CRC_64_REDIS"; -
"CRC_64_WE"; -
"CRC_64_XZ"; -
"CRC_82_DARC";
Ошибки
Функция может возвращать ошибки, для которых требуется обработка:
-
valueне является строкой; -
algorithmне является поддерживаемым алгоритмом.
Примеры
Вычисление контрольной суммы CRC согласно алгоритму по умолчанию
crc("foo")
"2356372769"
Вычисление контрольной суммы CRC согласно алгоритму CRC_32_CKSUM
crc("foo", algorithm: "CRC_32_CKSUM")
"4271552933"
hmac
Вычисляет HMAC для значения value с использованием указанного ключа key. Используемый алгоритм хэширования можно указать опционально.
В большинстве случаев полученный байтовый поток следует закодировать в шестнадцатеричную строку, используя функцию encode_base16, или в строку в формате Base64, используя функцию encode_base64.
Спецификация функции
hmac(value: <строка>, key: <строка>, [algorithm: <строка>]) :: <строка>
| Аргумент | Тип | Описание | По умолчанию | Обязателен |
|---|---|---|---|---|
|
строка |
Строка для вычисления HMAC. |
да |
|
|
строка |
Строка для использования в качестве криптографического ключа. |
да |
|
|
строка |
Алгоритм хэширования. Допустимые значения:
|
|
нет |
Ошибки
Эта функция не возвращает ошибок, если в аргументе algorithm указано значение по умолчанию или строковый литерал с названием алгоритма, распознаваемым и допустимым на этапе компиляции. В противном случае функция будет возвращать ошибки.
Примеры
Вычисление сообщения HMAC с алгоритмом SHA-256 по умолчанию и кодирование в строку Base64
encode_base64(hmac("Hello there", "super-secret-key"))
"eLGE8YMviv85NPXgISRUZxstBNSU47JQdcXkUWcClmI="
Вычисление сообщения HMAC по алгоритму SHA-224 и кодирование в шестнадцатеричную строку
encode_base16(hmac("Hello there", "super-secret-key", algorithm: "SHA-224"))
"42fccbc2b7d22a143b92f265a8046187558a94d11ddbb30622207e90"
Вычисление сообщения HMAC по переменному алгоритму хэширования
.hash_algo = "SHA-256"
hmac_bytes, err = hmac("Hello there", "super-secret-key", algorithm: .hash_algo)
if err == null {
.hmac = encode_base16(hmac_bytes)
}
"78b184f1832f8aff3934f5e0212454671b2d04d494e3b25075c5e45167029662"
md5
Вычисляет хэш md5 для value.
Спецификация функции
md5(value: <строка>) :: <строка>
| Аргумент | Тип | Описание | По умолчанию | Обязателен |
|---|---|---|---|---|
|
строка |
Строка для вычисления хэша. |
да |
Пример
Создание хэша md5
md5("foo")
"acbd18db4cc2f85cedef654fccc4a4d8"
seahash
Вычисляет хэш Seahash для value.
| Из-за ограничений в типах данных VRL-функция преобразует результат Seahash из беззнакового 64-битного целого числа в знаковый формат. Значения, превышающие максимальное значение знакового 64-битного целого числа, становятся отрицательными. |
Спецификация функции
seahash(value: <строка>) :: <целое число>
| Аргумент | Тип | Описание | По умолчанию | Обязателен |
|---|---|---|---|---|
|
строка |
Строка, для которой вычисляется хэш. |
да |
Примеры
Вычисление хэша Seahash
seahash("foobar")
5348458858952426000
Вычисление отрицательного хэша Seahash
seahash("bar")
-2796170501982571500
sha1
Вычисляет хэш SHA-1 для value.
Спецификация функции
sha1(value: <строка>) :: <строка>
| Аргумент | Тип | Описание | По умолчанию | Обязателен |
|---|---|---|---|---|
|
строка |
Строка, для которой вычисляется хэш. |
да |
Пример
Вычисление хэша SHA-1
sha1("foo")
0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
sha2
Вычисляет хэш SHA-2 для value.
Спецификация функции
sha2(value: <строка>, [variant: <строка>]) :: <строка>
| Аргумент | Тип | Описание | По умолчанию | Обязателен |
|---|---|---|---|---|
|
строка |
Строка, для которой вычисляется хэш. |
да |
|
|
строка |
Вариант алгоритма хэширования:
|
|
нет |
Пример
Вычисление хэша SHA-2
sha2("foo", variant: "SHA-512/224")
d68f258d37d670cfc1ec1001a0394784233f88f056994f9a7e5e99be
sha3
Вычисляет хэш SHA-3 для value.
Спецификация функции
sha3(value: <строка>, [variant: <строка>]) :: <строка>
| Аргумент | Тип | Описание | По умолчанию | Обязателен |
|---|---|---|---|---|
|
строка |
Строка, для которой вычисляется хэш. |
да |
|
|
строка |
Вариант алгоритма хэширования:
|
|
нет |
Пример
Вычисление хэша SHA-3
sha3("foo", variant: "SHA3-224")
f4f6779e153c391bbd29c95e72b0708e39d9166c7cea51d1f10ef58a
Функции шифрования
encrypt
Шифрует строку с использованием симметричного алгоритма шифрования.
Поддерживаемые алгоритмы:
-
AES-256-CFB (ключ = 32 байта, IV = 16 байт)
-
AES-192-CFB (ключ = 24 байта, IV = 16 байт)
-
AES-128-CFB (ключ = 16 байт, IV = 16 байт)
-
AES-256-OFB (ключ = 32 байта, IV = 16 байт)
-
AES-192-OFB (ключ = 24 байта, IV = 16 байт)
-
AES-128-OFB (ключ = 16 байт, IV = 16 байт)
-
AES-128-SIV (ключ = 32 байта, IV = 16 байт)
-
AES-256-SIV (ключ = 64 байта, IV = 16 байт)
-
AES-256-CTR-LE (ключ = 32 байта, IV = 16 байт)
-
AES-192-CTR-LE (ключ = 24 байта, IV = 16 байт)
-
AES-128-CTR-LE (ключ = 16 байт, IV = 16 байт)
-
AES-256-CTR-BE (ключ = 32 байта, IV = 16 байт)
-
AES-192-CTR-BE (ключ = 24 байта, IV = 16 байт)
-
AES-128-CTR-BE (ключ = 16 байт, IV = 16 байт)
-
AES-256-CBC-PKCS7 (ключ = 32 байта, IV = 16 байт)
-
AES-192-CBC-PKCS7 (ключ = 24 байта, IV = 16 байт)
-
AES-128-CBC-PKCS7 (ключ = 16 байт, IV = 16 байт)
-
AES-256-CBC-ANSIX923 (ключ = 32 байта, IV = 16 байт)
-
AES-192-CBC-ANSIX923 (ключ = 24 байта, IV = 16 байт)
-
AES-128-CBC-ANSIX923 (ключ = 16 байт, IV = 16 байт)
-
AES-256-CBC-ISO7816 (ключ = 32 байта, IV = 16 байт)
-
AES-192-CBC-ISO7816 (ключ = 24 байта, IV = 16 байт)
-
AES-128-CBC-ISO7816 (ключ = 16 байт, IV = 16 байт)
-
AES-256-CBC-ISO10126 (ключ = 32 байта, IV = 16 байт)
-
AES-192-CBC-ISO10126 (ключ = 24 байта, IV = 16 байт)
-
AES-128-CBC-ISO10126 (ключ = 16 байт, IV = 16 байт)
-
CHACHA20-POLY1305 (ключ = 32 байта, IV = 12 байт)
-
XCHACHA20-POLY1305 (ключ = 32 байта, IV = 24 байта)
-
XSALSA20-POLY1305 (ключ = 32 байта, IV = 24 байта)
Спецификация функции
encrypt(plaintext: <строка>, algorithm: <строка>, key: <строка>, iv: <строка>) :: <строка> , <ошибка>
| Аргумент | Тип | Описание | По умолчанию | Обязателен |
|---|---|---|---|---|
|
строка |
Строка для шифрования. |
да |
|
|
строка |
Алгоритм, используемый для шифрования. |
да |
|
|
строка |
Ключ для шифрования. Он должен представлять собой сырые (не закодированные) байты. Его длина должна соответствовать указанному алгоритму. |
да |
|
|
строка |
Вектор инициализации (IV) для шифрования. Он должен представлять собой сырые (не закодированные) байты IV. Его длина должна соответствовать указанному алгоритму. |
да |
Для каждого сообщения следует генерировать новый вектор IV. Вы можете использовать random_bytes для генерации криптографически безопасного случайного значения.
|
Ошибки
Функция encrypt может возвращать ошибки, для которых требуется обработка:
-
Алгоритм
algorithmне поддерживается. -
Длина
keyне соответствует требуемому размеру ключа для указанного алгоритма. -
Длина
ivне соответствует требуемому размеру вектора инициализации для указанного алгоритма.
Пример
Шифрование значения
plaintext = "super secret message"
iv = "1234567890123456" # Обычно следует вызывать random_bytes(16).
key = "16_byte_keyxxxxx"
encrypted_message = encrypt!(plaintext, "AES-128-CBC-PKCS7", key, iv: iv)
encode_base64(encrypted_message)
"GBw8Mu00v0Kc38+/PvsVtGgWuUJ+ZNLgF8Opy8ohIYE="
decrypt
Дешифрует строку с помощью симметричного алгоритма шифрования.
Поддерживаемые алгоритмы:
-
AES-256-CFB (ключ = 32 байта, iv = 16 байт)
-
AES-192-CFB (ключ = 24 байта, iv = 16 байт)
-
AES-128-CFB (ключ = 16 байт, iv = 16 байт)
-
AES-256-OFB (ключ = 32 байта, iv = 16 байт)
-
AES-192-OFB (ключ = 24 байта, iv = 16 байт)
-
AES-128-OFB (ключ = 16 байт, iv = 16 байт)
-
AES-128-SIV (ключ = 32 байта, IV = 16 байт)
-
AES-256-SIV (ключ = 64 байта, IV = 16 байт)
-
AES-256-CTR-LE (ключ = 32 байта, IV = 16 байт)
-
AES-192-CTR-LE (ключ = 24 байта, IV = 16 байт)
-
AES-128-CTR-LE (ключ = 16 байт, IV = 16 байт)
-
AES-256-CTR-BE (ключ = 32 байта, IV = 16 байт)
-
AES-192-CTR-BE (ключ = 24 байта, IV = 16 байт)
-
AES-128-CTR-BE (ключ = 16 байт, IV = 16 байт)
-
AES-256-CBC-PKCS7 (ключ = 32 байта, iv = 16 байт)
-
AES-192-CBC-PKCS7 (ключ = 24 байта, iv = 16 байт)
-
AES-128-CBC-PKCS7 (ключ = 16 байт, iv = 16 байт)
-
AES-256-CBC-ANSIX923 (ключ = 32 байта, iv = 16 байт)
-
AES-192-CBC-ANSIX923 (ключ = 24 байта, iv = 16 байт)
-
AES-128-CBC-ANSIX923 (ключ = 16 байт, iv = 16 байт)
-
AES-256-CBC-ISO7816 (ключ = 32 байта, iv = 16 байт)
-
AES-192-CBC-ISO7816 (ключ = 24 байта, iv = 16 байт)
-
AES-128-CBC-ISO7816 (ключ = 16 байт, iv = 16 байт)
-
AES-256-CBC-ISO10126 (ключ = 32 байта, iv = 16 байт)
-
AES-192-CBC-ISO10126 (ключ = 24 байта, iv = 16 байт)
-
AES-128-CBC-ISO10126 (ключ = 16 байт, iv = 16 байт)
-
CHACHA20-POLY1305 (ключ = 32 байта, IV = 12 байт)
-
XCHACHA20-POLY1305 (ключ = 32 байта, IV = 24 байта)
-
XSALSA20-POLY1305 (ключ = 32 байта, IV = 24 байта)
Спецификация функции
decrypt(ciphertext: <строка>, algorithm: <строка>, key: <строка>, iv: <строка>)
:: <строка>, <ошибка>
| Аргумент | Тип | Описание | По умолчанию | Обязателен |
|---|---|---|---|---|
|
строка |
Строка, которую необходимо расшифровать. Она должна представлять собой сырые байты (не закодированные). |
да |
|
|
строка |
Алгоритм, который необходимо использовать. |
да |
|
|
строка |
Ключ для расшифровки. Он должен представлять собой сырые (не закодированные) байты. Его длина должна соответствовать указанному алгоритму. |
да |
|
|
строка |
Вектор инициализации (IV) для расшифровки. Он должен представлять собой сырые (не закодированные) байты IV. Его длина должна соответствовать указанному алгоритму. |
да |
Для каждого сообщения следует генерировать новый вектор IV. Вы можете использовать random_bytes для генерации криптографически безопасного случайного значения. Значение должно совпадать с тем, что использовалось во время шифрования.
|
Ошибки
Функция decrypt может возвращать ошибки, для которых требуется обработка:
-
Алгоритм
algorithmне поддерживается. -
Длина
keyне соответствует требуемому размеру ключа для указанного алгоритма. -
Длина
ivне соответствует требуемому размеру IV для указанного алгоритма.
Пример
Расшифровка значения
ciphertext = decode_base64!("5fLGcu1VHdzsPcGNDio7asLqE1P43QrVfPfmP4i4zOU=")
iv = decode_base64!("fVEIRkIiczCRWNxaarsyxA==")
key = "16_byte_keyxxxxx"
decrypt!(ciphertext, "AES-128-CBC-PKCS7", key, iv: iv)
"super_secret_message"
Была ли полезна эта страница?