Криптографические операции
Создавайте и проверяйте подписи, вычисляйте хеши, шифруйте сообщения, согласовывайте общие ключи и выводите производные.
gost-cryptov0.3.0
Go-обёртка над OpenSSL gost-engine
Подключайте подписи, хеширование Стрибог, шифрование Кузнечик и MGM AEAD через Go-обёртку над OpenSSL gost-engine.
Go · MIT · Последнее обновление
Open-source библиотека: сертификация и независимый аудит безопасности не заявлены.
priv, err := gostcrypto.GenerateKey(
gostcrypto.CurveTC26_256_A,
)
if err != nil { return err }
defer priv.Zeroize()
sig, err := gostcrypto.Sign(priv, message)
if err != nil { return err }
valid, err := gostcrypto.Verify(
priv.PublicKey(), message, sig,
)
gost-crypto
Создавайте и проверяйте подписи, вычисляйте хеши, шифруйте сообщения, согласовывайте общие ключи и выводите производные.
Пакеты хеширования и шифрования реализуют hash.Hash, cipher.Block и cipher.AEAD там, где это применимо.
Учитывайте CGO, OpenSSL и gost-engine. Руководство по развёртыванию описывает нативные зависимости сервиса.
Go-обёртка над OpenSSL gost-engine
Установите описанную в документации связку OpenSSL/gost-engine и включите CGO.
Используйте примеры и проверьте форматы ключей, алгоритмы и окружение под требования вашей системы.
01 / Установка
go get github.com/rekurt/gost-crypto02 / README
Подписи, хеширование, шифрование и согласование ключей по ГОСТ в Go через OpenSSL gost-engine.
Настройка, примеры использования и справочник API.
Ниже — исходная документация репозитория без перевода. Пример и краткая инструкция выше доступны на русском.
Go library for Russian GOST cryptographic standards (GOST R 34.10-2012, GOST R 34.11-2012 Streebog, GOST R 34.12-2015 Kuznechik, GOST R 34.13-2015 MGM), powered by OpenSSL gost-engine. Digital signatures, hashing, encryption, key agreement, and key derivation with zero external Go dependencies.
Project website · All projects by rekurt
API Reference | Examples | На русском | Contributing
hash.Hash, cipher.Block, cipher.AEAD — drop-in compatible with Go's crypto ecosystemgo.mod has no require directives; only OpenSSL + CGO at build time| Standard | Package | Description | Go Interface |
|---|---|---|---|
| GOST R 34.10-2012 | pkg/gost3410 |
Elliptic curve digital signatures | — |
| GOST R 34.11-2012 | pkg/gost3411 |
Streebog hash (256/512-bit) | hash.Hash |
| GOST R 34.12-2015 | pkg/gost3412 |
Kuznechik block cipher | cipher.Block |
| GOST R 34.13-2015 | pkg/gost3413 |
MGM authenticated encryption | cipher.AEAD |
| RFC 7836 | pkg/gost3410 |
VKO key agreement (ECDH) | — |
| R 50.1.113-2016 | pkg/kdf |
KDF_GOSTR3411, HKDF-Streebog | — |
| BIP-32 style | pkg/hd |
HD key derivation | — |
go get github.com/rekurt/gost-crypto
package main
import (
"fmt"
gostcrypto "github.com/rekurt/gost-crypto"
)
func main() {
priv, err := gostcrypto.GenerateKey(gostcrypto.CurveTC26_256_A)
if err != nil {
panic(err)
}
defer priv.Zeroize()
sig, err := gostcrypto.Sign(priv, []byte("Hello, GOST!"))
if err != nil {
panic(err)
}
ok, err := gostcrypto.Verify(priv.PublicKey(), []byte("Hello, GOST!"), sig)
if err != nil {
panic(err)
}
fmt.Println("valid:", ok) // valid: true
}
privA, _ := gostcrypto.GenerateKey(gostcrypto.CurveTC26_256_A)
privB, _ := gostcrypto.GenerateKey(gostcrypto.CurveTC26_256_A)
defer privA.Zeroize()
defer privB.Zeroize()
ukm := []byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}
// Shared secret is symmetric: Agree(A, pubB) == Agree(B, pubA)
secretAB, _ := gostcrypto.Agree(privA, privB.PublicKey(), ukm)
secretBA, _ := gostcrypto.Agree(privB, privA.PublicKey(), ukm)
// bytes.Equal(secretAB, secretBA) == true
import "github.com/rekurt/gost-crypto/pkg/gost3413"
aead, _ := gost3413.NewMGMFromKey(key) // 32-byte key
nonce := make([]byte, aead.NonceSize())
rand.Read(nonce)
ciphertext := aead.Seal(nil, nonce, plaintext, additionalData)
More examples: docs/EXAMPLES.md | _examples/
All 8 TC26 elliptic curve parameter sets are supported:
| Curve | Size | OID | Notes |
|---|---|---|---|
CurveTC26_256_A |
256-bit | 1.2.643.7.1.2.1.1.1 | Recommended |
CurveTC26_256_B |
256-bit | 1.2.643.2.2.35.1 | CryptoPro-A |
CurveTC26_256_C |
256-bit | 1.2.643.2.2.35.2 | CryptoPro-B |
CurveTC26_256_D |
256-bit | 1.2.643.2.2.35.3 | CryptoPro-C |
CurveTC26_512_A |
512-bit | 1.2.643.7.1.2.1.2.1 | |
CurveTC26_512_B |
512-bit | 1.2.643.7.1.2.1.2.2 | |
CurveTC26_512_C |
512-bit | 1.2.643.7.1.2.1.2.3 | |
CurveTC26_512_D |
512-bit | 1.2.643.7.1.2.1.2.0 | Test curve |
gost-crypto/
├── gostcrypto.go # High-level facade: Sign, Verify, HashSum, Agree
├── keys.go # GenerateKey, LoadPrivKey, PrivKey/PubKey aliases
├── curves.go # Curve type, TC26 constants, AllCurves
├── errors.go # Re-exported sentinel errors
├── pkg/
│ ├── gost3410/ # GOST R 34.10-2012 signatures (OpenSSL backend)
│ ├── gost3411/ # GOST R 34.11-2012 Streebog hash (OpenSSL backend)
│ ├── gost3412/ # GOST R 34.12-2015 Kuznechik cipher
│ ├── gost3413/ # GOST R 34.13-2015 MGM AEAD
│ ├── hd/ # HD key derivation (HKDF, BIP32-style paths)
│ └── kdf/ # Key derivation functions (HKDF-Streebog, KDF_GOSTR3411)
├── internal/openssl/ # CGO bindings for OpenSSL gost-engine
└── _examples/ # Runnable examples
| Document | Description |
|---|---|
| API Reference | Complete API for all packages |
| Examples | Validated usage patterns |
| Deployment | OpenSSL + gost-engine setup |
| Migration v0 to v1 | Breaking changes and migration path |
| Threat Model | Security assumptions and limitations |
| Security Policy | Vulnerability disclosure |
This library implements the following Russian and international standards:
Contributions are welcome. See docs/CONTRIBUTING.md for guidelines.
MIT License. See LICENSE for details.
gost-crypto