#!/bin/bash
# 실습 #5 ① — SSH 키 3종 생성 (RSA / ECDSA / ed25519) 비교
# - 신규 환경 권장: ed25519 (작고 빠르고 안전. OpenSSH 6.5+ 호환)
# - 레거시 호환 필요시만: RSA 4096
# - 파일 크기·생성 속도·fingerprint 알고리즘 직접 비교
set -e

OUT="$HOME/lab_keys"
mkdir -p "$OUT"
chmod 700 "$OUT"

# 1) RSA 4096 — 정수 인수분해 기반. 길고 느리지만 가장 호환성 ↑
echo "=== RSA 4096 생성 ==="
ssh-keygen -t rsa -b 4096 -N "" -C "lab-rsa@$(hostname)" -f "$OUT/id_rsa_lab" >/dev/null
ls -lh "$OUT/id_rsa_lab"*

# 2) ECDSA P-256 — 타원곡선. ed25519 보다 호환성 ↑ (FIPS 환경 등)
echo
echo "=== ECDSA P-256 생성 ==="
ssh-keygen -t ecdsa -b 256 -N "" -C "lab-ecdsa@$(hostname)" -f "$OUT/id_ecdsa_lab" >/dev/null
ls -lh "$OUT/id_ecdsa_lab"*

# 3) ed25519 — Edwards curve. 키 작고 서명 빠르고 안전. 권장.
#    -a 100 : bcrypt KDF 100라운드 → 패스프레이즈 브루트포스 저항 ↑
echo
echo "=== ed25519 생성 (KDF 100라운드) ==="
ssh-keygen -t ed25519 -a 100 -N "" -C "lab-ed25519@$(hostname)" -f "$OUT/id_ed25519_lab" >/dev/null
ls -lh "$OUT/id_ed25519_lab"*

# 4) Fingerprint 비교 (SHA256, bit, 알고리즘)
echo
echo "=== Fingerprint 한 줄 비교 ==="
for k in id_rsa_lab id_ecdsa_lab id_ed25519_lab; do
    ssh-keygen -lf "$OUT/${k}.pub"
done

# 5) 파일 크기 비교 — 동일 보안 강도여도 ed25519 가 압도적으로 작음
echo
echo "=== 파일 크기 비교 (byte) ==="
wc -c "$OUT"/id_*_lab "$OUT"/id_*_lab.pub | sort -k2

# 6) 권한 점검 — 이 권한이 안 맞으면 SSH 가 키 거부
echo
echo "=== 권한 (비공개 600 · 공개 644 가 정상) ==="
ls -l "$OUT"/id_*_lab*

# 7) ssh-copy-id 시나리오 안내 (실제 서버가 있을 때만 실행)
cat <<EOF

=== 공개키 서버 등록 — 실서버 있을 때 ===
  ssh-copy-id -i $OUT/id_ed25519_lab.pub lab@192.168.56.10
  ssh -i $OUT/id_ed25519_lab lab@192.168.56.10

=== 수동 등록 (Windows OpenSSH 등 ssh-copy-id 없는 환경) ===
  cat $OUT/id_ed25519_lab.pub | \\
      ssh lab@192.168.56.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh \\
        && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
EOF
