No description
Find a file
2026-05-14 16:08:57 +03:00
block Тесты и бенчмарки 2026-05-14 15:11:30 +03:00
crypt Добавление тестов 2026-05-14 16:08:57 +03:00
docs Добавление тестов 2026-05-14 16:08:57 +03:00
go.mod Добавление тестов 2026-05-14 16:08:57 +03:00
go.sum Подписи 2026-05-14 14:43:52 +03:00
LICENSE Немного документации 2026-05-14 15:22:08 +03:00
README.md Обновление README.md 2026-05-14 15:24:38 +03:00

go-cryptohide

Библиотека для встраивания шифрованных и подписанных блоков в текстовые документы.

Возможности

  • Поиск блоков по маркерам (@@...@@, настраиваемые)
  • Симметричное шифрование: AES-256-GCM
  • Асимметричное шифрование: гибрид X25519 (ECDH) + ML-KEM-768 (FIPS 203) + HKDF-SHA256
  • Цифровые подписи: Ed25519, гибрид Ed25519 + ML-DSA-44 (FIPS 204)
  • Callback-интерфейс: полная замена любого криптографического примитива
  • Генерация ключей для всех алгоритмов
  • PEM-конвертер для хранения и обмена ключами
  • Sign-then-encrypt для режима encrypt+sign
  • Идемпотентность: уже обработанные блоки пропускаются

Быстрый старт

import "git.ymnuktech.ru/ymnuk/go-cryptohide/crypt"

// Симметричное шифрование
key, _ := crypt.GenerateSymmetricKey()
c, _ := crypt.New(crypt.Options{Mode: "encrypt", SymmetricKey: key})
encrypted, _ := c.Encrypt([]byte("@@секрет@@"))
decrypted, _ := c.Decrypt(encrypted) // @@секрет@@

// Гибридное асимметричное шифрование
encPub, decPriv, _ := crypt.GenerateAsymmetricKeyPair()
c, _ = crypt.New(crypt.Options{
    Mode: "encrypt", EncryptPublicKey: encPub, DecryptPrivateKey: decPriv,
})

// Подпись
pub, priv, _ := crypt.GenerateSignKeyPairEd25519()
c, _ = crypt.New(crypt.Options{
    Mode: "sign", SignPrivateKey: priv, VerifyPublicKey: pub,
})
signed, _ := c.Sign([]byte("@@data@@"))
verified, _ := c.Verify(signed)

// Шифрование + подпись
c, _ = crypt.New(crypt.Options{
    Mode: "encrypt+sign", SymmetricKey: key,
    SignPrivateKey: priv, VerifyPublicKey: pub,
})
out, _ := c.Encrypt([]byte("@@secret@@"))

Callback-пример (XOR)

c, _ := crypt.New(crypt.Options{
    Mode: "encrypt+sign",
    EncryptFunc: func(plain []byte) ([]byte, error) {
        out := make([]byte, len(plain))
        for i, b := range plain {
            out[i] = b ^ 0xAA
        }
        return out, nil
    },
    DecryptFunc: func(cipher []byte) ([]byte, error) {
        out := make([]byte, len(cipher))
        for i, b := range cipher {
            out[i] = b ^ 0xAA
        }
        return out, nil
    },
    SignFunc: func(msg []byte) ([]byte, error) {
        return []byte("my-signature"), nil
    },
    VerifyFunc: func(msg, sig []byte) (bool, error) {
        return string(sig) == "my-signature", nil
    },
})

out, _ := c.Encrypt([]byte("@@data@@"))
// @@base64:eyJhbGciOiJjYWxsYmFjayIsIm1vZGUiOiJlbmNyeXB0K3NpZ24ifQ==.<xor-data>@@

dec, _ := c.Decrypt(out)  // @@data@@
ver, _ := c.Verify(out)   // @@data@@

Мотивация

go-cryptohide решает задачу выборочного шифрования отдельных фрагментов документа. Пользователь размечает блоки маркерами, библиотека находит их, обрабатывает и возвращает готовый документ. Обрамления сохраняются, что позволяет редактировать незашифрованные части и повторно шифровать изменённые блоки.

Документация

Совместимость

Go 1.26+. Все криптографические примитивы — из стандартной библиотеки (crypto/aes, crypto/ecdh, crypto/ed25519, crypto/mlkem, crypto/hkdf) и filippo.io/mldsa.

Лицензия

MIT