Cryptography Basics

Cryptography is the mathematical backbone of trust. In an Operating System, it is used for:

  • Encrypted Filesystems (BitLocker, LUKS).
  • Secure Network Connections (SSH, HTTPS).
  • Code Signing (Preventing malware from loading as a driver).

1. Symmetric Encryption (Shared Secret)

Both parties have the same key.

  • Algorithm: AES (Advanced Encryption Standard).
  • Pros: Extremely fast (Hardware accelerated by AES-NI instructions in CPU).
  • Cons: Key Distribution Problem. How do I send you the key without a hacker intercepting it?

2. Asymmetric Encryption (Public Key)

Each party has a Key Pair.

  • Public Key: Share with everyone. Used to Encrypt.
  • Private Key: Keep secret. Used to Decrypt.
  • Algorithm: RSA, ECC (Elliptic Curve Cryptography).
  • Pros: Solves Key Distribution.
  • Cons: Very slow (1000x slower than AES).

[!TIP] Hybrid Encryption: In the real world (HTTPS/TLS), we use Asymmetric encryption to securely exchange a Symmetric key. Then we use the Symmetric key for the rest of the conversation.


3. Interactive: Public Key Demo

Alice wants to send a secret to Bob.

Alice
Has Message
"Attack at Dawn"
Bob
Has Keys
Bob-PUB
Bob-PRI
???
Waiting to start...

4. Code Example: AES Encryption

High-performance symmetric encryption.

Go
Java
package main

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

func main() {
	key := []byte("thisis32bitlongpassphraseimusing") // 32 bytes = AES-256
	text := []byte("My Secret Data")

	// Create Cipher Block
	block, err := aes.NewCipher(key)
	if err != nil { panic(err) }

	// GCM Mode (Galois/Counter Mode) provides encryption + integrity
	aesGCM, err := cipher.NewGCM(block)
	if err != nil { panic(err) }

	// Generate Nonce
	nonce := make([]byte, aesGCM.NonceSize())
	if _, err = io.ReadFull(rand.Reader, nonce); err != nil { panic(err) }

	// Encrypt
	ciphertext := aesGCM.Seal(nonce, nonce, text, nil)
	fmt.Printf("Encrypted: %x\n", ciphertext)
}
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.GCMParameterSpec;
import java.security.SecureRandom;
import java.util.Base64;

public class AESGCM {
    public static void main(String[] args) throws Exception {
        // Generate Key
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(256);
        SecretKey key = keyGen.generateKey();

        // IV (Nonce)
        byte[] iv = new byte[12]; // GCM standard IV size
        new SecureRandom().nextBytes(iv);

        // Encrypt
        Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
        GCMParameterSpec spec = new GCMParameterSpec(128, iv);
        cipher.init(Cipher.ENCRYPT_MODE, key, spec);

        byte[] ciphertext = cipher.doFinal("My Secret Data".getBytes());

        System.out.println("Encrypted: " + Base64.getEncoder().encodeToString(ciphertext));
    }
}