====== Security: Szyfrowanie Asymetryczne ======
Do realizacji zadania wykorzystano WSL1 na systemie Windows 2019 server.\\
Dystrybucja uruchomiona pod systemem WSL to Ubuntu 22.04.4 LTS\\
Do włączenia legacy providera w OpenSSL wykorzystano poniższy tutorial:\\
https://lindevs.com/enable-openssl-legacy-provider-on-ubuntu
====== Zadanie 1 ======
Korzystają c z polecenia openssl genrsa zapisz składnię polecenia, które wygeneruje parę kluczy (publiczny i prywatny) RSA o długości 2048 bitów I zapisze je w pliku o nazwie rsa.key. Po wygenerowaniu kluczy sprawdź zawartość pliku rsa.key za pomocą następującego p olecenia:\\
openssl rsa in rsa.key text\\
===== Realizacja =====
root@WSL:lab6_pliki> ls
'Lab6 - szyfry asymetryczne - zaoczne.pdf' 'Lab6 - szyfry asymetryczne v2.pdf'
root@WSL:lab6_pliki> openssl genrsa -out rsa.key 2048
root@WSL:lab6_pliki> openssl rsa -in rsa.key -text
Private-Key: (2048 bit, 2 primes)
modulus:
00:97:ba:ad:c4:bb:34:77:52:2d:4c:f4:96:36:db:
4d:ef:0c:55:cb:5f:8c:22:53:7d:81:c8:10:20:cf:
c9:bd:6d:81:df:ad:0f:22:5c:aa:ef:e3:91:ec:3c:
8c:19:0a:46:38:7b:00:7e:00:e1:bf:2a:b8:71:bd:
f5:e2:a5:61:3b:e5:ed:ac:a4:b2:6e:54:8d:95:34:
dd:40:be:4b:e6:05:1b:c7:1e:d8:2a:8c:b9:19:fa:
bc:73:f8:23:13:d6:28:87:52:11:56:fe:05:d6:27:
bc:28:29:57:2d:f9:6f:7a:e4:ee:d2:d3:67:d3:ea:
b2:c2:6d:1b:cb:ba:4b:1a:b9:12:16:3f:0a:7d:e1:
83:89:12:9d:3b:03:e5:aa:1d:98:50:47:19:05:01:
cd:7f:e0:1f:f8:81:4a:b1:ce:99:e9:74:b1:81:9e:
ca:eb:a6:43:e6:b4:fe:f4:1c:48:15:c4:b3:82:68:
a5:e7:0f:b6:2f:82:69:d2:78:96:43:a3:72:bd:28:
44:24:f2:b7:c5:82:8b:71:77:e5:18:38:dc:f9:82:
7f:7d:38:70:d8:d1:3f:a6:66:3c:62:5a:bb:51:9c:
c6:5d:7c:38:ce:6d:77:7d:cc:80:b4:d8:77:79:46:
8b:8f:8a:57:f8:4a:0e:89:3b:42:f1:0f:0f:83:29:
28:7d
publicExponent: 65537 (0x10001)
privateExponent:
04:9e:80:73:73:4c:38:6f:b8:da:55:68:8c:a3:50:
de:e7:58:bb:4d:72:db:89:55:7c:fc:7a:ba:8c:fe:
34:1f:f5:2a:ba:94:31:df:1c:03:1b:ec:a6:d7:a7:
0a:37:72:5b:7e:29:cd:d6:e2:b3:2a:59:48:23:d8:
d6:fd:62:ea:eb:12:8e:70:20:7b:29:b9:7a:62:8c:
1e:7a:f7:48:e4:3c:96:c0:c7:cd:9a:7a:ce:21:80:
82:e5:4f:28:12:46:7f:41:79:2e:aa:a2:c1:da:1e:
d3:cd:82:63:c4:c0:11:ea:8d:f7:69:76:89:3b:3a:
c0:49:88:65:98:e1:22:c9:eb:3f:60:e3:44:6a:2d:
b3:d2:6b:5b:03:3c:69:fd:ee:21:fa:34:ac:37:8f:
6e:ee:f5:64:c5:6c:2d:70:a6:55:8d:3c:04:17:e5:
fb:60:ea:58:c9:87:42:81:39:db:25:d5:eb:b3:63:
d4:25:12:38:c9:a7:e9:a0:fd:4d:08:bf:30:3e:3a:
c0:e2:f0:9f:a8:cd:a0:bd:b1:6a:ae:bb:22:b1:7d:
e8:f2:f0:f0:06:69:7e:c1:a7:50:94:80:00:a1:fa:
bf:f9:14:51:73:a9:ce:0f:b8:d7:8b:b3:32:c8:f2:
8b:60:30:0c:2c:9c:7f:41:a2:d0:34:67:81:1e:7d:
61
prime1:
00:c7:05:67:36:47:db:b0:bc:62:e1:a4:6c:c7:b2:
a2:db:32:61:16:22:46:63:20:46:3c:00:f1:81:db:
fd:46:e3:ee:9d:5c:15:1b:45:2a:10:52:e1:8f:1a:
ee:82:ca:98:70:5b:1b:77:8d:ed:67:7c:12:dd:9e:
e6:20:b8:d0:58:06:04:6c:24:33:dd:e0:ea:91:c8:
32:3f:b6:24:7a:e4:42:74:ea:ca:d6:ce:86:6b:a9:
e6:bd:9b:b4:06:29:25:fe:fb:b9:08:2c:33:a4:91:
52:10:b2:c4:29:12:c1:60:7e:1f:8d:9b:46:5f:ab:
c0:4d:07:5d:54:74:f6:e4:11
prime2:
00:c3:2b:2c:0b:bb:00:70:d5:b1:ff:89:83:27:22:
0e:3c:8f:db:ca:96:be:1c:b4:31:57:08:1d:a8:c6:
7c:43:26:41:61:a0:10:46:14:6a:d4:4d:76:bf:8b:
c9:ca:ce:47:fd:69:8e:1f:a1:7e:0b:7c:0a:f8:39:
30:02:f5:56:56:46:21:78:70:95:f0:b8:2a:3b:b6:
bf:07:4c:b7:ea:92:66:7a:71:d0:4e:e0:4f:b8:ff:
89:79:0e:be:12:24:fb:04:76:ad:72:63:7c:10:29:
b8:b3:a2:cd:bf:45:c2:d2:5d:42:ea:d2:76:3d:f2:
a7:e1:ae:83:f0:9f:35:79:ad
exponent1:
56:80:a5:b4:b5:14:ea:c3:66:e3:16:39:65:ae:e2:
14:0d:d8:9e:eb:34:d6:be:df:68:13:2c:e5:39:7d:
e3:83:0c:62:7e:f4:79:8e:dd:52:8d:03:96:d4:a8:
d8:56:40:5d:8d:6b:e9:d1:d9:5f:02:51:9c:dc:04:
c0:32:33:f4:1e:61:6b:b3:6c:8b:c2:c7:91:a7:87:
17:a4:0e:45:0f:d3:46:c8:0a:73:c4:fe:2d:eb:81:
eb:e5:b2:20:7f:60:11:6c:cd:a6:9c:b7:b1:8e:ac:
31:af:d1:8c:dc:a7:0a:4e:a7:5e:40:20:1d:53:24:
59:16:9b:5d:2b:1d:68:51
exponent2:
00:93:8a:a7:99:96:9d:16:af:f6:08:40:64:ad:c8:
c9:0a:6f:96:b0:e8:94:80:0e:98:de:3a:7c:71:82:
db:9d:c7:e5:d5:6f:b3:dd:c6:c1:9c:0d:93:9f:ea:
85:7a:93:c7:48:83:eb:b5:6d:d8:63:c6:3a:64:bc:
96:d7:25:b1:47:37:6d:46:27:96:b2:8c:07:21:6d:
5d:ac:9f:0a:ca:82:32:86:8e:53:f3:cd:0f:77:c3:
76:a1:d5:cb:4a:dc:3a:07:7d:d0:51:91:73:d0:a4:
39:c5:53:66:47:1a:ed:d5:2a:3b:d4:59:96:99:ee:
3f:8c:14:ea:19:95:c2:4f:61
coefficient:
14:b8:7d:f9:65:90:6a:65:37:6e:41:04:d8:34:c6:
f3:91:0f:d6:d1:c8:a5:2f:70:28:b0:bb:38:46:d9:
3b:dd:9c:e9:71:e0:38:64:00:2e:e6:23:ff:7e:e4:
54:fc:33:45:ba:57:c2:36:19:34:d1:1d:47:f2:fc:
cb:f7:42:0f:fc:15:ca:68:48:1e:65:70:c1:fa:a9:
32:81:3f:79:45:dd:5f:5c:55:c0:ed:90:e6:9b:6e:
80:a6:47:27:12:e1:e1:80:80:5b:55:75:ac:19:bd:
0f:69:e4:95:3f:b9:f0:7c:d8:df:8c:ff:ba:21:f7:
e1:b5:26:df:a6:a9:80:9a
writing RSA key
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCXuq3EuzR3Ui1M
9JY2203vDFXLX4wiU32ByBAgz8m9bYHfrQ8iXKrv45HsPIwZCkY4ewB+AOG/Krhx
vfXipWE75e2spLJuVI2VNN1AvkvmBRvHHtgqjLkZ+rxz+CMT1iiHUhFW/gXWJ7wo
KVct+W965O7S02fT6rLCbRvLuksauRIWPwp94YOJEp07A+WqHZhQRxkFAc1/4B/4
gUqxzpnpdLGBnsrrpkPmtP70HEgVxLOCaKXnD7YvgmnSeJZDo3K9KEQk8rfFgotx
d+UYONz5gn99OHDY0T+mZjxiWrtRnMZdfDjObXd9zIC02Hd5RouPilf4Sg6JO0Lx
Dw+DKSh9AgMBAAECggEABJ6Ac3NMOG+42lVojKNQ3udYu01y24lVfPx6uoz+NB/1
KrqUMd8cAxvsptenCjdyW34pzdbisypZSCPY1v1i6usSjnAgeym5emKMHnr3SOQ8
lsDHzZp6ziGAguVPKBJGf0F5Lqqiwdoe082CY8TAEeqN92l2iTs6wEmIZZjhIsnr
P2DjRGots9JrWwM8af3uIfo0rDePbu71ZMVsLXCmVY08BBfl+2DqWMmHQoE52yXV
67Nj1CUSOMmn6aD9TQi/MD46wOLwn6jNoL2xaq67IrF96PLw8AZpfsGnUJSAAKH6
v/kUUXOpzg+414uzMsjyi2AwDCycf0Gi0DRngR59YQKBgQDHBWc2R9uwvGLhpGzH
sqLbMmEWIkZjIEY8APGB2/1G4+6dXBUbRSoQUuGPGu6CyphwWxt3je1nfBLdnuYg
uNBYBgRsJDPd4OqRyDI/tiR65EJ06srWzoZrqea9m7QGKSX++7kILDOkkVIQssQp
EsFgfh+Nm0Zfq8BNB11UdPbkEQKBgQDDKywLuwBw1bH/iYMnIg48j9vKlr4ctDFX
CB2oxnxDJkFhoBBGFGrUTXa/i8nKzkf9aY4foX4LfAr4OTAC9VZWRiF4cJXwuCo7
tr8HTLfqkmZ6cdBO4E+4/4l5Dr4SJPsEdq1yY3wQKbizos2/RcLSXULq0nY98qfh
roPwnzV5rQKBgFaApbS1FOrDZuMWOWWu4hQN2J7rNNa+32gTLOU5feODDGJ+9HmO
3VKNA5bUqNhWQF2Na+nR2V8CUZzcBMAyM/QeYWuzbIvCx5GnhxekDkUP00bICnPE
/i3rgevlsiB/YBFszaact7GOrDGv0YzcpwpOp15AIB1TJFkWm10rHWhRAoGBAJOK
p5mWnRav9ghAZK3IyQpvlrDolIAOmN46fHGC253H5dVvs93GwZwNk5/qhXqTx0iD
67Vt2GPGOmS8ltclsUc3bUYnlrKMByFtXayfCsqCMoaOU/PND3fDdqHVy0rcOgd9
0FGRc9CkOcVTZkca7dUqO9RZlpnuP4wU6hmVwk9hAoGAFLh9+WWQamU3bkEE2DTG
85EP1tHIpS9wKLC7OEbZO92c6XHgOGQALuYj/37kVPwzRbpXwjYZNNEdR/L8y/dC
D/wVymhIHmVwwfqpMoE/eUXdX1xVwO2Q5ptugKZHJxLh4YCAW1V1rBm9D2nklT+5
8HzY34z/uiH34bUm36apgJo=
-----END PRIVATE KEY-----
root@WSL:lab6_pliki>
===== Pytania =====
==== Jakie jest przeznaczenie parametrów: modulus, publicExponent, privateExponent, prime ? ====
* modulus (n):\\
Iloczyn dwóch dużych liczb pierwszych (p i q). Wspólny składnik klucza publicznego i prywatnego.\\
Używany w szyfrowaniu i deszyfrowaniu.
* publicExponent (e):\\
Wykładnik publiczny. Najczęściej ma wartość 65537.\\
Służy do szyfrowania wiadomości lub weryfikacji podpisu cyfrowego.
* privateExponent (d):\\
Wykładnik prywatny. Obliczany na podstawie e, p, i q.\\
Służy do odszyfrowywania wiadomości lub generowania podpisu cyfrowego.
* prime1 (p) i prime2 (q):\\
Dwie liczby pierwsze, na podstawie których tworzony jest modulus.\\
Służą do wewnętrznych obliczeń klucza prywatnego.
==== Które z parametrów mogą być publicznie dostępne (które są częścią klucza publicznego a które powinny być utrzymywane w tajemnicy (są częścią klucz prywatnego) ? ====
* **Publiczne (mogą być jawne, wchodzą w skład klucza publicznego):**
* modulus (n)
* publicExponent (e)
* **Prywatne (muszą być utrzymywane w tajemnicy):**
* privateExponent (d)
* prime1 (p)
* prime2 (q)
* oraz parametry pochodne, np. $d \mod (p-1)$, $d \mod (q-1)$, $q^{-1} \mod p$
====== Zadanie 2 ======
Zapisz i wykonaj polecenie dokonujące ekstrakcji publicznego klucza RSA z pliku rsa.key i zapisującego go w pliku rsa.pubkey oraz wyświetlenie jego zawar tości.
===== Realizacja =====
root@WSL:lab6_pliki> openssl rsa -in rsa.key -pubout -out rsa.pubkey
writing RSA key
root@WSL:lab6_pliki> openssl rsa -pubin -in rsa.pubkey -text
Public-Key: (2048 bit)
Modulus:
00:97:ba:ad:c4:bb:34:77:52:2d:4c:f4:96:36:db:
4d:ef:0c:55:cb:5f:8c:22:53:7d:81:c8:10:20:cf:
c9:bd:6d:81:df:ad:0f:22:5c:aa:ef:e3:91:ec:3c:
8c:19:0a:46:38:7b:00:7e:00:e1:bf:2a:b8:71:bd:
f5:e2:a5:61:3b:e5:ed:ac:a4:b2:6e:54:8d:95:34:
dd:40:be:4b:e6:05:1b:c7:1e:d8:2a:8c:b9:19:fa:
bc:73:f8:23:13:d6:28:87:52:11:56:fe:05:d6:27:
bc:28:29:57:2d:f9:6f:7a:e4:ee:d2:d3:67:d3:ea:
b2:c2:6d:1b:cb:ba:4b:1a:b9:12:16:3f:0a:7d:e1:
83:89:12:9d:3b:03:e5:aa:1d:98:50:47:19:05:01:
cd:7f:e0:1f:f8:81:4a:b1:ce:99:e9:74:b1:81:9e:
ca:eb:a6:43:e6:b4:fe:f4:1c:48:15:c4:b3:82:68:
a5:e7:0f:b6:2f:82:69:d2:78:96:43:a3:72:bd:28:
44:24:f2:b7:c5:82:8b:71:77:e5:18:38:dc:f9:82:
7f:7d:38:70:d8:d1:3f:a6:66:3c:62:5a:bb:51:9c:
c6:5d:7c:38:ce:6d:77:7d:cc:80:b4:d8:77:79:46:
8b:8f:8a:57:f8:4a:0e:89:3b:42:f1:0f:0f:83:29:
28:7d
Exponent: 65537 (0x10001)
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl7qtxLs0d1ItTPSWNttN
7wxVy1+MIlN9gcgQIM/JvW2B360PIlyq7+OR7DyMGQpGOHsAfgDhvyq4cb314qVh
O+XtrKSyblSNlTTdQL5L5gUbxx7YKoy5Gfq8c/gjE9Yoh1IRVv4F1ie8KClXLflv
euTu0tNn0+qywm0by7pLGrkSFj8KfeGDiRKdOwPlqh2YUEcZBQHNf+Af+IFKsc6Z
6XSxgZ7K66ZD5rT+9BxIFcSzgmil5w+2L4Jp0niWQ6NyvShEJPK3xYKLcXflGDjc
+YJ/fThw2NE/pmY8Ylq7UZzGXXw4zm13fcyAtNh3eUaLj4pX+EoOiTtC8Q8Pgyko
fQIDAQAB
-----END PUBLIC KEY-----
root@WSL:lab6_pliki> cat rsa.pubkey
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl7qtxLs0d1ItTPSWNttN
7wxVy1+MIlN9gcgQIM/JvW2B360PIlyq7+OR7DyMGQpGOHsAfgDhvyq4cb314qVh
O+XtrKSyblSNlTTdQL5L5gUbxx7YKoy5Gfq8c/gjE9Yoh1IRVv4F1ie8KClXLflv
euTu0tNn0+qywm0by7pLGrkSFj8KfeGDiRKdOwPlqh2YUEcZBQHNf+Af+IFKsc6Z
6XSxgZ7K66ZD5rT+9BxIFcSzgmil5w+2L4Jp0niWQ6NyvShEJPK3xYKLcXflGDjc
+YJ/fThw2NE/pmY8Ylq7UZzGXXw4zm13fcyAtNh3eUaLj4pX+EoOiTtC8Q8Pgyko
fQIDAQAB
-----END PUBLIC KEY-----
root@WSL:lab6_pliki>
====== Zadanie 3 ======
1. Przygotuj plik tekstowy z wiadomością np. “This is a confidential message” (Podpowiedź: należy użyć komendy pkeyutl i nazwać plik “plain”)\\
2. Napisz składnię polecenia openssl do zaszyfrowania wiadomości zawartej w pliku “plain”. Szyfrogram zapisz w pliku o nazwie “encRSA”. Podpowiedź: należy użyć komendy “pkeyutl”.\\
3. Napisz składnię komendy openssl używanej do odszyfrowania szyfrogramu z kroku nr 2\\
===== Realizacja =====
root@WSL:lab6_pliki> echo "This is a confidential message" > plain
root@WSL:lab6_pliki> openssl pkeyutl -encrypt -pubin -inkey rsa.pubkey -in plain -out encRSA
root@WSL:lab6_pliki> openssl pkeyutl -decrypt -inkey rsa.key -in encRSA -out decrypted.txt
root@WSL:lab6_pliki> hexdump -C encRSA
00000000 53 11 ca 10 6a b4 b3 b9 e3 51 c7 8c da 8c c0 6c |S...j....Q.....l|
00000010 c2 df 0e f6 7c 28 c2 62 4e 5c 02 08 76 d8 27 56 |....|(.bN\..v.`V|
00000020 64 ec b2 b5 83 8e 7c 58 b3 f2 15 6e c8 8e 44 fd |d.....|X...n..D.|
00000030 a4 40 6a 2c b4 b1 03 35 c8 b1 5c 4e f5 d8 3e d1 |.@j,...5..\N..>.|
00000040 68 47 a7 2a b5 bf a2 45 e0 7e de ca 5c e4 3f 99 |hG.*...E.~..\.?.|
00000050 82 9e 32 da 29 a1 e1 db 07 71 d9 7d da 06 e0 f1 |..2.)....q.}....|
00000060 6a 51 36 64 86 a8 ae 7d 9f 40 53 a3 61 5d fd 74 |jQ6d...}.@S.a].t|
00000070 f9 3f f6 e8 56 05 7b f8 fd 2a d6 9d ba e6 27 0a |.?..V.{..*....`.|
00000080 88 a7 c7 1f 44 f3 37 50 04 b6 15 8b d4 4f 2f d4 |....D.7P.....O/.|
00000090 df d4 9b ea 11 2a 0d 2b 18 13 fb 2a 2c 0c 2c e7 |.....*.+...*,.,.|
000000a0 a5 25 d1 e7 f4 49 7b a0 92 9e c2 b2 73 ea c6 f8 |.%...I{.....s...|
000000b0 cc 79 a7 73 39 34 fd ab 19 5b 28 e2 3a 1f 9e 8b |.y.s94...[(.:...|
000000c0 d3 df 35 f0 4c bd 09 82 89 ba 16 c7 8c 8f 09 12 |..5.L...........|
000000d0 98 53 02 ca 88 a5 be 1b cb 43 fa db f6 68 fb 28 |.S.......C...h.(|
000000e0 41 b7 34 ac 0e ad fd bc 1a 78 a8 bb 3c 5f 51 c3 |A.4......x..<_Q.|
000000f0 5d 65 ce 7a 60 e9 7c 00 22 37 a5 a2 64 64 e0 8f |]e.z`.|.``7..dd..|
00000100
root@WSL:lab6_pliki> hexdump -C decrypted.txt
00000000 54 68 69 73 20 69 73 20 61 20 63 6f 6e 66 69 64 |This is a confid|
00000010 65 6e 74 69 61 6c 20 6d 65 73 73 61 67 65 0a |ential message.|
0000001f
root@WSL:lab6_pliki>
====== Zadanie 4 ======
Napisz składnię polecenia openssl do stworzenia sygnatury (podpisu) pliku ’plain’ I zapisaniu jej w pliku o nazwie ’sig’. Podpowiedź: użyj polecenia “openssl pk yeutl”. Napisz składnię polecenia openssl do weryfikacji prawdziwości sygnatury zawartej w pliku ’sig’. Podpowiedź: po poprawnym wykonaniu na ekranie powinna pojawić się informacja: “Signautre Verified Successfully”. Podpowiedź: użyj polecenia “openssl pkyeutl”.
===== Realizacja =====
root@WSL:lab6_pliki> openssl pkeyutl -sign -inkey rsa.key -in plain -out sig
root@WSL:lab6_pliki> openssl pkeyutl -verify -pubin -inkey rsa.pubkey -in plain -sigfile sig
Signature Verified Successfully
root@WSL:lab6_pliki>
===== Pytania =====
==== Jakiego klucza należy użyć do poszczególnych operacji wykonanych w poleceniu nr 4 ? ====
* Podpisywanie (tworzenie sygnatury):\\
Należy użyć klucza prywatnego (rsa.key) – tylko właściciel klucza może podpisać dane.
* Weryfikacja podpisu:\\
Należy użyć klucza publicznego (rsa.pubkey) – każdy może sprawdzić autentyczność podpisu.
====== Zadanie 5 ======
Użytkownik maszyny A chce przesłać do użytkownika maszyny B wiadomość w sposób bezpieczny. W tym celu chce zaszyfrować wiadomość szyfrem symetrycznym, jednak użytkownik maszyny B nie dysponuje tajnym kluczem do odszyfrowania wiadomości. Zapisz składnię pol eceń I prawidłową sekwencję działań które powinny zostać wykonane przez użytkowników maszyn A i B. Następnie wykonaj te działania I sprawdź czy rzeczywiście przesłaną wiadomość udało si e odszyfrować użytkownikowi maszyny B. Podpowiedź: użyj poleceń “opens sl enc” oraz “openssl pkeyutl”.
===== Realizacja =====
#Generowanie klucza symetrycznego:
root@WSL:lab6_pliki> openssl rand -out secret.key 32
#Szyfrowanie wiadomości przy użyciu klucza symetrycznego:
root@WSL:lab6_pliki> openssl enc -aes-256-cbc -salt -in plain -out encMessage -pass file:./secret.key
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
#Szyfrowanie klucza symetrycznego za pomocą klucza publicznego użytkownika maszyny B:
root@WSL:lab6_pliki> openssl pkeyutl -encrypt -pubin -inkey rsa.pubkey -in secret.key -out encSecret.key
#Odszyfrowanie klucza symetrycznego przy użyciu klucza prywatnego:
root@WSL:lab6_pliki> openssl pkeyutl -decrypt -inkey rsa.key -in encSecret.key -out secret.key
#Odszyfrowanie wiadomości przy użyciu odszyfrowanego klucza symetrycznego:
root@WSL:lab6_pliki> openssl enc -d -aes-256-cbc -in encMessage -out decryptedMessage -pass file:./secret.key
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
root@WSL:lab6_pliki> cat plain
This is a confidential message
root@WSL:lab6_pliki> cat decryptedMessage
This is a confidential message
root@WSL:lab6_pliki> hexdump -C encMessage
00000000 53 61 6c 74 65 64 5f 5f c6 35 4f 2f aa 19 44 ff |Salted__.5O/..D.|
00000010 f8 e1 cf a5 eb 6d 65 d9 64 e8 5e e0 5f 3e 3e 34 |.....me.d.^._>>4|
00000020 ad f2 d0 0f c8 57 91 af b3 89 5f 6f 13 0b db 65 |.....W...._o...e|
00000030
root@WSL:lab6_pliki> hexdump -C encSecret.key
00000000 1e 99 ed 85 4a c0 c4 55 d4 34 8d 52 5d 7b 0d ba |....J..U.4.R]{..|
00000010 c9 a9 f4 2b 4a 87 f2 11 e7 a8 26 ea ad d9 b4 a6 |...+J.....&.....|
00000020 5a 61 21 22 6f dc a3 be 14 b4 68 c0 a8 f9 54 16 |Za!``o.....h...T.|
00000030 98 8f a1 46 6d 39 8f c1 58 8d 85 27 ef fc b5 e7 |...Fm9..X..`....|
00000040 bc 24 80 62 df d1 0d 3a 43 45 6d 41 9f 90 b6 58 |.$.b...:CEmA...X|
00000050 39 b5 7a 39 2f de 88 a7 89 8a e7 4c af 8f 7a 2d |9.z9/......L..z-|
00000060 ea 45 a7 f2 88 9b 96 78 a1 d0 a2 a6 36 31 15 d3 |.E.....x....61..|
00000070 99 7f 44 a5 a1 db 83 56 d5 c7 90 4e 12 18 75 fc |..D....V...N..u.|
00000080 53 cc e8 45 c3 94 f5 4c 72 4e ff 96 1f 99 40 a4 |S..E...LrN....@.|
00000090 86 fa 17 71 cf df 62 1e e5 e7 c6 c4 a9 01 ed 33 |...q..b........3|
000000a0 60 67 73 46 86 d2 a3 73 91 c1 3a 9e 6d 30 60 f6 |`gsF...s..:.m0`.|
000000b0 2a 0c ea a8 28 d2 76 14 c5 d4 25 a0 b7 85 8d 27 |*...(.v...%....`|
000000c0 31 bf 83 7d 0b 1e be ab 2e c9 88 91 68 e1 11 73 |1..}........h..s|
000000d0 b5 f8 2b 1f 89 fa 88 85 8b 8f 95 9d 0d 9c dc 55 |..+............U|
000000e0 77 2b e5 8f 4e c7 7b 4b 38 ff d8 47 b1 08 60 a8 |w+..N.{K8..G..`.|
000000f0 a2 44 09 db ef e3 68 f8 04 63 73 d0 db 2e 92 c8 |.D....h..cs.....|
00000100
root@WSL:lab6_pliki>
====== Zadanie 6 ======
Użytkownik maszyny A chce przesłać do użytkownika maszyny B wiadomość z zachowaniem jej integralności. Zapisz składnię poleceń oraz prawidłową sekwencję działań, które powinny zostać wykonan e przez użytkowników maszyn A i B. Następnie wykonaj te działania i sprawdź czy rzeczywiście użytkownikowi maszyny B udało się potwierdzić integralność odebranej wiadomości. Polecenie wykonaj w dwóch wariantach: 1) używając poleceń “openssl pkeyutl”, 2) uż ywając poleceń “openssl dgst”.
===== Realizacja wariant 1 =====
root@WSL:lab6_pliki> openssl pkeyutl -sign -inkey rsa.key -in plain -out sig
root@WSL:lab6_pliki> openssl pkeyutl -verify -inkey rsa.pubkey -in plain -sigfile sig
Signature Verified Successfully
===== Realizacja wariant 2 =====
root@WSL:lab6_pliki> openssl dgst -sha256 -sign rsa.key -out sig plain
root@WSL:lab6_pliki> openssl dgst -sha256 -verify rsa.pubkey -signature sig plain
Verified OK
===== Pytania =====
==== Co się stanie jeżeli atakujący zmodyfikuje dane wysłane przez użytkownika maszyny A do użytkownika maszyny B (rozważ dwie sytuacje: a) zmodyfikowane zostaną dane ale nie sygnatura, b) zmodyfikowana zostanie sygnatura ale nie dane) ? Odpowiedź uzasadnij. ====
* **Zmodyfikowane dane, ale nie sygnatura:**\\
Jeśli atakujący zmodyfikuje dane (np. wiadomość w pliku plain), ale nie zmodyfikuje sygnatury, wówczas weryfikacja podpisu przez użytkownika maszyny B zakończy się niepowodzeniem, ponieważ podpis został wygenerowany na oryginalnej treści, a zmodyfikowana treść nie zgadza się z podpisem. Otrzyma komunikat o błędzie.
* **Zmodyfikowana sygnatura, ale nie dane:**\\
Jeśli atakujący zmodyfikuje tylko sygnaturę, ale nie zmieni danych, wówczas weryfikacja podpisu zakończy się niepowodzeniem, ponieważ zmieniony podpis nie będzie pasował do oryginalnych danych. Użytkownik maszyny B nie będzie w stanie zweryfikować poprawności podpisu.
==== Co się stanie gdy atakujący podmieni klucz publiczny użytkownika maszyny B na swój ? Czy w tej sytuacji atakujący może zamienić oryginalne dane i sygnaturę ? Jaki będzie wynik weryfikacji poprawności sygnatury ? Odpowiedź uzasadnij. ====
* Jeśli atakujący podmieni klucz publiczny użytkownika maszyny B na swój własny klucz publiczny, wówczas, pomimo że użytkownik maszyny A może podpisać wiadomość poprawnie, użytkownik maszyny B nie będzie w stanie zweryfikować podpisu, ponieważ użyje klucza publicznego atakującego, a nie właściwego klucza publicznego użytkownika maszyny B.
* Weryfikacja zawsze zakończy się niepowodzeniem, ponieważ atakujący nie zna klucza prywatnego użytkownika maszyny B, więc nie będzie mógł wygenerować prawidłowej sygnatury pasującej do oryginalnych danych.
* W wyniku weryfikacji podpisu przez atakującego, który będzie używał swojego klucza publicznego, zawsze będzie otrzymywał komunikat o błędzie — podpis nie będzie pasować do danych.
====== Zadanie 7 ======
1. U ż ytkownik maszyny A wysyła swój klucz publiczny użytkownikowi maszyny B\\
2. U ż yt k ownik maszyny B generuje losowy ciąg znaków I zapisuje go w pliku o nazwie “random”. N astępnie szyfruje go kluczem publicznym użytkownika maszyny A (otrzymany w kroku nr 1). Wynik zapisuje w pliku o nazwie “challenge”. Zapisz składnię polecenia koniecznego do wykonania tego kroku (szyfrowania). Wykorzystaj komendy openssl: rand i pkeyutl.\\
3. U żytkownik maszyny B wysyła plik “challenge” do użytkownika maszyny A.\\
4. Użytkownik maszyny A odszyfrowuje wiadomość zapisaną w pliku “challenge” a następnie tekst jawny odsyła użytkownikowi maszyny B (napisz składnię polecenia do odszyfrowania wiadomości). Odszyfrowaną wiadomość z pliku challenge zapisz w pliku o nazwie “response”.\\
5. Użytkownik maszyny B porównuje wiadomość oryginalną oraz odpowiedź (response) na challenge odebraną od użytkownika maszyny A. Do porównania można użyć polecenia “diff b”\\
===== Realizacja =====
root@WSL:lab6_pliki> #polecenia sa udawane gdyz cwiczenie jest robione na jednej maszynie ale nie zmienia to wnioskow oraz przbiegu cwiczenia
root@WSL:lab6_pliki> #scp rsa.pubkey userB@machineB:/home/userB/
root@WSL:lab6_pliki> openssl rand -out random 32
root@WSL:lab6_pliki> openssl pkeyutl -encrypt -pubin -inkey rsa.pubkey -in random -out challenge
root@WSL:lab6_pliki> #scp challenge userA@machineA:/home/userA/
root@WSL:lab6_pliki> openssl pkeyutl -decrypt -inkey rsa.key -in challenge -out response
root@WSL:lab6_pliki> diff random response
root@WSL:lab6_pliki>
===== Pytania =====
==== Zakładając poprawność (autentyczność) kluczy podaj jakie widzisz jakie słabości w protokole “challenge response” opisanym powyżej. ====
- **Brak uwierzytelniania klucza publicznego:**\\
Klucz publiczny użytkownika maszyny A jest przekazywany bez żadnej weryfikacji. Jeśli atakujący przechwyci ten klucz, może go podmienić na swój klucz publiczny. W takim przypadku użytkownik maszyny B zaszyfruje swoje dane za pomocą klucza publicznego atakującego, co pozwala mu na odszyfrowanie wiadomości przez atakującego, a nie przez prawdziwego użytkownika maszyny A.
- **Brak użycia certyfikatów:**\\
Klucz publiczny użytkownika A nie jest weryfikowany przez zaufaną stronę trzecią (np. w systemie opartym na certyfikatach). Może to prowadzić do ataku typu „man-in-the-middle”, gdzie atakujący może przechwycić komunikację i podmienić klucz publiczny, uniemożliwiając prawidłową weryfikację.
- **Brak mechanizmu sprawdzania integralności:**\\
Protokół nie zapewnia żadnej formy sprawdzania integralności przesyłanych danych. Jeśli wiadomości zostaną zmodyfikowane po wysłaniu przez użytkownika maszyny A, użytkownik maszyny B nie będzie w stanie wykryć, że dane zostały zmienione, ponieważ nie ma żadnej formy hashowania lub podpisywania wiadomości.
==== Jakie są możliwe rozwiązania ? ====
- **Weryfikacja klucza publicznego:**\\
Zamiast przesyłać klucz publiczny bezpośrednio, użytkownik maszyny A może wysłać swój klucz publiczny przez zaufaną stronę trzecią (np. serwer certyfikatów). Dzięki temu użytkownik maszyny B może upewnić się, że klucz publiczny pochodzi rzeczywiście od użytkownika maszyny A. Można również użyć protokołów takich jak TLS, aby zapewnić, że komunikacja między maszynami jest szyfrowana i chroniona przed podsłuchiwaniem.
- **Podpisy cyfrowe dla kluczy publicznych:**\\
Można użyć podpisów cyfrowych, aby upewnić się, że klucz publiczny użytkownika maszyny A jest autentyczny i pochodzi z wiarygodnego źródła. Użytkownik maszyny B może wtedy zweryfikować podpis, aby upewnić się, że klucz publiczny jest autentyczny.
- **Wykorzystanie certyfikatów:**\\
Używanie certyfikatów X.509 do podpisania kluczy publicznych oraz weryfikacji to dobra praktyka w przypadku takich protokołów. Certyfikat można zweryfikować przy użyciu wbudowanych zaufanych urzędów certyfikacji (CA), co daje pewność, że klucz publiczny należy do odpowiedniego użytkownika.
- **Zastosowanie funkcji skrótu i podpisu:**\\
Aby zapewnić integralność wiadomości, warto zastosować funkcję skrótu (np. SHA-256) i podpisać wiadomość przed jej wysłaniem. Użytkownik maszyny B mógłby wtedy porównać podpisaną wiadomość z jej wersją po odszyfrowaniu. To pozwala upewnić się, że wiadomość nie została zmodyfikowana w trakcie transmisji.
- **Użycie bezpiecznego kanału komunikacji:**\\
Warto rozważyć użycie bezpiecznego kanału komunikacji, jak np. TLS, w celu wymiany kluczy publicznych oraz zapewnienia prywatności i integralności danych.