C C C C C'de Güvenli Bir İletişim Protokolü Oluşturmak Önlemler

Uygulamaya başlamadan önce, geliştirme ortamınızın C.W. (GCC veya Clang) bir C.W. (GCC veya Clang) temel soket programlama bilgisi ve OpenSSL kütüphanesi, kriptografik algoritmalarının sağlam uygulamaları sağlar, C. Linux'ta güvenli iletişim için standart seçimi yapın, OpenSSL'de paket yöneticinizle yükleme işlemi de kabul edilir (örneğin Windows'da, önceden belirlenmiş biner veya kaynaktan kaynak oluşturun.

Kriptografik Bina Bloklarını Anlayın

Güvenli bir iletişim protokolü üç sütunda geri dönüyor: Gizlilik, dürüstlük ve kimlik doğrulama. Gizlilik, şifreleme yoluyla elde edilir, sadece amaçlanan alıcının mesajı okuyabilmesini sağlar.Ingereked that data has been changed in the migration. Authentication|Ses the identity of the communication party.In a custom protokolü, you often together symmetriccrypt, hashing with message authentication codes (HMAC), and a key exchange mekanizması gibi Diffie-Hellman.

Symmetric Encryption with AES

Gelişmiş Şifreleme Standardı (AES), tek bir operasyonda hem gizlilik hem de bütünlüğü sağlayan en yaygın kullanılan symmetric cipher. 128-bit bloklarda çalışır ve 128, 192 veya 256 bitleri ile şifrelenir. Güvenli iletişim için, AES'yi tercih edin, Galois/Counter Mode (GCM), bu da her iki gizliliği de tek bir operasyonda sağlar. OpenSSL'nin EVP arayüzü, AESGCM ile şifre ve şifreleme ve şifreleme bilgilerini basitleştirir.

Diffie ile Anahtar Değişim -Hellman

Güvenli bir şekilde paylaşılan bir sır üzerinde, satın alınmamış bir kanal üzerinde, Diffie-Hellman (DH) anahtar değişimi. Her iki taraf da özel anahtarlar ve kamu parametrelerini üretir, sonra ortak bir sır hesaplar. ”-Hellman) insan tarafından doğrulanmamış orta saldırılara karşı savunmasızdır, böylece bunu dijital imzalar veya önceden paylaşılan anahtarlarla genişletebilirsiniz.

HMAC ile Mesaj Bütünleme ve Kimlik

Bir mesajın tam olarak doğrulanmamış olmadığını doğrulamak için, HMAC'yi alınan verilere doğru bir şekilde geri yüklemeyi ve doğrulayıcı saldırıları önlemek için. HMAC, paylaşılan bir gizli anahtar ve bir kriptografik işlevi (örneğin, SHA-256) içerir.

C Project Up OpenSSL'i Ayarlayın

OpenSSL dikkatli bir başlangıç gerektirir. gerekli başlıkları ve çağrıyı içerir:2. programınızın başlangıcındaki minimum görünüme sahip olun.SSL, kullanım için [[DövDÜye ve [[Gizemeler) ve [[BİLMİŞT:2.

#include <openssl/evp.h>
#include <openssl/rand.h>
#include <openssl/err.h>
// Initialize OpenSSL
void init_openssl() {
 SSL_load_error_strings();
 OpenSSL_add_all_algorithms();
}

TCP Soket Katmanı Yapın

Protokolünüz için temel taşıma, güvenilir, sipariş edilen teslimata olanak sağlayan TCP olacaktır.Gelişen bağlantıları ve bir müşteriyi elhaklı olarak kullanan standart POSIX soketlerini kullanın.Use standard POSIX sokets withENFLT:7, [[DÜcretsiz, 03,00|D, 03|DÜye Olmayanlar,|DÜye Olmayanlar İçin Tıklayınız.

Server Örnek Skeleton

int server_fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
bind(server_fd, (struct sockaddr*)&address, sizeof(address));
listen(server_fd, 3);
int client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &addr_len);

Müşteri Örnek Skeleton

int sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr));

Diffie'yi Uygulamayın - Hellman Key Exchange

TCP bağlantısı kurduktan sonra, müşteri ve sunucu DH anahtar değişimi gerçekleştiriyor.Her taraf OpenSSL'nin 03.15'ten itibaren bir DH anahtar çifti üretiyor.Parti anahtar, soketi üzerinden gönderilir ve her iki taraf da basit bir şekilde bir araya gelir.Pozisyon için, sabit bir asal grubu kullanın (örneğin, 03.C.D.T:17'den gelen parametrelerle) gerçek bir protokolde, grubu müzakere eder veya önceden tanımlanmış parametreleri kullanırsınız.

// Generate DH parameters
EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_DH, NULL);
EVP_PKEY_paramgen_init(pctx);
EVP_PKEY_CTX_set_dh_paramgen_prime_len(pctx, 2048);
EVP_PKEY *params = NULL;
EVP_PKEY_paramgen(pctx, &params);

// Generate key pair
EVP_PKEY_CTX *kctx = EVP_PKEY_CTX_new(params, NULL);
EVP_PKEY_keygen_init(kctx);
EVP_PKEY *my_key = NULL;
EVP_PKEY_keygen(kctx, &my_key);

// Export public key to send
unsigned char *pub_key_der = NULL;
int pub_len = i2d_PUBKEY(my_key, &pub_key_der);
send(sock, pub_key_der, pub_len, 0);

Sonunda, akran halka açık anahtarını AES ve HMAC için tek bir anahtar üretmek için ithal edebilir.

Şifreleme ve AES-GCM ile Mesajları Şifreleme

AESGCM tercih edilen bir mod çünkü DH'nin paylaşılan sırrına sahip olan şifreleme ve bir kimlik doğrulama etiketi sağlar ve son güncellemeden sonra 16-bayt etiketini alırsınız.Birlikte 12-bayt'a ihtiyacınız yoktur.

// Encryption
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, key, nonce);
unsigned char ciphertext[1024];
int outlen;
EVP_EncryptUpdate(ctx, ciphertext, &outlen, plaintext, len);
int tmplen;
EVP_EncryptFinal_ex(ctx, ciphertext + outlen, &tmplen);
unsigned char tag[16];
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, tag);

HMAC ile Dürüstlük (veya GCM Tag'ı Çıkar)

AES-GCM'yi kullanmayı tercih ederseniz, alıcının hesaplarını tekrarlayabilir ve sonra bir HMAC'yi şifreleme için kullanabilirsiniz.ŞAMC ile OpenSSL'den SHA-256 ile birlikte anahtarlama işlevi (KDF) kullanarak satın alma işlemine onay verebilirsiniz.

Birlikte Oluşturun: Tamam Workflow

  1. Müşteri ve sunucu arasında bir TCP bağlantısı oluşturun.
  2. Her iki taraf da ephemeral DiffieHellman anahtar çiftleri yaratır.
  3. Değişim halk anahtarları ve paylaşılan sırrı hesaplar.
  4. 256-bit AES anahtarı ve 256-bit HMAC anahtarı (veya GCM için aynı anahtarı kullanın).
  5. Müşteri, akrep (12. rastgele) gönderir ve sonra AES-GCM şifreli mesaj artı etiketi gönderir. Server şifreler ve doğruları.
  6. Server yeni bir düğüm kullanarak bir yanıt gönderir (aynı anahtarla aynı şekilde yeniden kullanım).
  7. Her iki taraf da eski değişen mesajları devam edebilir; uzun seanslar için, aynı DH elhak veya bir sıçan mekanizması kullanarak tekrar anahtar.

Güvenlik En İyi Uygulamaları

  • [FONT=0) Güçlü rastgele sayı jeneratörlerini kullanın.[DÜT:1] CallurFLT:26, anahtarlar, olmayanlar ve DH özel anahtarlar üretmek için OpenSSL'den gelen çağrılış.
  • [FONT:0] Tüm alınan verileri kabul eder.[[Dönetici:0]Döneticileri kontrol etmek, halk anahtar parametreleri (örneğin, p'nin asal olmasını sağlamak, g jeneratördür), ve HMAC etiketleri işlemeden önce.
  • [FONT:0] Sert kodlanmış anahtarlar veya varsayılanlar..), Her zaman mükemmel bir ileriye dönük gizliliği sağlamak için oturumda anahtarlar taze pazarlık eder.
  • [FONT=0]Handle hataları lütufla karşılanır.[DÜDÜDÜDÜDÜDÜSTR:0)Handle hataları, şifreleme başarısız olursa veya HMAC doğrulama başarısız olur, bağlantıyı kapat ve olayı açma.
  • [FONT=0)Geçmişlikler güncellenir.[Döneticileri değiştirmiş gibi.[Döneticileri değiştirmiş gibi).[Döneticileri değiştirmiş gibi).
  • [FONT:0] Özel bir protokol yerine TLS'yi kullanmayı düşünün.[[Dönetici için 1 ) Üretim sistemleri için TLS 1.3. Sıfırdan özel bir protokol inşa etmek hata-prone ve derin kriptografik uzmanlığınız olmadıkça tavsiye edilmez.

Protokolü test edin

Uygulamanızı aynı makinede müşteri ve sunucu çalıştırarak test edin (yerelhost) ve doğru şekilde şifreler doğru şekilde doğrulayın. Tampered ciphertext veya geçersizlik gibi hataları açıklayın.Rekabet, onlara yönelik olarak kullanılan ölçüm araçları kullanın.Use tools like Wireshark to examine the raw network and verify that standard text is not visible. For unit testing, the soket katmanı and test kriptografik ilkelleri ayrı ayrı olarak. OpenSSL'surFLT:29)

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

C'de güvenli bir iletişim protokolü inşa etmek mükemmel bir öğrenme egzersizidir, ancak kriptografik en iyi uygulamaları takip etmek için dikkatli bir dikkat gerektirir: Bir KDF ile oturum anahtarlarını kullanarak, asla bir öğrenme projesinin ötesinde bir şey için, gizlilik, bütünleme ve doğrulama gibi standart bir protokol düşünebilirsiniz.[Döneticileri takip edin.0TLS 1.3[Döneticileri takip edin, bu şekilde güvenli bir şekilde iletişim kurma ve tüm verileri tam olarak doğrulayın.