bersama catatan peribadi & teknikalnya.

Kunci GnuPG (GPG)

Tandatangan dan Penyulitan Digital


geeky stuff
#gpg | #encrypt | #sign

Pembelajaran seterusnya; berkaitan tajuk di atas.

Pelajaran dan perkara baru bagi saya, sebab ada ternampak orang lain sediakan kunci PGP miliknya. Tertanya-tanya juga, apa ke bendanyalah kunci PGP ini, ya?

Archwiki pun menjadi rujukan. Menurut [1] Archwiki yang mengambil petikan dari [2] laman web rasmi GnuPG:-

GnuPG ialah pelaksanaan penuh dan percuma bagi standard OpenPGP sebagaimana ditakrifkan oleh RFC4880 (juga dikenali sebagai PGP). GnuPG membenarkan anda untuk menyulitkan dan menandatangani data serta komunikasi anda; ia dibangunkan dengan ciri-ciri sebuah sistem pengurusan kunci yang serba boleh berserta modul-modul akses bagi semua jenis direktori kunci awam. GnuPG, juga dikenali sebagai GPG, ialah sebuah alat baris perintah dengan ciri-ciri yang memudahkan integrasi dengan aplikasi lain. Banyak aplikasi frontend dan libraries yang tersedia. GnuPG juga menyediakan sokongan untuk S/MIME dan Secure Shell (ssh).

Ha... selesai bab pengenalan kepada GPG. Saya akan teruskan kepada penggunaan berdasarkan dapatan dan kegunaan untuk diaplikasikan oleh diri saya sendiri yang kebanyakannya diperolehi dari Archwiki dan [3] manual gpg.

Saya akan menyentuh tentang:-

1)Penggunaan biasa merangkumi;Jana kunci
Lihat senarai kunci yang ada (dalam keyring)
Sunting kunci
Eksport kunci
Import kunci
Memadam kunci (dalam keyring)
Mencari dan menerima kunci
2)Tandatangan merangkumi;Tandatangan bersama Penyulitan
Tandatangan hanya untuk proses Verifikasi
3)Penyulitan Fail
Kesemua perkara di atas ini dijalankan hanya melalui baris perintah di Terminal tanpa melibatkan sebarang aplikasi frontend GUI.

Sebelum saya teruskan dengan penerangannya, saya sediakan singkatan-singkatan opsyen yang berguna (lebih kepada diri saya). :smile:

Singkatan-singkatan Opsyen:

Singkatan OpsyenOpsyen penuh
-a--armor
-b--detach-sign
-d--decrypt
-e--encrypt
-k--list-keys / --list-public-keys
-K--list-secret-keys
-o--output
-r--recipient
-s--sign
-u--local-user

Penggunaan Asas:-

Jana Kunci

gpg --full-gen-key
Hal ini ialah perkara pertama (first things first) mesti dibuat sebelum pergi kepada perlaksanaan-perlaksanaan yang lain, ya? Kena ada kunci peribadi dijana terlebih dahulu.

Lihat senarai kunci yang ada (dalam keyring)

  1. Senarai kunci awam & contoh output:-
    gpg -k
    1pub   rsa3072 2021-08-04 [SC]
    2      A752DBD8BB275BCA537667D90E98A0530779BF34
    3uid           [ultimate] Pn Raihan (Contoh) <e-mel@wraihan.com>
    4sub   rsa3072 2021-08-04 [E]

    Senarai kunci awam berserta ID kunci & contoh output:-
    gpg -k --keyid-format 0xlong
    1pub   rsa3072/0x0E98A0530779BF34 2021-08-04 [SC]
    2      A752DBD8BB275BCA537667D90E98A0530779BF34
    3uid                   [ultimate] Pn Raihan (Contoh) <e-mel@wraihan.com>
    4sub   rsa3072/0xF045B53A25EB1904 2021-08-04 [E]
    Daripada contoh pengeluaran di atas, ada 4 baris disenaraikan:-
    • ID kunci awam
    • Cap jari (40 karakter alfanumerik)
    • ID pengguna
    • ID sub kunci awam
  2. Senarai kunci rahsia:-
    gpg -K

    Senarai kunci rahsia berserta ID kunci & contoh output:-
    gpg -K --keyid-format 0xlong
    1sec   rsa3072/0x0E98A0530779BF34 2021-08-04 [SC]
    2      A752DBD8BB275BCA537667D90E98A0530779BF34
    3uid                   [ultimate] Pn Raihan (Contoh) <e-mel@wraihan.com>
    4ssb   rsa3072/0xF045B53A25EB1904 2021-08-04 [E]
    Daripada contoh pengeluaran di atas, ada 4 baris disenaraikan:-
    • ID kunci rahsia
    • Cap jari (40 karakter alfanumerik)
    • ID pengguna
    • ID sub kunci rahsia

Sunting Kunci

gpg --edit-key key-id / user-id
- untuk menyunting kunci sudah ada e.g. menambah ID pengguna dengan nama dan alamat e-mel yang lain melalui opsyen adduid.
Secara efektifnya, masukkan key-id / user-id sama ada dalam bentuk:-
  1. ID kunci
    $ gpg --edit-key 0x0E98A0530779BF34
    atau
  2. Cap jari
    $ gpg --edit-key A752DBD8BB275BCA537667D90E98A0530779BF34
    atau
  3. ID pengguna iaitu nama / alamat e-mel.
    $ gpg --edit-key "Pn Raihan"
    $ gpg --edit-key e-mel@wraihan.com

Eksport kunci

Terdapat dua jenis kunci untuk dieksport keluar ke dalam fail berformat ASCII.
  1. Eksport kunci rahsia sebagai sandaran (backup).
    gpg -a -o output_sec.asc --export-secret-keys key-id

    Fail sandaran output_sec.asc yang mengandungi kriptogram kunci peribadi inilah yang boleh diimport ke dalam aplikasi lain seperti klien e-mel Thunderbird. Jangan import kunci awam pula, ya! Memang gagallah ceritanya. Nama pun kunci peribadi (personal key), yang hang pergi import kunci awam tu kenapa Raihan weh? :laughing: Lepas tu duk kepelikan sendiri tak ketahuan punca. Rupa-rupanya salah import. Heh!
  2. Eksport kunci awam.
    gpg -a -o output_pub.asc --export key-id

    Kunci awam berkriptogram yang terkandung di dalam fail output_pub.asc ini boleh diimport ke dalam aplikasi web seperti GitHub, GitLab dan sebagainya. Jangan import kunci peribadi (rahsia) pula di tempat-tempat ini, ya!

Boleh juga daftarkan kunci yang telah dijana di server kunci PGP awam. Dengan cara ini, orang lain boleh mencarinya di dalam server tanpa perlu menghubungi kita secara langsung. Bacaan lanjut mengenainya boleh diperolehi di laman ArchWiki | GnuPG: Use a keyserver.

Import Kunci

gpg --import contoh.asc
- untuk mengimport kunci awam daripada sebuah fail bernama contoh.asc (dalam format ASCII).

Memadam kunci (dalam keyring)

Amaran:exclamation:

Sekiranya sub kunci lama pernah digunakan sebagai penerima kepada fail yang disulitkan, jangan padam sub kunci lama / sub kunci yang telah dibatalkan itu. Hal ini akan mendatangkan kemudaratan kerana fail yang telah disulitkan kepada sub kunci lama berkenaan tidak akan dapat dinyahsulit lagi setelah ia dipadam.
Memadam sub kunci ini hanya dibuat jika anda mempunyai alasan yang benar-benar kukuh.
CADANGAN andai memadamnya dirasakan amat perlu: Cari fail yang telah disulitkan kepada sub kunci lama, nyahsulitkannya terlebih dahulu, barulah kemudiannya dipadam sub kunci lama berkenaan.
Pembatalan Kunci

Jika pernah berkomunikasi dengan orang lain menggunakan kunci yang sudah tidak digunakan lagi, boleh jalankan pembatalan kunci dan maklumkan kepada individu berkenaan. Pembatalan kunci juga boleh dilakukan atas sebab-sebab yang lain. Baca selanjutnya di ArchWiki | GnuPG: Revoke a key.
  1. Memadam kunci rahsia & awam milik sendiri.
    gpg --delete-secret-and-public-key key-id
  2. Memadam kunci diimport yang sudah tidak digunakan lagi atau telah tamat tempoh.
    gpg --delete-keys key-id

Mencari dan menerima kunci

  1. Mencari kunci dalam keyserver tanpa mengimportnya.
    gpg --search-keys user-id / key-id
  2. Menerima kunci dari keyserver (import).
    gpg --recv-keys key-id

Tandatangan:-

Tandatangan bersama Penyulitan

Ada dua cara untuk menandatangani dan menyulitkan teks / dokumen / fail; satu keadaan memang menyulitkan, satu lagi keadaan kurang menyulitkan. 🤭
  1. Tandatangan dengan Penyulitan Penuh.
    gpg -o test-E.sig -r recipient-key-id -s -e test.txt
    Fail test.txt ialah dokumen yang mengandungi mesej rahsia. Fail ini ditandangani dan disulitkan dengan cara di atas, menghasilkan sebuah lagi fail bernama test-E.sig.
    Contoh di bawah; Pemilik kunci yang menandatangani dan menyulitkan fail perlu memasukkan ID-kunci-penerima (recipient-key-id) yang bermaksud bahawa, kunci penerima mesti ada di dalam keyring. Jika belum ada, kunci penerima perlu diimport terlebih dahulu.
     1$ cat test.txt
     2Salam dan hai, semua! Apa khabar?
     3
     4$ gpg -o test-E.sig -s -e test.txt
     5You did not specify a user ID. (you may use "-r")
     6
     7Current recipients:
     8
     9Enter the user ID.  End with an empty line: 
    10gpg: no valid addressees
    11gpg: test.txt: sign+encrypt failed: No user ID
    12
    13$ gpg --import 0xB0AD752D5C7CA57D.asc
    14gpg: key B0AD752D5C7CA57D: public key "En Ayusri (Contoh) <e-mel@ydomain.com>" imported
    15gpg: Total number processed: 1
    16gpg:               imported: 1
    17
    18$ gpg -k --keyid-format 0xlong
    19~/.gnupg/pubring.kbx
    20-------------------------------
    21pub   rsa3072/0x0E98A0530779BF34 2021-08-04 [SC]
    22      A752DBD8BB275BCA537667D90E98A0530779BF34
    23uid                   [ultimate] Pn Raihan (Contoh) <e-mel@wraihan.com>
    24sub   rsa3072/0xF045B53A25EB1904 2021-08-04 [E]
    25
    26pub   rsa3072/0xB0AD752D5C7CA57D 2021-08-04 [SC]
    27      AA72C11FDEB0D9B61053F0A8B0AD752D5C7CA57D
    28uid                   [ unknown] En Ayusri (Contoh) <e-mel@ydomain.com>
    29sub   rsa3072/0xA4756D32359086D7 2021-08-04 [E]
    Sekiranya ingin menandatangani dengan kunci selain daripada default-key (jika memiliki kunci berasingan sebagai contoh), tambahkan option -u key-id kepada baris perintah di atas.
     1$ gpg -o test-E.sig -u 0x0E98A0530779BF34 -r 0xB0AD752D5C7CA57D -s -e test.txt
     2gpg: A4756D32359086D7: There is no assurance this key belongs to the named user
     3
     4sub  rsa3072/A4756D32359086D7 2021-08-04 En Ayusri (Contoh) <e-mel@ydomain.com>
     5 Primary key fingerprint: AA72 C11F DEB0 D9B6 1053  F0A8 B0AD 752D 5C7C A57D
     6      Subkey fingerprint: 2316 5967 E33A 8548 9716  C32D A475 6D32 3590 86D7
     7
     8It is NOT certain that the key belongs to the person named
     9in the user ID.  If you *really* know what you are doing,
    10you may answer the next question with yes.
    11
    12Use this key anyway? (y/N) y
    13
    14$ ls | grep test
    15test-E.sig
    16test.txt
    Fail tandatangan test-E.sig yang terhasil itu kemudiannya boleh dihantarkan kepada penerima yang dimaksudkan. Setelah itu, penerima perlu menyahsulitkan fail test-E.sig tersebut untuk membaca mesej asalnya dengan baris perintah berikut:-
    gpg -o original.txt -d test-E.sig

    Info tambahan:

    Penerima tidak dapat menjalankan verifikasi ke atas fail yang telah ditandatangani dengan cara -s -e di atas. Hanya setelah penerima menyahsulitkan fail berkenaan, barulah penerima dapat melihat maklumat pengesahan/verifikasi bagi fail tersebut. Lihat contoh daripada imej-imej yang disertakan di bawah.
    Gigihlah pasang semula VM Windows 10 untuk testing ➡️ Fail yang asalnya ditandatangani dan disulitkan dalam sistem Arch Linux saya salin (scp) ke Mesin Maya Windows 10 sebagai penerima.
    Import kunci penghantar fail tandatangan. Status kunci yang baru diimport ialah [unknown].
    Apabila nyahsulit fail, keluar amaran yang menyebut, "This key is not certified with a trusted signature!". Untuk perakui (certify) kunci penghantar, jalankan gpg --edit-key key-id dan pilih opsyen tandatangan (rujuk manual GPG). Saya pilih untuk menandatangani kunci tersebut dengan opsyen tsign.
    Sambungan kepada proses certify di atas. Status user-id (uid) kini bertukar daripada [unknown] kepada [full].

    Sepengetahuan saya, mesej memang sudah dinyahsulit dan dapat dibaca semasa proses di peringkat awal tadi serta pengesahan tentang kualiti mesej juga telah diperolehi sebelum kunci pemberi yang diimport itu diperakui. Cumanya proses memperakui itu dibuat atas dasar kepercayaan kita terhadap pemberi mesej.
  2. Tandatangan dengan Penyulitan Separa.
    gpg -o test-C.sig --clearsign test.txt

    Tidak perlu masukkan recipient-key-id bagi cara ini kerana fail tidak dinyahsulitkan dengan cara penuh (melalui opsyen -e) seperti sebelum ini. Cara ini menghasilkan input di dalam fail test-C.sig dengan mesej asal juga terkandung di dalamnya sebelum baris tandatangan dalam bentuk Hash.
    Ha, inilah yang saya katakan sulit yang tidak berapa sulit. :laughing:
    Bagi mesej pendek, bolehlah baca saja terus daripada fail tandatangan yang terhasil dengan cara ini. Kalau mesejnya panjang sangat, lebih baik fail dinyahsulit juga supaya dapat baca teks dengan elok dan jelas. Cara menyahsulit fail sama seperti cara yang sudah ditunjukkan di atas.

     1$ gpg -o test-C.sig --clearsign test.txt
     2
     3$ cat test-C.sig
     4-----BEGIN PGP SIGNED MESSAGE-----
     5Hash: SHA256
     6
     7Salam dan hai, semua! Apa khabar?
     8-----BEGIN PGP SIGNATURE-----
     9
    10iQGzBAEBCAAdFiEEp1Lb2LsnW8pTdmfZDpigUwd5vzQFAmEKqUsACgkQDpigUwd5
    11vzR5pgv+KFChSML9/KPjcvqVqW5x9xC4XSfFqDlIrkQmeIg/LIIpGr1Y34Gk0Mu5
    12gIEMwyR/ijtJQGTRo6pwaBSxKkwSiRh9xFY7FG8KuiBFgC4+nNU58mBs5MXcoyWD
    13aKxncZEsl3OYQDS7gKeBfURqNDkHNDmFscP2Kp0Mmlj3+swEorZWw/lI1t5iCOeH
    14ylT5ugrctQliMIGBYEu7MK0tr/pTA3odLEPWd3nTgFh8Pfi2jSampdXBHiyxHF+L
    15NTbJURLs1Ffla/scPklynNLziXedNOssSidYKOj74kfLa6X4hKirXRH4oyoWYJIt
    16LxiIWCcCoPKMTIfSs3U09okwUZ8ChYdx27im3aXYtZrT3H/kmQ2oJPk5zFtdPM7T
    174IeLlm47955hJCkHMRm1cLlsb1kOg+arK6U+mKjViLKvG3uGe+SScOs8ATmVMhxv
    18KDxYe8xKuNiMZQBJ8X8hugrh8Apz3fXahMSYX+QTcPBs3vWM3XX/JNMZDKo4FY32
    198MfqMcTm
    20=Jfvq
    21-----END PGP SIGNATURE-----

Tandatangan hanya untuk proses Verifikasi

Tandatangan ini hanya digunakan untuk proses verifikasi di antara dua fail, iaitu fail yang mengandungi mesej asal dan juga fail tandatangan.
gpg -o test-D.sig -b test.txt
Cubaan verifikasi di VM Windows 10. Dapat dilihat, verifikasi hanya boleh berlaku dengan adanya dua fail untuk dibandingkan. Saya bandingkan fail tandatangan dengan fail original.txt yang sudah dinyahsulitkan sebelum ini. Penghantar mesej yang mahu menggunakan cara ini kena beri dua fail kepada penerima; [1] fail yang mengandungi mesej / teks tanpa penyulitan dan [2] juga fail tandatangan.
Kesimpulan:

Tandatangan digital ini penting untuk semakan keaslian dan ketulenan dokumen. Lihat contoh daripada output di bawah ini. Hanya terdapat satu perubahan / modifikasi kepada fail asal yang telah ditandatangani, iaitu <jarak> di antara “hai,” dan “semua” yang telah dipadam setelah fail ditandatangani, maka status tandatangan berubah daripada Good kepada BAD.

 1$ cat test.txt
 2Salam dan hai, semua! Apa khabar?
 3
 4$ gpg --verify test-D.sig test.txt
 5gpg: Signature made Wed 04 Aug 2021 10:54:22 PM +08
 6gpg:                using RSA key A752DBD8BB275BCA537667D90E98A0530779BF34
 7gpg: Good signature from "Pn Raihan (Contoh) <e-mel@wraihan.com>" [ultimate]
 8
 9$ cat test.txt
10Salam dan hai,semua! Apa khabar?
11
12$ gpg --verify test-D.sig test.txt
13gpg: Signature made Wed 04 Aug 2021 10:54:22 PM +08
14gpg:                using RSA key A752DBD8BB275BCA537667D90E98A0530779BF34
15gpg: BAD signature from "Pn Raihan (Contoh) <e-mel@wraihan.com>" [ultimate]

Penyulitan Fail

Boleh digunakan untuk menyulitkan fail yang mengandungi kata laluan. Atau digunakan untuk menyulitkan sebuah fail sebagai bentuk komunikasi di antara dua orang tetapi penghantarnya mesti tahu ID-kunci-penerima (recipient-key-id) sepertimana yang sudah diterangkan sebelum ini.
Baris perintah untuk menyulitkan fail semua-pwd.txt yang mengandungi kata laluan. Ia menghasilkan sebuah lagi fail bernama semua-pwd.txt.asc sebagai fail tersulit.
gpg -a -r recipient-key-id -e semua-pwd.txt

Untuk menyahsulit fail yang terhasil itu kepada fail bernama orig-semua-pwd.txt, di bawah ialah baris perintahnya:-
gpg -o orig-semua-pwd.txt -d semua-pwd.txt.asc

Cara di atas ini dipanggil sebagai Penyulitan Tidak Simetri.

Pengguna juga mempunyai opsyen untuk menyulitkan dokumen / fail tanpa perlu menjana pasangan kunci GPG. Kaedah ini dipanggil sebagai Penyulitan Simetri yang hanya memerlukan pengguna untuk menyulitkan dokumen dengan frasa laluan.

Boleh rujuk ArchWiki | GnuPG: Symmetric untuk mengetahui tentangnya dengan lebih lanjut.



Kali terakhir dikemaskini:
Top