التشفير في Go (Golang): التشفير والتجزئة

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

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

ابدأ الدورة

التشفير في Go (Golang): تشفير وتجزئة البيانات



توفر لغة Go (Golang) مكتبة قياسية قوية وأنيقة للعمليات التشفيرية. على عكس العديد من اللغات الأخرى التي تتطلب تثبيت حزم خارجية، تتضمن Go دعمًا للتشفير المتماثل وغير المتماثل، بالإضافة إلى خوارزميات التجزئة الحديثة مباشرة "من الصندوق". في هذه المقالة، سنشرح بالتفصيل كيفية استخدام التشفير في Go لحماية البيانات على البوابة التعليمية pythonlib.ru.



الحزم الرئيسية للتشفير في Go



يتركز كل التشفير في Go في حزمة crypto وحزمها الفرعية. إليك أهمها:

  • crypto/aes — تنفيذ معيار التشفير المتقدم (AES).
  • crypto/cipher — واجهات لأنماط التشفير (CBC، GCM، CTR).
  • crypto/rsa — التشفير غير المتماثل RSA.
  • crypto/sha256، crypto/sha512 — دوال التجزئة من عائلة SHA-2.
  • golang.org/x/crypto/bcrypt — تجزئة تكيفية لكلمات المرور (حزمة إضافية).
  • crypto/rand — مولد أرقام عشوائية آمن تشفيريًا.


التشفير المتماثل AES في Go



يستخدم التشفير المتماثل نفس المفتاح للتشفير وفك التشفير. لنلق نظرة على مثال مع AES-256 في وضع GCM (Galois/Counter Mode)، الذي يوفر مصادقة البيانات.



package main

import ( "crypto/aes" "crypto/cipher" "crypto/rand" "encoding/hex" "fmt" "io")

func encryptAES(plaintext []byte, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err }

// إنشاء GCM (Galois/Counter Mode) gcm, err := cipher.NewGCM(block) if err != nil { return nil, err }

// إنشاء nonce عشوائي (رقم يُستخدم مرة واحدة) nonce := make([]byte, gcm.NonceSize()) if _, err := io.ReadFull(rand.Reader, nonce); err != nil { return nil, err }

// Seal يضيف nonce إلى بداية النص المشفر ciphertext := gcm.Seal(nonce, nonce, plaintext, nil) return ciphertext, nil}

func decryptAES(ciphertext []byte, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err }

gcm, err := cipher.NewGCM(block) if err != nil { return nil, err }

nonceSize := gcm.NonceSize() if len(ciphertext) < nonceSize { return nil, fmt.Errorf("ciphertext too short") }

nonce, ciphertext := ciphertext[:nonceSize], ciphertext[nonceSize:] plaintext, err := gcm.Open(nil, nonce, ciphertext, nil) if err != nil { return nil, err } return plaintext, nil}

func main() { key := []byte("examplekey123456") // 16 بايت لـ AES-128 plaintext := []byte("بيانات سرية لـ PythonLib")

encrypted, _ := encryptAES(plaintext, key) fmt.Println("مشفر (hex):", hex.EncodeToString(encrypted))

decrypted, _ := decryptAES(encrypted, key) fmt.Println("مفكوك:", string(decrypted))}


لاحظ: يجب أن يكون طول المفتاح 16 أو 24 أو 32 بايت لـ AES-128 أو AES-192 أو AES-256 على التوالي. يتم إنشاء nonce (IV) بشكل عشوائي ويُحفظ مع النص المشفر.



التشفير غير المتماثل RSA في Go



يستخدم RSA زوجًا من المفاتيح: مفتاح عام (public) للتشفير ومفتاح خاص (private) لفك التشفير. هذا مثالي للتبادل الآمن للبيانات بين الخادم والعميل.



package main

import ( "crypto/rand" "crypto/rsa" "crypto/sha256" "fmt")

func generateKeyPair(bits int) (*rsa.PrivateKey, error) {

توصيات