Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
04/07/09 20:09
itAndy90
Ciao a tutti
avendo portato nella tesina un'analisi dell'algoritmo RSA, volevo affiancargli un software in VB che calcolasse gli esponenti pubblici e privati. Una cosa molto semplice eh, se pensate che sceglie i numeri primi tra soli 10 e per di più molto piccoli...

Il problema si presenta durante il calcolo dell'ultimo esponente: se faccio partire il calcolo degli esponenti con quella parte di codice "attiva", il programma va in crash e non risponde (i test sono fatti con il debug, e cosa strana NON MI SEGNALA PROBLEMI :-|). Se levo la parte relativa all'ultimo esponente, il programma va in run senza presentare problemi, calcolando quindi l'unico esponente che gli viene richiesto. Spero mi possiate dare una mano, perchè ci terrei a portarlo =). Ecco il codice:

Public Class Form1
    Function MCD(ByVal a As Integer, ByVal b As Integer) As Integer
        Dim m As Double
        If b = 0 Then Return a Else 
        Do
            m = a Mod b
            a = b
            b = m
        Loop Until b = 0
        Return a
    End Function

    Private Sub calcola_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles calcola.Click
        Dim ncas As Single
        Dim p, q As Integer
        Dim vtprimi(9), n, pvt, z As Integer
        Dim pub As Single

        vtprimi(0) = 29
        vtprimi(1) = 31
        vtprimi(2) = 37
        vtprimi(3) = 41
        vtprimi(4) = 43
        vtprimi(5) = 47
        vtprimi(6) = 53
        vtprimi(7) = 59
        vtprimi(8) = 61
        vtprimi(9) = 67

        Randomize()
        ncas = Rnd()
        Select Case ncas
            Case 0 To 0.099999999
                p = vtprimi(0)
            Case 0.1 To 0.199999999
                p = vtprimi(1)
            Case 0.2 To 0.299999999
                p = vtprimi(2)
            Case 0.3 To 0.399999999
                p = vtprimi(3)
            Case 0.4 To 0.499999999
                p = vtprimi(4)
            Case 0.5 To 0.599999999
                p = vtprimi(5)
            Case 0.6 To 0.699999999
                p = vtprimi(6)
            Case 0.7 To 0.799999999
                p = vtprimi(7)
            Case 0.8 To 0.899999999
                p = vtprimi(8)
            Case 0.9 To 1
                p = vtprimi(9)
        End Select
        form_p.Text = p

        ncas = Rnd()
        Select Case ncas
            Case 0 To 0.099999999
                q = vtprimi(0)
            Case 0.1 To 0.199999999
                q = vtprimi(1)
            Case 0.2 To 0.299999999
                q = vtprimi(2)
            Case 0.3 To 0.399999999
                q = vtprimi(3)
            Case 0.4 To 0.499999999
                q = vtprimi(4)
            Case 0.5 To 0.599999999
                q = vtprimi(5)
            Case 0.6 To 0.699999999
                q = vtprimi(6)
            Case 0.7 To 0.799999999
                q = vtprimi(7)
            Case 0.8 To 0.899999999
                q = vtprimi(8)
            Case 0.9 To 1
                q = vtprimi(9)
        End Select
        form_q.Text = q
        n = p * q
        form_n.Text = n

        z = (p - 1) * (q - 1)
        pvt = 2
        Do While (MCD(z, pvt) <> 1)
            pvt = pvt + 1
        Loop
        form_pvtexp.Text = pvt
        pub = 1
        Do While ((pub * pvt) Mod z) <> 1
            pub = pub + 1
        Loop
        form_pubexp.Text = pub
    End Sub
End Class


La funzione MCD serve per il calcolo del massimo comun divisore, utile per vedere se due numeri sono coprimi tra loro. Grazie in anticipo a tutti per le eventuali risposte:k:
Ultima modifica effettuata da itAndy90 06/07/09 14:08
aaa
04/07/09 20:48
Jeremy
Ciao.
Non chiedermi perchè .... ma il problema è che ti sei dimenticato di valorizzare la variabile pvt, pertanto, rimanendo sempre uguale a 0, il ciclo
Do While ((pub * pvt) Mod z) <> 1
pub = pub + 1
Loop

risulta infinito (perchè la funzione non restituirà mai un valore diverso da 0) ... mandando in OverFlow la variabile pub.

Facci sapere....
Ciao
aaa
04/07/09 21:21
itAndy90
Postato originariamente da Jeremy:

Ciao.
Non chiedermi perchè .... ma il problema è che ti sei dimenticato di valorizzare la variabile pvt, pertanto, rimanendo sempre uguale a 0, il ciclo
Do While ((pub * pvt) Mod z) <> 1
pub = pub + 1
Loop

risulta infinito (perchè la funzione non restituirà mai un valore diverso da 0) ... mandando in OverFlow la variabile pub.

Facci sapere....
Ciao

Grazie Jeremy
in effetti modificando il programma in cerca dell'errore devo aver combinato un bel casino, confondendo le variabili pub e pvt. Ho corretto nel sorgente, ma si presenta un'altro problema: l'esponente pubblico mi risulta identico a quello privato... :d

Tra l'altro, per evitare eventuali problemi di overflow, ho abbassato i valori primi nel vettore... ma ovviamente il problema dei valori pubblici e privati persiste
Ultima modifica effettuata da itAndy90 04/07/09 21:24
aaa
05/07/09 6:52
Jeremy
Ciao.
A dire il vero ... io, di calcolo degli esponenti RSA ..... non ci capisco un emerito ***** :rofl: .....il primo errore l'ho trovato copiando ed incollando il tuo codice in un progetto nuovo e facendone il Debug .... pertanto, se ci mostri il nuovo codice, magari potrei fare la stessa cosa .... stasera quando torno.

Facci sapere...
Ciao:D
aaa
05/07/09 11:07
itAndy90
Postato originariamente da Jeremy:

Ciao.
A dire il vero ... io, di calcolo degli esponenti RSA ..... non ci capisco un emerito ***** :rofl: .....il primo errore l'ho trovato copiando ed incollando il tuo codice in un progetto nuovo e facendone il Debug .... pertanto, se ci mostri il nuovo codice, magari potrei fare la stessa cosa .... stasera quando torno.

Facci sapere...
Ciao:D

Grazie ^___^
Il codice l'ho aggiornato nel primo post con le correzioni opportune. Guarda, pare una cosa difficilissima in realtà le operazioni da fare per calcolare gli esponenti sono poche e sempici:
Calcolare gli esponenti:
1. Si prendono due numeri primi, che chiameremo p e q
2. Si esegue il prodotto n = p * q che chiameremo modulo
3. Si calcola z = (np1 - 1)(np2 - 1)
4. Si calcola il numero pvt tale che pub sia primo rispetto a z (non devono avere fattori primi in comune) chiamato esponente pubblico
5. Si calcola il numero pub tale che (pvt * pub) mod z = 1

(pvt*pub) mod z = 1 sarebbe il resto della divisione tra (pub*pvt) e z che deve essere appunto uguale ad 1. Te lo dico non per nulla, ma perchè io da emerito tortello non capivo cosa significasse xD
aaa
05/07/09 12:07
Il Totem
Function MCD(ByVal a As Integer, ByVal b As Integer) As Integer
        Dim m As Double
        If b = 0 Then Return a Else 
        Do
            m = a Mod b
            a = b
            b = m
        Loop Until b = 0
        Return a
    End Function
'...
        z = (p - 1) * (q - 1)
        pvt = z
        Do While (MCD(z, pvt) <> 1)
            pvt = pvt - 1
        Loop
        form_pvtexp.Text = pvt
        pub = 1
        Do While ((pub * pvt) Mod z) <> 1
            pub = pub + 1
        Loop
        '...

Credo che l'errore sia qui. Infatti, se tu parti da pvt=z, la funzione MCD(z,z) restituisce z, che in effetti è il massimo comune divisore tra i due parametri identifici. Perciò risulta che qualsiasi prodotto di un numero intero per pvt è sempre divisibile per z, quindi l'espressione ((pub*pvt) Mod z) è sempre uguale a 0, e il programma va in loop.
Ultima modifica effettuata da Il Totem 05/07/09 12:07
aaa
05/07/09 18:42
itAndy90
Postato originariamente da Il Totem:

Function MCD(ByVal a As Integer, ByVal b As Integer) As Integer
        Dim m As Double
        If b = 0 Then Return a Else 
        Do
            m = a Mod b
            a = b
            b = m
        Loop Until b = 0
        Return a
    End Function
'...
        z = (p - 1) * (q - 1)
        pvt = z
        Do While (MCD(z, pvt) <> 1)
            pvt = pvt - 1
        Loop
        form_pvtexp.Text = pvt
        pub = 1
        Do While ((pub * pvt) Mod z) <> 1
            pub = pub + 1
        Loop
        '...

Credo che l'errore sia qui. Infatti, se tu parti da pvt=z, la funzione MCD(z,z) restituisce z, che in effetti è il massimo comune divisore tra i due parametri identifici. Perciò risulta che qualsiasi prodotto di un numero intero per pvt è sempre divisibile per z, quindi l'espressione ((pub*pvt) Mod z) è sempre uguale a 0, e il programma va in loop.

Cacchio Totem, hai ragione. Sto stress da esami mi sta friggendo il cervello :rofl: Potrei provare partendo da pvt = z - 1... Vi faccio sapere tra poco... L'unico problema è capire se poi effettivamente i valori che mi calcola sono esatti o meno... 8-|

EDIT: Ok, il cervello mi si sta bruciando davvero. Allora, in effetti Totem il discorso che fai è giusto, ma anche quella parte di programma. I due numeri devono essere coprimi e l'esponente privato deve essere più piccolo del modulo. Ho fatto delle prove e la variabile pvt è sempre più piccolo di z (quindi non è uguale)... Il problema sono strasicuro che sia nell'ultimo blocco del programma, perchè la variabile pub parte da 1 ed arriva fino allo stesso valore di pvt... Adesso come adesso il programma non mi va in loop, ma i due esponenti hanno valore sempre identico (e mi sembra impossibile). Può darsi che l'utilizzo di numeri molto piccoli rispetto a quelli raccomandati provochi questo problema?
Ultima modifica effettuata da itAndy90 05/07/09 19:00
aaa
05/07/09 19:43
itAndy90
Scusate se posto due volte di fila, ma è per evitare di fare troppo casino in un post solo. Allora, il problema dove dice Totem ci sta... ma non capisco perchè entra nel ciclo una sola volta (l'exp privato è sempre uguale a z - 1...

Per quello che riguarda l'esponente pubblico, credo che dipenda dall'errore precedente. Voi avete qualche soluzione? Perchè io inizio a capirci davvero poco. Tra l'altro, l'exp. pubblico risulta uguale al privato semplicemente perchè è il privato a non essere un numero conforme alle regole dell'algoritmo, di conseguenza l'exp pubblico non può più essere un intero, ma sarà un decimale (risultava uguale perchè pvt = pub era l'unico caso in cui veniva soddisfatta la condizione di uscita del ciclo).

Sarebbe un peccato non presentare sto programmino, mi darebbe una mano a prendere uno schifosissimo 80:yup:
Ultima modifica effettuata da itAndy90 05/07/09 19:46
aaa