Mga Prerequisite Para sa Pagtatayo ng Isang Matatag na Protocol sa Komunikasyon sa C

Bago ang pagsisid sa pagpapatupad, tinitiyak ng OpenSL ang isang Claimder (GCC o Clang), saligang kaalaman sa socket programming, at sa OpenSL library na naka-install. Ang OpenSL ay nagbibigay ng matatag na pagpapatupad ng cryptographic algorithms, na ginagawa itong pamantayang pagpili para sa mga komunikasyong sekwensiya sa C. On Linux, i-install ang OpenSL sa pamamagitan ng iyong manager ng pakete (e.g., ). Sa Windows, gamitin ang mga precompilarys sa COPRICOPCOPCOPCOPCOPCICERNENESC.

Pag - unawa sa mga Bloke ng Cryptographic Building

Ang isang matatag na protocol ng komunikasyon ay nakasalalay sa tatlong haligi: pagiging kompidensiyal, integridad, at pagiging totoo. Ang pagiging kompidensiyal ay nakakamit sa pamamagitan ng encryption, na tumitiyak na tanging ang nilayong tumanggap ang maaaring bumasa ng mensahe. aguradong ang impormasyon ay hindi nabago sa transaksyon.Ang regresyon ay tumuturing sa pagiging mapagkakatiwalaan ng mga partidong nakikipagtalastasan.Sa isang protocol ng kaugalian, karaniwan nang pinagsasama mo ang simmetric encryption, hashing sa pamamagitan ng mga code ng mensahe realitation (HMAC), at isang susing mekanismo ng palitan tulad ng Diffie–Helman.

Pag - uulat ng Simmetrikong May AES

Ang Advanced Encryption Standard (AES) ang pinaka-malawak na ginagamit na symmetrikong cipher. ito ay nagpapatakbo sa 128-bit blocks at sumusuporta sa mga susing sukat ng 128, 192, o 256 bits. Para sa mga ligtas na komunikasyon, mas gusto ng AES sa Galois/Crender Mode (GCM), na nagbibigay ng parehong presidensiyal at integridad sa isang operasyon. Ang openSLURESSLURES interface ay gumagawa ritong tuwid upang mag-encry at mag-decry data sa mga ES AGCM. Iwasan ang mga mas lumang paraan tulad ng ECB na may adcleclecleclecation at adcation at adcreast.

Pangunahing Pagpapalit sa Diffie–Hellman

Upang magkaroon ng matatag na pagsang - ayon sa isang pinagsaluhang lihim sa isang di - tiyak na channel, gamitin ang Diffie–Hlman (DH) na pangunahing palitan. Ang dalawang panig ay kapuwa lumilikha ng pribadong mga susi at nagpapalitan ng mga parameter, pagkatapos ay mag - isip ng isang karaniwang lihim. Ang diffie–Hellman[[T:1] ay madaling gamitin ng tao na si EXTHEXTHEPORYENEENEEEEENEEPERNTERENTERYENENENEENENENTEREEENEEENENTERENTERENTERENTEREEEEENTERENTERENTERENTEREEENEENENTERENEEENTER.

Katapatan at Pagiging Totoo ng Mensahe sa HMAC

Upang matiyak na ang isang mensahe ay hindi naiiba, ang HMAC ay gumagamit ng isang kabahaging sekretong susi at isang cryptographic hash function (e.g., SHAME256) sa bawat encrypted ciphertext. Ang HMAC ay gumagamit ng kabahaging lihim na susi at isang cryptographic hash function (e.g., SHAME. Ang receiver ay nagrecombingang muli ng HMAC sa natanggap na datos at inihahambing ito sa na halaga. Ang hakbang na ito ay pumipigil sa muling pag-play at pag-atake., ang AHASCENOM ay kinabibilangan ng isang tiyak na layunin na nagbibigay ng sertipikasyon sa serialized.

Paglalagay ng OpenSL sa Iyong Proyektong Pantatak

Ang OpenSL ay nangangailangan ng maingat na pag-iisyu. Isama ang mga kinakailangang header at tumawag at sa simula ng inyong programa. Para sa maling paghawak, gamitin at ]. Kapag nag-uugnay, idagdag sa inyong mga bandilang pang-ipon.

#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();
}

Pagtatayo ng TCP Socket Layer

Ang pangunahing transportasyon para sa iyong protocol ay ang TCP, na naglalaan ng maaasahan, na utos. Gumawa ng isang server na nakikinig sa dumarating na mga koneksiyon at isang kliyente na nagsisimula sa pakikipagkamay. Gamitin ang pamantayang HAKX na mga tuntungan na may , , , sa panig ng paglilingkod, at , [[TCL] sa panig ng kliyente] upang magamit nang malapitan ang mga pagkakamali.

Skeleton ng Server Halimbawa

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);

Maningning na Halimbawang 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));

Pag - aayos sa Diffie–Hellman Key Exchange

Pagkatapos magtatag ng koneksyong TCP, ang kliyente at server ay nagsasagawa ng isang DH key exchange. Ang bawat panig ay gumagawa ng isang DH key pair gamit ang OpenSLE. API. Ang public key ay ipinadadala sa socket, at ang magkabilang panig ay nakakakuha ng isang kabahaging lihim gamit ang . Para sa simple, gamitin ang isang nakapirmeng prime group (e.g., na may mga parametro mula sa[T:T18]. Sa isang tunay na protocolor, gagamitin ang isang pre-compostect.

// 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);

Sa pagtanggap ng katapusan, ang peer ay nag-aangkat ng public key na gumagamit at pagkatapos ay kumukuha ng pinag-uusapan na lihim.Ang hinangong lihim ay maaaring i-shed (e.g., na may SHA HA ⁇ 256) upang makagawa ng isang unipormeng susi para sa AES at HMAC.

Pag - anunsyo at Pag - aalis ng Mensahe sa AES ESMEGCM

Ang AESSLEGCM ang napiling paraan dahil ito'y naglalaan ng kapuwa encryption at isang annification tag sa isang operasyon. Gamitin ang OpenSLUks na may .[kailangan mo ng isang 12°B. Ginagamit ang OpenSL ⁇ t key na may .[kailangan ng sanggunian] Ang ⁇ b ⁇ b ⁇ eb ⁇ e ⁇ e ⁇ e ⁇ t ⁇ (IV) at ang 256°N ⁇ S. Ang ⁇ , ⁇ ay hindi naglalaman ng mensahe na magkasama, kung ang ⁇ at ang tag ay hindi na ginagamit.[T] Ang ⁇ , at ang tag ay hindi na ginagamit ang tag ay hindi na tagc.

// 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);

Pagdaragdag ng Katapatan kasama ng HMAC (o Levering GCM Tag)

Kung hindi mo gagamitin ang AES ES&GCM, maaari kang mag-encrypt sa AESS&CBC at pagkatapos ay mag-compt ng HMAC sa ibabaw ng ciphertext. Gamitin mula sa OpenSL na may SHACOR256.[kailangan ng sanggunian] Ang AMAC ay parehong nag-ebolb ng ciphertext. Gamitin ang mga recalculate at ihambing ang paraang ito sa dalawang susi: isa para sa encryption, isa para sa HMAC. Der from from from funceptified fromanced sa isang keys na may kaugnayan sa mga pagkakamali na ibinigay sa HKF.D.D.D.D&Pication (sance) Ang isang AT ANCCCC.

Pagsama - samahin Ito: Buong Gawain

  1. Magkaroon ng kaugnayan ang TCP sa pagitan ng kliyente at server.
  2. Ang magkabilang panig ay lumilikha ng mga pares ng ephemeral Diffie shellman.
  3. Magpalitan ng public key at pag - usapan ang sekreto ng mga ito.
  4. Desective a 256°bit AES key at isang 256°bit HMAC key (o gamitin ang parehong susi para sa GCM).
  5. Ang Client ay nagpapadala ng isang insect (12 bytes claim) at pagkatapos ay ang AES ES&GCM encrypted na mensahe at tag.
  6. Ang server ay nagpapadala ng tugon na gumagamit ng bagong ahensya (hindi kailanman muling gumagamit ng mga ahensya na may parehong susi).
  7. Ang magkabilang panig ay maaaring magpatuloy sa pagpapalitan ng mga mensahe; para sa mahahabang sesyon, ang rekey ay pana - panahon na gumagamit ng iisang DH beating o isang mekanismong rachet.

Katiwasayan Pinakamabuting Gawain

Pagsubok sa Protocol

Subukin ang iyong pagpapatupad sa pamamagitan ng pagpapatakbo ng kliyente at server sa parehong makina (localhost) at tiyaking tama ang pagkakatanggal ng mga mensahe sa mga mensaheng katulad ng introduktang pang-introduksiyon ng mga mali tulad ng introdukted ciphertext o imbalidong mga distansya upang matiyak na ang protocol ay tumatanggi sa mga ito. Gamitin ang mga kasangkapang katulad ng Wireshark upang siyasatin ang hilaw na network traffic traffic at pagtibayin na ang clextext na hindi nakikita. Para sa unit testptyptographic primes bukod na mga primitlerya. Ang OpenSLSLSSSSSF:2 ay maaaring makatulong sa pag-pagtiyak ng interse.

Pagsasaayos

Ang paggawa ng isang matatag na protocol ng komunikasyon sa C ay isang mahusay na ehersisyo sa pagkatuto, subalit nangangailangan ito ng maingat na pag - aasikaso sa detalye. Sa pamamagitan ng pag - aalis ng OpenSLiughters na napatunayang mga pagpapatupad ng Diffie Hellman, AES REGCM, at HMAC, makagagawa ka ng isang sistema na naglalaan ng kompidensiyal, integridad, at mapagkakatiwalaan. Laging sundin ang mga gawaing preseptograpiko: gumamit ng malakas na pasumite, magkaroon ng mga susi sa sesyon na may KDF, huwag kailanman muling magagamit ang lahat ng impormasyon.