التشفير في Rust: التشفير والتجزئة باستخدام ring و sha2

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

التشفير في Rust: التشفير والتجزئة باستخدام مكتبات ring و sha2



Rust هي لغة برمجة نظامية توفر أمان الذاكرة وأداءً مشابهاً لـ C/C++. بفضل نظام الأنواع الصارم ونموذج الملكية، تعتبر Rust مثالية لتنفيذ الخوارزميات التشفيرية حيث يمكن أن تؤدي الأخطاء إلى ثغرات خطيرة. في هذه المقالة، سنستعرض كيفية استخدام المكتبات الشائعة ring و sha2 لتنفيذ العمليات التشفيرية الأساسية: التشفير المتماثل، التجزئة، وحساب HMAC.



مكتبة ring: أداة شاملة للتشفير



مكتبة ring هي واحدة من أشهر مكتبات التشفير لـ Rust. توفر تطبيقات آمنة للعديد من الخوارزميات، بما في ذلك AES-GCM للتشفير، SHA-256 للتجزئة، و HMAC لمصادقة الرسائل. ring مكتوبة بلغة Rust و C، مما يضمن أداءً عالياً وأماناً.



للبدء، أضف التبعية إلى ملف Cargo.toml الخاص بك:



[dependencies]ring = "0.17"


التشفير المتماثل باستخدام AES-GCM



AES-GCM (وضع العداد/جالوا) هو وضع تشفير يوفر سرية البيانات ومصادقتها. يُستخدم على نطاق واسع في البروتوكولات الحديثة مثل TLS.



مثال على تشفير وفك تشفير سلسلة باستخدام ring:



use ring::aead::{Aad, LessSafeKey, Nonce, UnboundKey, AES_256_GCM};use ring::error::Unspecified;use ring::rand::{SecureRandom, SystemRandom};

fn encrypt(plaintext: &[u8], key: &[u8; 32]) -> Result<Vec<u8>, Unspecified> { let rng = SystemRandom::new(); let unbound_key = UnboundKey::new(&AES_256_GCM, key)?; let key = LessSafeKey::new(unbound_key);

// توليد nonce عشوائي (12 بايت) let mut nonce_bytes = [0u8; 12]; rng.fill(&mut nonce_bytes)?; let nonce = Nonce::assume_unique_for_key(nonce_bytes);

// مخزن مؤقت للبيانات المشفرة + علامة المصادقة let mut in_out = plaintext.to_vec(); key.seal_in_place_append_tag(nonce, Aad::empty(), &mut in_out)?;

// إرجاع nonce + البيانات المشفرة let mut result = nonce_bytes.to_vec(); result.extend_from_slice(&in_out); Ok(result)}

fn decrypt(ciphertext: &[u8], key: &[u8; 32]) -> Result<Vec<u8>, Unspecified> { let unbound_key = UnboundKey::new(&AES_256_GCM, key)?; let key = LessSafeKey::new(unbound_key);

// استخراج nonce (أول 12 بايت) let (nonce_bytes, encrypted) = ciphertext.split_at(12); let nonce = Nonce::assume_unique_for_key(nonce_bytes.try_into().unwrap());

let mut in_out = encrypted.to_vec(); let plaintext = key.open_in_place(nonce, Aad::empty(), &mut in_out)?; Ok(plaintext.to_vec())}

fn main() { let key = b"01234567890123456789012345678901"; // 32 بايت لـ AES-256 let data = b"رسالة سرية";

let encrypted = encrypt(data, key).unwrap(); println!("مشفر: {:?}", encrypted);

let decrypted = decrypt(&encrypted, key).unwrap(); println!("مفكوك: {}", String::from_utf8(decrypted).unwrap());}


يوضح هذا الكود دورة التشفير الكاملة: توليد nonce عشوائي، التشفير مع علامة المصادقة، ثم فك التشفير. لاحظ أن nonce يجب أن يكون فريداً لكل عملية تشفير بنفس المفتاح.



التجزئة باستخدام مكتبة sha2



توفر مكتبة sha2 تطبيقات لخوارزميات عائلة SHA-2، بما في ذلك SHA-256 و SHA-384 و SHA-512. تُستخدم التجزئة للتحقق من سلامة البيانات، تخزين كلمات المرور، وإنشاء التوقيعات الرقمية.



أضف التبعية:



[dependencies]sha2 = "0.10"


مثال على تجزئة سلسلة باستخدام SHA-256:



use sha2:                    

توصيات