Toplam Piyasa Değeri:$00
API
TR
Karanlık

SSI/Mag7/Meme/ETF/Coin/Endeks/Grafikler/Araştırma Ara
00:00 / 00:00
Görüş
    Piyasalar
    Endeksler
    Haber Akışı
    TokenBar®
    Analiz
    Makro
    İzleme listesi
Paylaş

Açık Anahtar Şifrelemenin Güzelliği Anahtar Kapsülleme ile: HPKE

Prof Bill Buchanan OBE
901Kelimeler
28/06/2025

Anahtar Kapsülleme ile Açık Anahtar Şifrelemenin Güzelliği: HPKE

Elbette, verileri RSA OAEP ile şifreleyebiliriz, ancak anahtarlar oldukça büyük ve işlem açısından oldukça yoğun. Kurtarıcımız eliptik eğri kriptografisi (ECC) kullanımı oldu. Ancak, verileri doğrudan ECC ile şifreleyebiliriz ve bu nedenle bir anahtar kapsülleme yöntemi (KEM) kullanırız ve bu aynı zamanda PQC yöntemlerinde de kullanılır. Bununla, bir Diffie-Hellman (DH) anahtar değişim yöntemi kullanırız - ancak bunu çevrimdışı bir şekilde yaparız.

Diyelim ki Bob, Alice için verileri şifrelemek istiyor. Bunun için Bob'un b özel anahtarı ve b.G genel anahtarı olacak ve Alice'in a özel anahtarı ve a.G genel anahtarı olacak. Eliptik eğri üzerindeki temel nokta daha sonra G'dir ve burada a.G, G noktasının a kez kendisine eklenmesidir. Bob başlangıçta Alice'in genel anahtarını (a.G) güvenilir bir şekilde alır. Daha sonra özel anahtarını (b) alacak ve a.B.G'nin sonuç noktasını vermek için bir Diffie-Hellman işlemi gerçekleştirecektir. Ardından, bunu bazı bağlam verileriyle birlikte bir AES anahtarına genişletmek ve çıkarmak için HKDF yöntemine besler. Bu, bazı düz metinleri şifrelemek için kullanılacak bir gizli anahtar (SecretKey) türetecektir:

Bob ayrıca genel anahtarını serileştirecek ve mesajla birlikte gönderecektir. Bu aynı zamanda şifrelenmiş mesajın ve serileştirilmiş genel anahtarın kurcalanmadığını gösterecek bir hash değerine de sahip olacaktır.

Şifreyi çözmek için Alice, Bob'un genel anahtarını serileştirerek b.G'yi üretir. Daha sonra özel anahtarını (a) alacak ve a.b.G'yi elde etmek için bir Diffie-Hellman işlemi gerçekleştirecektir. Bunu bağlamla birlikte bir HKDF fonksiyonuna besleriz ve bu da Bob (SecretKey) ile aynı gizli anahtarı üretecektir. Alice daha sonra şifreli metnin şifresini çözebilecek ve mesajı ortaya çıkarabilecektir.

Hibrit Açık Anahtar Şifreleme (HPKE) ile, bir alıcının genel anahtarını kullanarak düz metni asimetrik bir anahtar kapsülleme mekanizması (KEM) kullanarak şifreleriz. Anahtar, bir anahtar türetme fonksiyonu (KDF) kullanılarak türetilir ve burada veriler, ek verilerle kimliği doğrulanmış bir şifreleme (AEAD) fonksiyonu ile şifrelenir. Bu durumda, şunlardan birini kullanacağız: DHKEM_P256_HKDF_SHA256 (KEM olarak P256 kullanarak), DHKEM_P384_HKDF_SHA384 (KEM olarak P384 kullanarak), DHKEM_P521_HKDF_SHA512 (KEM olarak P521 kullanarak) veya DHKEM_X25519_HKDF_SHA256 (KEM olarak X25519 kullanarak). Her durumda, anahtarı oluşturmak için HKDF kullanılır.

Kod [here]:

package main
import (
"fmt"
"os"
"strconv"
"github.com/tink-crypto/tink-go/v2/hybrid/hpke"
"github.com/tink-crypto/tink-go/v2/hybrid"
"github.com/tink-crypto/tink-go/v2/keyset"
)
func main() {
msg:="Testing"
context:="My Context"

method:=hpke.DHKEM_P256_HKDF_SHA256
m:=1
argCount := len(os.Args[1:])
if (argCount>0) {msg = os.Args[1]}
if (argCount>1) {context =os.Args[2]}
if (argCount>2) {m,_ =strconv.Atoi(os.Args[3])}

if (m==2) {method=hpke.DHKEM_P384_HKDF_SHA384
} else if (m==3) {method=hpke.DHKEM_P521_HKDF_SHA512
} else if (m==4) {method=hpke.DHKEM_X25519_HKDF_SHA256
}
plaintext := []byte(msg)
contextInfo := []byte(context)
params,_ := hpke.NewParameters(hpke.ParametersOpts{
KEMID: method,
KDFID: hpke.HKDFSHA256,
AEADID: hpke.AES256GCM,
Variant: hpke.VariantTink,
})

km := keyset.NewManager()
keyID, _ := km.AddNewKeyFromParameters(params)
if err := km.SetPrimary(keyID); err != nil {
}
privateKeyHandle, _ := km.Handle()

publicKeyHandle, _ := privateKeyHandle.Public()

encrypter, _ := hybrid.NewHybridEncrypt(publicKeyHandle)
decrypter, _ := hybrid.NewHybridDecrypt(privateKeyHandle)

ciphertext,_ := encrypter.Encrypt(plaintext, contextInfo)
decrypted,_ := decrypter.Decrypt(ciphertext, contextInfo)

fmt.Printf("Plaintext: %s\n\n",msg)
fmt.Printf("Method: %s\n\n",method)
fmt.Printf("Private key: %s\n\n",privateKeyHandle)
fmt.Printf("Public key: %s\n\n",publicKeyHandle)
fmt.Printf("Ciphertext: %x\n\n",ciphertext)
fmt.Printf("Decrypted: %s\n",decrypted)

}

DHKEM-P256-HKDF-SHA256 için örnek bir çalıştırma [here]:

Plaintext: Testing
Method: DHKEM-P256-HKDF-SHA256
Private key: primary_key_id:1203322961 key_info:{type_url:"type.googleapis.com/google.crypto.tink.HpkePrivateKey" status:ENABLED key_id:1203322961 output_prefix_type:TINK}
Public key: primary_key_id:1203322961 key_info:{type_url:"type.googleapis.com/google.crypto.tink.HpkePublicKey" status:ENABLED key_id:1203322961 output_prefix_type:TINK}
Ciphertext: 0147b94051043bdeb59abad6caebff20753dadfc0bf8a2d6131b6935f149afdc84b450dda4316d79bae3529eaafec63197a55ffd30c186ffea74bbcb811bfb2b93dacfeaab3b4cc8352534fd5f2e7252abac03553b16d607ea791df7c9
Decrypted: Testing

10 saniyede bilmeniz gerekenler
ŞartlarGizlilik PolitikasıBeyaz KitapResmi DoğrulamaCookieBlog
sha512-gmb+mMXJiXiv+eWvJ2SAkPYdcx2jn05V/UFSemmQN07Xzi5pn0QhnS09TkRj2IZm/UnUmYV4tRTVwvHiHwY2BQ==
sha512-kYWj302xPe4RCV/dCeCy7bQu1jhBWhkeFeDJid4V8+5qSzhayXq80dsq8c+0s7YFQKiUUIWvHNzduvFJAPANWA==