Ed25519
Edwards-curve Digital Signature Algorithm (EdDSA) - это схема цифровой подписи, использующая вариант схемы Шнора,
основанной
на эллиптической кривой Эдвардса.
Она спроектирована так, чтобы быть быстрее по сравнению с существующей схемой цифровой подписи без ущерба для её
безопасности.
Она была разработана Дэниелом Бернштейном младшим, Нильсом Дуйфом, Таней Ланге, Питером Швабе и Бо-Инь Яном к 2011 году.
Ed25519 - эта схема подписи EdDSA использующая SHA-512 и Curve25519.
Curve25519 - это криптографическая эллиптическая кривая, обеспечивающая 128-битное шифрование при размере ключа 256
бит,
предназначена для использования со схемой согласования ключей Диффи — Хеллмана (ECDH).
Одна из самых быстрых кривых, при этом не защищена патентами. Эталонная программная реализация находится в общественном
достоянии.
ECDH (Elliptic Curve Diffie-Hellman / Протокол Ди́ффи-Хе́ллмана на эллиптических кривых) - криптографический
протокол,
позволяющий двум сторонам, имеющим пары public и private ключи на эллиптических кривых, получить общий секретный ключ,
используя незащищённый от прослушивания канал связи.
Алгоритм работы
- Есть два пользователя Alice и Bob
- Каждый на своей стороне генерирует пары public и private ключей
- Alice отправляет public ключ Bob'у, а Bob отправляет свой public ключ Alice
- Имея public ключ от Bob'а и свой private ключ Alice генерирует общий секретный ключ
- Имея public ключ от Alice и свой private ключ Bob генерирует общий секретный ключ
- В результате секретный ключ Alice будет идентичным ключу Bob'а
- Далее, Alice и Bob могут шифровать и дешифровать сообщения используя полученный секретный ключ
Функции пакета, структуры и их методы
Функции пакета
func GenerateKeyPair() (pub domain.PublicKey, priv domain.PrivateKey, err error)
Функция генерирует пару public и private ключей Ed25519.
func GenerateSharedKey(pub domain.PublicKey, priv domain.PrivateKey) (shared domain.SharedKey, err error)
Функция генерирует секретный ключ на базе public и private ключей.
Структуры и их методы
type PublicKey ed25519.PublicKey
Структура содержит в себе Ed25519 public ключ.
func (pub PublicKey) ToBytes() (bs []byte, err error)
Метод конвертирует ключ в PKIX ASN.1 DER форму.
PKIX - это сертификатная компания инфраструктуры, выдающая сертификаты на основе новейших стандартов Internet X.509.
ASN.1 (Abstract Syntax Notation One) - в области телекоммуникаций и компьютерных сетей язык для описания
абстрактного
синтаксиса данных.
DER (Distinguished Encoding Rules) - однозначное кодирование данных используя особые правила:
- для кодирования данных с известной длиной количество октетов (восемь двоичных разрядов) длины должно быть наименьшим
- кодирование простых типов данных (STRING, OCTET STRING и BIT ARRAY) всегда примитивное
func (pub PublicKey) ToPEMBlock() (pem PEMBlock, err error)
Метод конвертирует ключ в PEM block.
PEM (Privacy-Enhanced Mail / Почта с повышенной секретностью) является стандартом Интернета для гарантирования
безопасности электронной почты в Интернете. Этот стандарт одобрен советом по архитектуре Интернета (Internet
Architecture Board, IAB). Впервые был разработан под руководством Группы приватности и безопасности Internet Resources
Task Force (IRTF) в 1993 году, далее разработка была передана в PEM Working Group (IETF). Фактически, протоколы PEM
созданы для шифрования, проверки подлинности, проверки целостности и администрирования ключей. В конечном итоге
протоколы описываются в RFC 7468.
func (pub PublicKey) ToPublicCurve() (pubCurve PublicCurve, err error)
Метод конвертирует ключ к криптографической эллиптической кривой Curve25519.
type PrivateKey ed25519.PrivateKey
Структура содержит в себе Ed25519 private ключ.
func (priv PrivateKey) ToBytes() (bs []byte, err error)
Метод конвертирует ключ в PKCS, ASN.1 DER форму.
PKCS (Public Key Cryptography Standards) - это спецификации для ускорения разработки криптографии с открытым ключом.
ASN.1 (Abstract Syntax Notation One) - в области телекоммуникаций и компьютерных сетей язык для описания
абстрактного
синтаксиса данных.
DER (Distinguished Encoding Rules) - однозначное кодирование данных используя особые правила:
- для кодирования данных с известной длиной количество октетов (восемь двоичных разрядов) длины должно быть наименьшим
- кодирование простых типов данных (STRING, OCTET STRING и BIT ARRAY) всегда примитивное
func (priv PrivateKey) ToPEMBlock() (pem PEMBlock, err error)
Метод конвертирует ключ в PEM block.
PEM (Privacy-Enhanced Mail / Почта с повышенной секретностью) является стандартом Интернета для гарантирования
безопасности электронной почты в Интернете. Этот стандарт одобрен советом по архитектуре Интернета (Internet
Architecture Board, IAB). Впервые был разработан под руководством Группы приватности и безопасности Internet Resources
Task Force (IRTF) в 1993 году, далее разработка была передана в PEM Working Group (IETF). Фактически, протоколы PEM
созданы для шифрования, проверки подлинности, проверки целостности и администрирования ключей. В конечном итоге
протоколы описываются в RFC 7468.
func (priv PrivateKey) ToPrivateCurve() (privCurve PrivateCurve, err error)
Метод конвертирует ключ к криптографической эллиптической кривой Curve25519.
type PEMBlock pem.Block
Структура содержит в себе PEM блок.
PEM (Privacy-Enhanced Mail / Почта с повышенной секретностью) является стандартом Интернета для гарантирования
безопасности электронной почты в Интернете. Этот стандарт одобрен советом по архитектуре Интернета (Internet
Architecture Board, IAB). Впервые был разработан под руководством Группы приватности и безопасности Internet Resources
Task Force (IRTF) в 1993 году, далее разработка была передана в PEM Working Group (IETF). Фактически, протоколы PEM
созданы для шифрования, проверки подлинности, проверки целостности и администрирования ключей. В конечном итоге
протоколы описываются в RFC 7468.
func (pb *PEMBlock) ToPublicKey() (pub PublicKey, err error)
Метод конвертирует PEM block в public ключ.
func (pb *PEMBlock) ToPrivateKey() (priv PrivateKey, err error)
Метод конвертирует PEM block в private ключ.
func (pb *PEMBlock) ToBytes() (bs []byte)
Метод конвертирует PEM block байтовую последовательность.
func (pb *PEMBlock) Save(filePath string) (err error)
Метод сохраняет PEM block в файл.
func (pb *PEMBlock) FromBytes(bs []byte) (err error)
Метод загружает PEM block из байтовой последовательности.
type SharedKey []byte
Структура содержит секретный ключ
func (shared SharedKey) Sign() (sign string, err error)
Метод генерирует 6 символьный признак, который используется сторонами для идентификации используемого секретного ключа
без его потери.
Пример использования
func main() {
var (
pub domain.PublicKey
priv domain.PrivateKey
)
pub, priv, err = ed25519.GenerateKeyPair()
if err != nil {
panic(err)
}
var shared domain.SharedKey
shared, err = ed25519.GenerateSharedKey(pub, priv)
if err != nil {
panic(err)
}
fmt.Println(shared)
}