Skip to content

Cryptography

Class 1 - Cryptography June 22, 2026

Speakers

Hamed Okhravi - Presentation

Radia Perlman, Charlie Kaufman - Presentation

Video Lecture - Homework


Choose one or more of the assignments below. For each one, do the practical work and write a short explanation of how it works. The advanced questions are optional deeper dives for those who want to.

✅ Create a public/private key pair

Questions

  • What is the public key?
  • What is the private key?
  • What can this key pair be used for?
  • Why must the private key be protected?

Answer

In Cryptography a public/private key pair can be used to encrypt/decrypt messages. These keys are basically just very large numbers where information can be encrypted with one number and decrypted with the other. The public key can be shared but the private key must be kept a secret. - Source

The public key can be shared with anyone, depending on the algorithm, public keys can encrypt messages or files that the corresponding private key can decrypt. - Source

The private key is the secret part of the asymmetric public/private key pair. The private key is typically used to digitally sign or decrypt data. - Source

The public/private key pair can be used for:

  1. Encryption/Decryption

    • Someone encrypts my data using my public key
    • Only my private key can decrypt the data
  2. Authentication

    • I can prove that I know my private key.
    • This helps others verify my identity
  3. Integrity protection/Digital signatures

    • I can sign a message using my private key.
    • Others can verify my signature using the public key.
    • This helps ensure the message has not been altered and confirms I signed it.

The private key must be protected because if an attacker gets my private key, they could be able to decrypt messages intended for me. They could also impersonate me during authentication and be able to created digital signatures that appears to come from me.


Create a public/private key pair

In terminal:

ssh-keygen -t ed25519 -C "andri@flr.is" -f ~/.ssh/id_ed25519_cybersecurity

This creates two files:

~/.ssh/id_ed25519_cybersecurity      private key
~/.ssh/id_ed25519_cybersecurity.pub  public key

I can view my public key with:

cat ~/.ssh/id_ed25519_cybersecurity.pub
✅ Install an SSH public key on a server and use it to log in

Questions

  • How does SSH key authentication work?
  • What is stored on the server?
  • What stays on your own computer?
  • Why does the server not need your private key?

Answer

SSH key authentication uses a public/private key pair. I put my public key on the server, while the private key remains on my computer. When I connect, the server verifies that I possess the right private key by sending a challenge that can only be correctly answered using my private key. Because the server can verify the response using my public key, I can authenticate myself without ever revealing my private key. Source

The server stores a copy of my public key. The public key is not secret and can be shared. The server uses it to verify that I have the matching private key. “Everyone knows Bob’s public key; only Bob knows his private key.” Source

The private key is stored on my computer and should never be shared with anyone. SSH uses the private key locally to prove ownership of the key pair. “Everyone knows Bob’s public key; only Bob knows his private key.” Source

The server does not need my private key because it only needs my public key to verify that I have the matching private key. When I connect, my computer uses the private key to answer the server’s challenge, and the server verifies the response using my public key. This allows me to prove my identity without ever sending my private key to the server. Source


Install an SSH public key on a server and use it to log in

In the previous assignment, Create a public/private key pair, I created a SSH public/private key pair in terminal:

ssh-keygen -t ed25519 -C "andri@flr.is" -f ~/.ssh/id_ed25519_cybersecurity

This created two files:

~/.ssh/id_ed25519_cybersecurity      private key
~/.ssh/id_ed25519_cybersecurity.pub  public key

Then to use this public/private key pair to authenticate myself on Gitlab, I sign into Gitlab using my fablabs.io credentials and go into Preferences - Access - SSH keys - hit the Add new key button, paste the full line from the cat command into the Key input field, change the Title and Expiration date(optional) and finally press the Add key button.

Add SSH key to Gitlab

I can safely share my public key with the world because it is worthless to others without my private key.

Then I go back into my terminal and test it in my terminal:

ssh -T git@gitlab.fabcloud.org

The first connection also prompted me to verify the GitLab server’s host key. After accepting it, GitLab successfully authenticated me using my SSH key and displayed a welcome message.

The authenticity of host 'gitlab.fabcloud.org (13.59.248.79)' can't be established.
ED25519 key fingerprint is SHA256:JCWnquB9CdnH4ctlmBh6JGzw02iMui8j8KckmYNCq/M.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? y
Please type 'yes', 'no' or the fingerprint: yes
Warning: Permanently added 'gitlab.fabcloud.org' (ED25519) to the list of known hosts.
Welcome to GitLab, @andrisaem!

Now I am able to connect to GitLab through SSH and clone my repo using:

git clone git@gitlab.fabcloud.org:academany/futures/units/cybersecurity/2026/labs/reykjavik/students/andrisaem.git

And to test i open a file and make a small edit.

nano index.md

Edit the file in nano by adding “Test”

Nano index.md

Commit the changes to my repo:

git status
git add index.md
git commit -m "test commit"
git push

git first test commit

And check my site to see if everything works.

site git test confirmed

I have now successfully made changes to my repository using my public/private key pair for SSH authentication.

✅ Encrypt and decrypt a file

Questions

  • Did you use symmetric or public-key encryption?
  • Where did the key come from?
  • Who can decrypt the file?
  • What happens if the key or password is lost?

Answer

I have not encrypted or decrypted a lot of files so to start i just googled simple ways to encrypt / decrypt files in linux terminal, and found GnuPG. “GnuPG allows you to encrypt and sign your data and communications”. I looked for some examples online and found one tutorial on linuxbash.sh and another on meetcyber.net which was plenty to get me going.

To start with I wanted to try public-key encryption

I asked my friend Doddi / Þórarinn if he would like to join forces on this project, he would generate a public / private key pair and send me his public key, I would do the same and we would encrypt files for each other.

Only Doddi can decrypt the file I encrypted with his public key.

If the key or password is lost then the encrypted file stays encrypted and unrecoverable.


Encrypt and decrypt a file

To start this assignment I asked Doddi to generate a public / private key pair using gpg and send me his public key. I used his public key to encrypt an image that I then sent to him to decrypt.

I downloaded his public file doddi-public.asc and typed in terminal:

gpg --import doddi-public.asc

To check that it was successfully imported i typed:

gpg --list-keys

The output showed me the email Doddi used to create his public / private key pair, and I encrypted an image:

gpg --encrypt --recipient doddi@doddi.is image.png

This created a file

image.png.gpg

I sent Doddi the file through Discord chat, not worried about security because he would be the only one capable of decrypting the file using his private key. He would need to decrypt the file on his own by typing:

gpg -o decrypted-image.png --decrypt image.png.gpg

You will need to visit Doddis site to see what I sent him.


Encrypt and decrypt a file

Use GnuPG or gpg to create a public / private key in terminal by typing:

gpg --full-generate-key

I then followed the wizard to create the public / private key with the following entries. In the end I was asked to create a password, which was optional but encouraged.

gpg key generation

To get the public key into a file I typed:

gpg --armor --export cyber@security.fab > cyber-public.asc

Here is the public key I actually generated if you want to send me an encrypted message. andri-public.asc

I sent Doddi my .asc file through Discord chat, I was not worried about security here because this was a public key which is useless without my private key.

Doddi then went ahead and encrypted a file for me, I had no idea what I was about to receive.

I received this file secret-image.jpeg.gpg. You are welcome to try to decrypt the file if you want. :)

To decrypt the file I put the image in my FabFutures folder and typed this in my terminal:

gpg -o image-decrypted.jpg --decrypt secret-image.jpeg.gpg

And this is the image I received decrypted

secret-image.jpg


Symmetric encryption

Since I already did public-key encryption I wanted to try symmetric encryption. Symmetric encryption does not rely on publy / private keys, only a password. So I found an image and performed symmetric encryption.

gpg -c neilG.png

Here is the file I encrypted neilG.png.gpg

If you want to see the image you can download the file and type this in terminal:

gpg -o decrypted_neilG.png --decrypt neilG.png.gpg

You will be asked for a password which is NeilYoung - Take a guess what the encrypted file is.

☐ Encrypt a disk, USB stick, directory, or filesystem

Questions

  • What exactly is encrypted?
  • When is the data decrypted?
  • What does this protect against?
  • What does it not protect against?

Answer

Write your answer here.

✅ Create a file, compute its hash, change the file, and compute the hash again

Create a file, compute its hash, change the file, and compute the hash again

I started by creating a .txt file with a simple message

echo "FabFutures - Cyber Security 2026" > hash_test.txt

I then use SHA256 to compute the hash of the file

sha256sum hash_test.txt

And i get a random hash string

c2f60f16e5fe416b9159e4e0cb292a29829473d3d9071d30ccf3a226286425ec  hash_test.txt

If I make just a tiny change to the file the hash will change, lets change FabFutures to Fab Futures - just add a space in FabFutures.

nano hash_test.txt

Use nano to add the space in FabFutures - then to save and exit nano - CTRL+O - Enter - CTRL+X

Compute the hash of the file again.

sha256sum hash_test.txt

And I get a completely different hash, eventhough the change was minor.

254552040d38c02f35a04899c014618dbd6c00eeef044516488a09f56ad5931f  hash_test.txt

Questions

  • What changed?
  • Why are hashes useful?
  • Why does a hash not prove who created the file?
  • How could hashes be used to detect tampering?

Answer

The computed hash was completely different eventhough the change was minor.

Hashes are useful because you can compare the hash of the file before and after a transfer or storage. You can see whether a file has been altered.

A hash only computes the contents of the file, you can rename the file but the hash will stay the same. You can make a copy of the file and the hash will remain the same. It does not prove who created the file only the contents.

If I know the hash of the original file then I can hash the file again and I can immediately see if the file has been corrupted or intentionally tampered with.

🟨 Sign a file or message and verify the signature

Challenge

Doddi / Þórarinn sent me a challenge. He sent me two files, /version_ldsflj/neo.txt and /version_fjkdfj/neo.txt with the signature for the file neo.txt.asc. My challenge was to figure out which neo.txt file had the good signature and which was bad.

To figure out the challenge I first did an excersize of my own where I signed a file with my own signature.

gpg --armor --detach-sign test.txt

To then test to see if the signature was good:

gpg --verify test.txt.asc test.txt

Which gave me:

gpg: Signature made Thu 25 Jun 2026 12:46:30 PM GMT
gpg:                using EDDSA key ED2F14F1FED237AA0F19CA81FAD4C804C17E2CD9
gpg: Good signature from "andri <andri@andri.is>" [ultimate]

I then made a small change to the test.txt file and ran the verification again:

gpg: Signature made Thu 25 Jun 2026 12:46:30 PM GMT
gpg:                using EDDSA key ED2F14F1FED237AA0F19CA81FAD4C804C17E2CD9
gpg: BAD signature from "andri <andri@andri.is>" [ultimate]

So now I am ready to solve Doddis challenge. I simply need to run the verification command on both files and see which gives me a Good signature using:

gpg --verify neo.txt.asc version_fjkdfj/neo.txt

and

gpg --verify neo.txt.asc version_ldsflj/neo.txt

Which tells me that the /version_fjkdfj/neo.txt had a Bad signature and the /version_ldsflj/neo.txt had the Good signature. Out of curiosity I cat-ed the neo.txt with the Good signature, and it reads:

I take the blue pill

Questions

  • What does the signature prove?
  • What does it not prove?
  • Why is the message usually hashed before signing?
  • What happens if the signed file is changed?

Answer

Write your answer here.

🟨 Send a digitally signed email

Send a digitally signed email

Questions

  • How can the recipient verify the signature?
  • What key or certificate do they need?
  • Is the email encrypted, signed, or both?
  • What is the difference between signing and encrypting?

Answer

Write your answer here.

☐ WIP Install a certificate on a web server, or inspect the certificate of an HTTPS website

Create a website and install an HTTPS certificate

I have owned the domain ormamolta.is for a while now but never got round to get it online. Ormamolta or vermicompost is a pet project of mine where I keep worms in boxes at home, feed them food scraps and produce vermicompost for soil enhancement. Since this assignment involved HTTPS certificates and web servers, I decided to use the opportunity to finally get the website online.

I created a simple placeholder website using GitHub Pages and connected it to my custom domain, ormamolta.is, which I had previously registered through ISNIC. To do this, I first verified ownership of the domain with GitHub. I then used the ISNIC control panel to configure the DNS records for the domain so that it pointed to GitHub Pages. Once GitHub could see the correct DNS records, it was able to verify the domain and GitHub automatically obtained and installed an HTTPS certificate from Let’s Encrypt.

Inspect the certificate

After the website was online, I inspected the certificate from the command line to verify that it had been issued correctly and to identify the Certificate Authority that signed it.

Using this command in terminal i can view the full certificate in detail:

openssl s_client -connect ormamolta.is:443 -servername ormamolta.is </dev/null 2>/dev/null | openssl x509 -text -noout

The certificate was issued by Let’s Encrypt and was valid for both ormamolta.is and www.ormamolta.is

Compare certificates on different networks

While inspecting the certificate for my website, I noticed that the results depended on which network I was connected to. When I used my phone’s hotspot, the certificate was issued by Let’s Encrypt and correctly identified ormamolta.is as the website owner. However, when I connected to the lab WiFi, the certificate appeared to be issued by Fortinet instead.

This was unexpected and led me to investigate further. I learned that the certificate presented to a user can sometimes depend on the network they are connected to. Since my website had only recently been published, it is possible that the lab network was treating the domain differently than other networks. Regardless of the cause, comparing the certificate information from both networks gave me practical experience inspecting certificates and understanding how HTTPS connections are established.

Phone wifi hotspot:

Issuer: C = US, O = Let's Encrypt, CN = YR1
Subject: CN = ormamolta.is

Fab Lab (School) wifi:

Issuer: C = US, ST = California, L = Sunnyvale, O = Fortinet,
CN = FG100FTK24028727
Subject: CN = ormamolta.is

Full certificate - Phone hotspot (Let’s Encrypt)

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            05:47:44:0f:a8:e1:df:fc:c9:ce:af:cc:03:36:7d:3d:d3:a3
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = Let's Encrypt, CN = YR1
        Validity
            Not Before: Jun 24 09:56:16 2026 GMT
            Not After : Sep 22 09:56:15 2026 GMT
        Subject: CN = ormamolta.is
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:98:98:58:eb:ec:cb:b6:77:81:e8:70:0e:87:22:
                    31:ef:d2:63:63:67:01:9c:90:4e:10:16:94:9c:f5:
                    19:b6:05:30:56:b6:82:41:62:d4:31:0b:79:c0:d4:
                    e1:c1:36:13:1f:5c:70:16:21:d0:1c:53:13:8c:3c:
                    0c:8c:5d:15:47:f8:c7:94:29:41:8f:c2:e3:b2:29:
                    b6:1b:77:8d:a8:73:ea:d8:63:91:37:d2:26:50:61:
                    a1:04:bd:fa:76:22:06:a5:a0:3d:dc:07:4b:8f:b7:
                    06:24:b6:17:92:2e:c9:ae:dc:16:2c:2c:c3:6c:94:
                    23:2d:9f:9d:d4:40:da:98:26:3d:67:87:37:b6:4c:
                    a4:a3:ee:52:31:e3:87:2c:ed:38:ee:70:a5:b5:98:
                    7d:c3:87:96:fb:2e:45:6c:a2:6c:24:ff:63:42:b6:
                    e4:7c:d4:5f:6b:96:73:24:7a:0c:a5:89:68:86:f1:
                    71:03:79:53:0e:88:1c:6e:5a:a5:f0:80:0c:66:0d:
                    a4:a2:20:b5:b9:09:1c:00:35:8f:3c:89:a7:8a:8c:
                    4e:57:fd:1e:28:19:3a:63:d0:56:03:e9:f5:32:0d:
                    37:40:3f:9a:90:71:33:d7:d7:b4:7e:41:48:b4:05:
                    aa:8e:f7:65:36:87:87:66:ca:ff:6d:83:43:ef:48:
                    ac:8d
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Subject Key Identifier: 
                58:C9:B2:AA:68:E6:A5:48:CC:D8:2B:E8:42:B2:BF:7F:BE:45:66:68
            X509v3 Authority Key Identifier: 
                1F:2F:35:BE:46:14:82:CD:40:B1:AE:79:2C:55:78:FA:F7:D4:68:FB
            Authority Information Access: 
                CA Issuers - URI:http://yr1.i.lencr.org/
            X509v3 Subject Alternative Name: 
                DNS:ormamolta.is, DNS:www.ormamolta.is
            X509v3 Certificate Policies: 
                Policy: 2.23.140.1.2.1
            X509v3 CRL Distribution Points: 
                Full Name:
                  URI:http://yr1.c.lencr.org/36.crl
            CT Precertificate SCTs: 
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : D8:09:55:3B:94:4F:7A:FF:C8:16:19:6F:94:4F:85:AB:
                                B0:F8:FC:5E:87:55:26:0F:15:D1:2E:72:BB:45:4B:14
                    Timestamp : Jun 24 10:54:46.908 2026 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:44:02:20:02:DF:A5:2E:63:F2:65:3A:C7:28:86:4E:
                                37:C8:C4:BA:93:89:80:DB:F9:05:C3:C2:52:19:A4:98:
                                16:45:CB:C2:02:20:74:18:A0:5B:8D:B5:BD:7A:14:20:
                                6E:81:FD:7D:EB:D6:DB:69:AC:8D:90:FF:92:DB:23:EB:
                                76:E2:6C:B6:BF:6B
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : A8:26:CB:E3:0A:C6:35:12:46:53:3F:E0:65:F1:4F:19:
                                D9:6E:19:08:13:C4:1D:D9:6D:79:00:B3:12:3C:55:27
                    Timestamp : Jun 24 10:54:47.781 2026 GMT
                    Extensions: 00:00:05:00:10:DE:B5:18
                    Signature : ecdsa-with-SHA256
                                30:44:02:20:3C:19:79:A3:E3:68:40:49:4E:EC:98:6C:
                                78:97:9F:7C:07:C4:26:20:2E:79:79:2B:67:75:FB:26:
                                22:7A:D8:8D:02:20:50:1C:0F:0D:DF:3E:BD:48:65:25:
                                CE:9E:96:BA:60:D5:AB:53:F8:52:BC:6F:CA:37:FD:A6:
                                12:08:DB:11:3B:8C
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        4d:28:2c:22:14:d2:2f:07:3e:0a:09:44:13:dc:14:b1:d2:1c:
        d5:f4:2c:9d:fa:3c:c4:e8:17:55:93:22:45:d8:84:a3:39:56:
        55:6b:de:91:13:86:33:b8:fc:11:b5:a4:ae:ac:f6:e7:52:fa:
        20:58:23:50:c4:3c:31:a8:b1:81:a2:68:b8:dd:f5:e9:5b:92:
        4d:f6:0d:e4:de:8e:b5:77:18:ac:85:5a:c3:a7:3d:c8:ac:24:
        05:6d:3e:30:d0:ad:8c:b6:d4:43:d2:74:54:be:68:87:15:ce:
        09:1b:f0:10:c9:f0:93:9f:f4:a6:09:d1:1c:90:1d:e7:f3:61:
        c6:67:1a:3a:ca:c1:3a:21:a3:0e:5d:cc:3a:c4:91:8c:03:ee:
        d5:2b:8c:28:f1:86:a6:44:f5:9f:11:bf:7b:7d:04:0c:a9:8a:
        37:9a:18:68:b9:1e:af:49:4a:ad:df:df:3b:9a:45:e8:27:c2:
        86:e8:ce:fa:c8:10:94:7f:dc:7b:d5:29:e9:c3:7b:09:69:a3:
        3d:55:dc:2f:41:a7:98:0e:23:36:06:66:93:60:22:4f:87:fb:
        22:b8:80:5a:b3:d7:ec:98:81:4c:4d:9c:b2:20:1b:42:fa:2c:
        5a:28:1f:31:f6:c9:77:d2:ad:1c:3d:91:f6:08:11:02:15:3c:
        a9:51:df:ac

Full certificate - Fab Lab WiFi (Fortinet)

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 8859121351258116702 (0x7af1ebee6bd1925e)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, ST = California, L = Sunnyvale, O = Fortinet, OU = Certificate Authority, CN = FG100FTK24028727, emailAddress = support@fortinet.com
        Validity
            Not Before: Jun 24 09:56:16 2026 GMT
            Not After : Sep 22 09:56:15 2026 GMT
        Subject: CN = ormamolta.is
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:a4:8c:f7:7e:a9:9d:3c:35:66:0f:f2:39:26:ac:
                    dc:dd:c9:8a:41:06:6a:28:0e:c3:4f:41:10:03:10:
                    d0:7c:6f:a2:0c:29:44:9e:11:c6:4c:f1:c2:36:f3:
                    b2:62:04:15:5e:84:dc:2c:23:d9:ae:28:79:92:0d:
                    cf:2f:55:c6:fa:98:ec:ef:97:f1:d7:5f:ac:f9:e5:
                    84:39:28:40:61:2f:77:c8:22:45:7a:be:4d:68:aa:
                    b8:20:4f:c0:e3:f4:52:32:e0:08:7c:5f:a6:e8:56:
                    61:b5:5c:d7:5f:65:2b:1b:ac:67:75:46:f0:8e:8d:
                    69:3a:67:a9:05:fd:84:5b:fd:12:2b:f9:c5:3c:30:
                    2f:18:6c:d3:da:7a:54:c4:43:a5:09:2f:1d:49:3a:
                    8d:8f:de:d5:4c:53:0b:e2:03:44:0a:10:72:ae:00:
                    85:d0:c2:83:d6:fc:f2:fc:70:c2:6a:f8:46:24:06:
                    ac:a1:2f:5c:b1:1e:5d:5a:fb:2c:35:44:c7:04:8d:
                    e3:6a:56:f7:e0:41:2b:44:b2:13:d3:80:8c:dc:f7:
                    97:df:0d:c4:e1:92:64:0d:e4:8e:c7:a2:6e:c6:48:
                    45:d4:6e:e1:14:43:bf:98:7b:ae:8e:e1:40:09:25:
                    a4:1e:31:3a:cc:38:d5:69:af:b9:d1:02:00:89:b4:
                    95:47
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Subject Alternative Name: 
                DNS:ormamolta.is, DNS:www.ormamolta.is
            Netscape Comment: 

MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMWX00XWMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMWKko:.  .;okKWMMMMMMMMMMMMMMMMM
MMMMMMMMMMNkdolc;'...,looc,. .';clodkNMMMMMMMMMM
MMMMMMMMMMO. .,;:ldOXWMMMMWKkdl:,'. .OMMMMMMMMMM
MMMMMMMMMMO. lWMMMMMMMMMMMMMMMMMMWc .OMMMMMMMMMM
MMMMMMMMMMO. lMMMWNXNNXXXXNNXNWMMMl .OMMMMMMMMMM
MMMMMMMMMMO. lMMWOllkOolloOkloOWMMl .OMMMMMMMMMM
MMMMMMMMMMO. lMMNkooOXKKKKXOookNMMl .OMMMMMMMMMM
MMMMMMMMMMO. lMMXxllONWMMWNOllxXMMl .OMMMMMMMMMM
MMMMMMMMMMO. lMMWOooO0xddx0OooONMMl .OMMMMMMMMMM
MMMMMMMMMM0' cWMWXkx0KkxxkK0xkKWMWc '0MMMMMMMMMM
MMMMMMMMMMNl .xWMMMMMMMMMMMMMMMMWx. lNMMMMMMMMMM
MMMMMMMMMMMXc .lXMMMMMMMMMMMMMMXl. cXMMMMMMMMMMM
MMMMMMMMMMMMNx' .oKWMMMMMMMMWKd' 'xNMMMMMMMMMMMM
MMMMMMMMMMMMMMXd' .:xKWMMWKx:. 'dXMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMNkc. .,::,. .ckNMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMXOo:;;:oOXMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMWX00XWMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMWKko:.  .;okKWMMMMMMMMMMMMMMMMM
MMMMMMMMMMNkdolc;'...,looc,. .';clodkNMMMMMMMMMM
MMMMMMMMMMO. .,;:ldOXWMMMMWKkdl:,'. .OMMMMMMMMMM
MMMMMMMMMMO. lWMMMMMMMMMMMMMMMMMMWc .OMMMMMMMMMM
MMMMMMMMMMO. lMMMWNXNNXXXXNNXNWMMMl .OMMMMMMMMMM
MMMMMMMMMMO. lMMWOllkOolloOkloOWMMl .OMMMMMMMMMM
MMMMMMMMMMO. lMMNkooOXKKKKXOookNMMl .OMMMMMMMMMM
MMMMMMMMMMO. lMMXxllONWMMWNOllxXMMl .OMMMMMMMMMM
MMMMMMMMMMO. lMMWOooO0xddx0OooONMMl .OMMMMMMMMMM
MMMMMMMMMM0' cWMWXkx0KkxxkK0xkKWMWc '0MMMMMMMMMM
MMMMMMMMMMNl .xWMMMMMMMMMMMMMMMMWx. lNMMMMMMMMMM
MMMMMMMMMMMXc .lXMMMMMMMMMMMMMMXl. cXMMMMMMMMMMM
MMMMMMMMMMMMNx' .oKWMMMMMMMMWKd' 'xNMMMMMMMMMMMM
MMMMMMMMMMMMMMXd' .:xKWMMWKx:. 'dXMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMNkc. .,::,. .ckNMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMXOo:;;:oOXMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMWX00XWMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMWKko:.  .;okKWMMMMMMMMMMMMMMMMM
MMMMMMMMMMNkdolc;'...,looc,. .';clodkNMMMMMMMMMM
MMMMMMMMMMO. .,;:ldOXWMMMMWKkdl:,'. .OMMMMMMMMMM
MMMMMMMMMMO. lWMMMMMMMMMMMMMMMMMMWc .OMMMMMMMMMM
MMMMMMMMMMO. lMMMWNXNNXXXXNNXNWMMMl .OMMMMMMMMMM
MMMMMMMMMMO. lMMWOllkOolloOkloOWMMl .OMMMMMMMMMM
MMMMMMMMMMO. lMMNkooOXKKKKXOookNMMl .OMMMMMMMMMM
MMMMMMMMMMO. lMMXxllONWMMWNOllxXMMl .OMMMMMMMMMM
MMMMMMMMMMO. lMMWOooO0xddx0OooONMMl .OMMMMMMMMMM
MMMMMMMMMM0' cWMWXkx0KkxxkK0xkKWMWc '0MMMMMMMMMM
MMMMMMMMMMNl .xWMMMMMMMMMMMMMMMMWx. lNMMMMMMMMMM
MMMMMMMMMMMXc .lXMMMMMMMMMMMMMMXl. cXMMMMMMMMMMM
MMMMMMMMMMMMNx' .oKWMMMMMMMMWKd' 'xNMMMMMMMMMMMM
MMMMMMMMMMMMMMXd' .:xKWMMWKx:. 'dXMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMNkc. .,::,. .ckNMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMXOo:;;:oOXMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMWX00XWMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMWKko:.  .;okKWMMMMMMMMMMMMMMMMM
MMMMMMMMMMNkdolc;'...,looc,. .';clodkNMMMMMMMMMM
MMMMMMMMMMO. .,;:ldOXWMMMMWKkdl:,'. .OMMMMMMMMMM
MMMMMMMMMMO. lWMMMMMMMMMMMMMMMMMMWc .OMMMMMMMMMM
MMMMMMMMMMO. lMMMWNXNNXXXXNNXNWMMMl .OMMMMMMMM
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        b9:fc:63:06:f7:39:00:29:41:3e:61:fb:3e:5b:80:71:db:cb:
        80:3e:91:30:db:d7:86:b3:95:79:d1:c7:ee:50:d1:dc:8e:1b:
        05:93:1c:23:39:2e:2d:c0:63:7b:9c:6e:ea:8d:9b:79:5a:99:
        9f:76:e4:a2:e4:40:4e:f0:f9:b9:87:a8:34:d0:52:87:6b:cc:
        f7:75:47:73:33:09:73:7e:71:d5:02:99:27:97:8a:f4:3e:67:
        9e:a2:da:91:04:bf:c8:0c:78:ef:68:b8:cd:76:42:3b:7b:bc:
        47:5e:9c:d6:6a:4f:ee:38:a3:a4:eb:a4:8c:a9:9e:86:9a:8c:
        fa:66:8c:37:cd:64:06:a7:f3:9a:4f:6e:6d:34:af:13:5e:7f:
        98:1c:42:26:aa:c6:c6:bd:5a:b2:1c:69:8a:ac:2a:b7:50:f0:
        27:03:d0:5b:59:d8:dc:48:ee:15:9c:85:08:60:fa:a6:a2:a5:
        27:32:ef:9b:2b:b2:5c:5a:3d:f4:0a:16:1b:20:f5:98:1c:c7:
        38:99:b4:c5:b7:c2:d4:c2:e3:22:c4:45:90:44:41:94:bb:3c:
        01:fc:c6:58:9f:85:e7:da:e5:3c:aa:1f:76:30:51:c5:2e:bd:
        37:6c:54:51:50:98:f7:13:eb:06:69:13:30:94:f0:4f:cc:54:
        fd:37:88:49

What I learned

I learned how to connect a domain name to a website, configure DNS records, and use HTTPS. I also learned how to inspect a certificate from the command line and verify who issued it. An unexpected lesson was discovering that different networks can present different certificates for the same website.

Questions

  • Why does the server send a certificate instead of just a public key?
  • What role does the Certificate Authority play?
  • What attack does this help prevent?

Answer

Write your answer here.

⬜ Show or describe how to encrypt a long message for someone using their public key

Questions

  • Why is the whole message usually not encrypted directly with the public key?
  • What is a symmetric key?
  • How is the symmetric key protected?
  • Why is this called hybrid encryption?

Answer

Write your answer here.

Optional Advanced Questions

☐ Research how RSA creates its private key

Background

Suppose Alice chooses two primes p₁ and p₂, and her modulus is:

n = p₁ × p₂

She also chooses a public exponent e, so her public key is (e, n).

Questions

  • How does she compute the private exponent d?
  • What is the role of (p₁ − 1)(p₂ − 1)?
  • Why is it hard for someone that sees the public key (e, n) to compute the private key (d, n)?
  • Why can Alice do this?

Answer

Write your answer here.

☐ Suppose Alice uses (e, p) as a public key, where p is prime

Questions

  • How would she compute the inverse exponent d?
  • Why would Alice’s public key (e, p) be insecure if her modulus p were a prime?

Answer

Write your answer here.

☐ Research why faster factoring would break RSA

Questions

  • What RSA publishes publicly.
  • Why factoring n reveals the private key.
  • Why a large quantum computer would be a problem for RSA.
  • Why this does not break all cryptography in the same way.

Answer

Write your answer here.

☐ Research why the industry is moving away from RSA and other older public-key systems

Questions

  • What problem RSA depends on being hard.
  • Why quantum computers threaten RSA.
  • What “post-quantum” or “quantum-safe” means.
  • Name one post-quantum algorithm and what it is used for.

Answer

Write your answer here.