Sprawdź się
Zadanie 3. Jubiler
Pan Srebrny prowadzi firmę jubilerską zajmującą się produkcją naszyjników i pierścionków z najwyższej klasy surowców. Typy wyrobów oznaczane są liczbami od 1 do 9, a każda liczba oznaczająca typ wyrobu szyfrowana jest z użyciem algorytmu RSA.
Aby pan Srebrny mógł przeprowadzić spis utworzonych produktów, udostępniono mu dwie liczby pierwsze: p
i q
, na podstawie których wyznaczono klucz prywatny i klucz publiczny szyfru. Liczba p
wynosi 3, a liczba q
wynosi 7.
Zaszyfrowane liczby będące oznaczeniami produktów zapisane są w pliku bizuteria.txt
, każda liczba w osobnym wierszu.
Plik bizuteria.txt
zawiera 500 wierszy zawierających liczby naturalne z przedziału . Każda liczba to zaszyfrowane oznaczenie produktu.
Wyznacz klucz prywatny na podstawie podanych liczb pierwszych oraz sprawdź, ile zostało wyprodukowanych wyrobów o oznaczeniach 2 i 5. Zapisz te wartości (dwie liczby stanowiące klucz prywatny, liczbę wyprodukowanych produktów o oznaczeniach 2, liczbę wyprodukowanych produktów o oznaczeniach 5) w pliku wyniki.txt
, rozdzielając je pojedynczym znakiem odstępu.
Dla danych:
7
12
16
11
16
1
17
1
12
12
oraz:
p = 3
q = 7
plik wynikowy miałby następującą postać:
5 21 1 1
Napisz program, który wyznaczy klucz prywatny z użyciem podanych liczb pierwszych, a następnie wypisze, ile produktów z oznaczeniami 2 i 5 znajdowało się na liście.
Do oceny oddajesz:
plik
wyniki.txt
zawierający odpowiedź (cztery liczby naturalne oddzielone od siebie spacją; dwie pierwsze liczby to klucz prywatny; dwie kolejne to liczba wystąpień produktów o podanych numerach porządkowych),plik(i) z komputerową realizacją zadania (kodem programu).
Plik wejściowy bizuteria.txt
zawierający zaszyfrowane oznaczenia produktów znajduje się w załączniku:
bizuteria.txt
.Napisz program w wybranym języku programowania, a następnie sprawdź poprawność jego działania dla danych podanych w pliku bizuteria.txt
.
Odpowiedź do zadania dla pliku bizuteria.txt
znajduje się pod sekcją ćwiczeń.
Przetestuj działanie programu dla następujących produktów:
7, 12, 16, 11, 16, 1, 17, 1, 12, 12, 11, 11, 11, 18, 6, 8, 17, 16, 17, 17, 18, 18, 12, 16, 12
oraz wartości liczb pierwszych p = 3
i q = 7
. Oblicz, ile zostało wyprodukowanych produktów o oznaczeniach 2 oraz 5.
JĘZYK C++
#include <iostream>
#include <cmath>
using namespace std;
unsigned long long rozszyfruj(int d, int n, int W) {
return (unsigned long long)pow(W, d) % n;
}
int funkcjaEulera(int p, int q) {
return (p - 1) * (q - 1);
}
int odwrotnoscModulo(int e, int p, int q) {
int a = e;
int b = funkcjaEulera(p, q);
int c = 1;
int d = 0;
int pom;
while(a != 0) {
if( a < b ){
pom = a;
a = b;
b = pom;
pom = c;
c = d;
d = pom;
}
pom = a / b;
c -= pom * d;
a -= pom * b;
}
if( b == 1 ) {
if( d < 0 )
d += funkcjaEulera(p, q);
return d;
}
}
int NWD(int x, int y) {
while(x != y) {
if(x > y)
x -= y;
else
y -= x;
}
return x;
}
int wyznaczE(int p, int q) {
int euler = funkcjaEulera(p, q);
for(int i = 2; i < (euler - 1); i++) {
if(NWD(i, euler) == 1)
return i;
}
}
int main() {
int Bizuteria[] = {7, 12, 16, 11, 16, 1, 17, 1, 12, 12, 11, 11, 11, 18, 6, 8, 17, 16, 17, 17, 18, 18, 12, 16};
int dlugoscListy = sizeof(Bizuteria)/sizeof(Bizuteria[0]);
int p = 3;
int q = 7;
int n = p * q;
int e = wyznaczE(p, q);
int d = odwrotnoscModulo(e, p, q);
unsigned long long pomocnicza;
int ile2 = 0;
int ile5 = 0;
for(int i = 0; i < dlugoscListy; i++){
pomocnicza = rozszyfruj(d, n, Bizuteria[i]);
if(pomocnicza == 2)
ile2++;
if(pomocnicza == 5)
ile5++;
}
cout << d << " " << n << " " << ile2 << " " << ile5;
return 0;
}
JĘZYK JAVA
public class Main {
static long rozszyfruj(int d, int n, int W) {
return (long)Math.pow(W, d) % n;
}
static int funkcjaEulera(int p, int q) {
return (p - 1) * (q - 1);
}
static int odwrotnoscModulo(int e, int p, int q) {
int a = e;
int b = funkcjaEulera(p, q);
int c = 1;
int d = 0;
int pom;
while(a != 0) {
if( a < b ) {
pom = a;
a = b;
b = pom;
pom = c;
c = d;
d = pom;
}
pom = a / b;
c -= pom * d;
a -= pom * b;
}
if( b == 1 ) {
if( d < 0 )
d += funkcjaEulera(p, q);
return d;
}
return 0;
}
static int NWD(int x, int y) {
while(x != y) {
if(x > y)
x -= y;
else
y -= x;
}
return x;
}
static int wyznaczE(int p, int q) {
int euler = funkcjaEulera(p, q);
for(int i = 2; i < (euler - 1); i++) {
if(NWD(i, euler) == 1)
return i;
}
return 0;
}
public static void main(String[] args) {
int[] Bizuteria = {7, 12, 16, 11, 16, 1, 17, 1, 12, 12, 11, 11, 11, 18, 6, 8, 17, 16, 17, 17, 18, 18, 12, 16, 12};
int dlugoscListy = Bizuteria.length;
int p = 3;
int q = 7;
int n = p * q;
int e = wyznaczE(p, q);
int d = odwrotnoscModulo(e, p, q);
long pomocnicza;
int ile2 = 0;
int ile5 = 0;
for(int i = 0; i < dlugoscListy; i++){
pomocnicza = rozszyfruj(d, n, Bizuteria[i]);
if(pomocnicza == 2)
ile2++;
if(pomocnicza == 5)
ile5++;
}
System.out.println(d + " " + n + " " + ile2 + " " + ile5);
}
}
JĘZYK PYTHON
def rozszyfruj(d, n, W):
return (W ** d) % n
def funkcjaEulera(p, q):
return (p - 1) * (q - 1)
def odwrotnoscModulo(e, p, q):
a, b, c, d = e, funkcjaEulera(p, q), 1, 0
while a != 0:
if a < b:
a, b = b, a
c, d = d, c
pom = int(a / b)
c -= pom * d
a -= pom * b
if b == 1:
if d < 0:
d += funkcjaEulera(p, q)
return d
def NWD(x, y):
while y:
x, y = y, x % y
return x
def wyznaczE(p, q):
euler = funkcjaEulera(p, q)
for i in range(2, euler - 1):
if NWD(i, euler) == 1:
return i
Bizuteria = [7, 12, 16, 11, 16, 1, 17, 1, 12, 12, 11, 11, 11, 18, 6, 8, 17, 16, 17, 17, 18, 18, 12, 16, 12]
dlugoscListy = len(Bizuteria)
p, q = 3, 7
n = p * q
e = wyznaczE(p, q)
d = odwrotnoscModulo(e, p, q)
ile2, ile5 = 0, 0
for i in range(dlugoscListy):
pom = int(Bizuteria[i])
if rozszyfruj(d, n, Bizuteria[i]) == 2:
ile2 += 1
if rozszyfruj(d, n, Bizuteria[i]) == 5:
ile5 += 1
print(d, " ", n, " ", ile2, " ", ile5, end="", sep="")
Odpowiedź
Odpowiedź do zadania dla danych zawartych w pliku bizuteria.txt
:
Przycisk do pobrania pliku TXT z wynikiem zadania. Pobierz załącznik
odpowiedzi.txt
.