Programma di criptazione/decriptazione

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
facciamo il punto e se siete con me possiamo veramente riportare la discussione su dei buoni livelli. Mi sono state chieste diverse cose su questo algoritmo come per esempio se sono sicuro che i divisori sono numeri primi, se il programma non presenta falle di gestione dei dati che potrebbero essere persi. Io non sono così stupido da mettere a repentaglio la mia immagine e il mio nome andando a presentare una cosa di cui non sono sicuro. Per questo motivo vi chiedo di provare il programma avendo espresso molti dubbi sulla mia parola. Se non volete provare il mio di programma provate a farlo voi ma con le mie indicazioni altrimenti è inutile parlare di questo argomento. Ho provato a postare il programma test ma è stato subito bannato come spazzatura. Eppure a me funziona e da l'idea di come vengono creati e distribuiti questi semiprimi. Io non ho un computer difettoso e se funziona per me funziona anche per voi. Non siate subito lapidari senza almeno averci ragionato un po' sopra
 
Ultima modifica:
Come poi detto dal collega @BAT anche un semplice ciclo FOR non rende piu l'operazione O(1), ma diventa logaritmica o esponenziale in base alle casistiche dell'algoritmo.
Ma perchè devo accettare queste critiche che non tengono conto poi delle spiegazioni che do. Nell'output del programma test compare un numero che è sempre a zero, questo vuol dire che il semiprimo è stato fattorizzato senza usare il ciclo for. Perchè ho messo 10? perchè è un test e come test mi deve dire se mi posso fidare del campo che ho inserito. Comparisse 1 o più di 1 abbasserei il campo. Perchè non ragionate un po prima di postare

Si hai ragione, ero alle prime sperimentazioni e cercavo conferme e aiuto da gente che ne sapesse più di me, ma purtroppo ho sempre incontrato gente come te
 
Ma perchè devo accettare queste critiche che non tengono conto poi delle spiegazioni che do. Nell'output del programma test compare un numero che è sempre a zero, questo vuol dire che il semiprimo è stato fattorizzato senza usare il ciclo for. Perchè ho messo 10? perchè è un test e come test mi deve dire se mi posso fidare del campo che ho inserito. Comparisse 1 o più di 1 abbasserei il campo. Perchè non ragionate un po prima di postare
Ma come fai a definire cio una critica?

Ma hai fatto informatica? hai studiato ALGORITMI e STRUTTURE DATI ?
Cioè quello che ti sto dicendo non lo dico io, lo dice il corso di Algoritmi e Strutture dati quando spiega la complessità.
La complessità lineare è quando c'è O(1).
Un operazione esegue un DO WHILE; UN FOR LOOP etc, non può mai essere LINEARE.

cioè tu sostieni il contrario come è posssibile?
 
Un operazione esegue un DO WHILE; UN FOR LOOP etc, non può mai essere LINEARE.
Ok, togli il ciclo for e otterrai lo stesso risultato

a=n mod(chiave)
b=n-a
gcd(a,b)

Hai capito no che è un programma test?

Ma voglio essere più diretto. Nei miei programmi metto sempre per sicurezza questo ciclo anche se non viene usato e lo faccio per una questione molto semplice. Nel caso capitasse un semiprimo anomalo il programma mi avviserebbe che il testo non è stato possibile criptarlo, mai successo ma è una sicurezza.. Questo proprio per evitare che in fase di decriptazione il programma incontri una anomalia
 
Ho provato a postare il programma test ma è stato subito bannato come spazzatura.

Beh io ho fatto alcune prove con il tuo programma test e qualcosa non mi torna, il programma test dovrebbe trovare un semiprimo in un range casuale partendo (e non capisco perché) da un altro numero primo, portato in ps, qs, e chiave, giusto?
Ok, ho provato con un primo a 30 digit
1725638728768.webp

1725638775079.webp



perché ottengo questo?

Codice:
$ python3 test3-primi.py

nessun divisore trovato



Quindi credo che il programma di test abbia dei problemi, sbaglio?
 
troverete tutte le informazioni sul sito www.gc57crypto.net
L'ho riletto in modo più approfondito e ci ho ragionato un po' al fine di individuare una spiegazione più matematica al procedimento descritto. Premetto però che molti punti mi sono ancora oscuri (non so se per carenze mie nel comprendere o per carenze tue nell'esprimerti).

Da quello che ho capito, l'idea di fondo è quella di eseguire il processo di fattorizzazione del semiprimo s=p*q ricercando un multiplo m di p o q attraverso il calcolo di MCD(s,m) per diversi valori di m (in realtà tu calcoli MCD(s-m,m), ma, essendo (s-m)+m=s ed essendo in generale MCD(a,b)=MCD(a+b,b), non cambia niente). Tale ricerca si fermerà al valore m' di m tale che 1<MCD(s,m')<s, infatti, avendo s solo due divisori propri, sarà evidentemente MCD(s,m') uguale a p o q.
Tutto si riduce quindi alla successione di valori m da testare. Banalmente potrei partire da m=2 e incrementare di un'unità ogni volta, fino ad arrivare ad m'=MIN(p,q), ma evidentemente non sarebbe molto performante. Nel tuo caso gli m da testare sono dati dalla seguente successione:

m(k) = s % |sqrt(s)| + k * |sqrt(s)| con k=0,1,2,...

In pratica si parte da s % |sqrt(s)| e si avanza con passo |sqrt(s)|. Il perché di questa formulazione non mi è chiara (magari riprenderemo il discorso in seguito), ma in ogni caso, tralasciando l'efficienza, l'algoritmo funziona, in quanto esisterà sicuramente un k'< MIN(p,q) per cui sarà m(k')=m'.
Al fine di completare la dimostrazione matematica (non so quanto rigorosa 😅) dell'algoritmo, bisogna tenere conto del caso in cui
|sqrt(s)| è un multiplo di s (vedi per esempio s=4 e s=143).

Di seguito un codice in C che tiene conto di quanto appena detto:
C:
#include <stdio.h>
#include <math.h>

unsigned int mcd_euclide(unsigned int a, unsigned int b)
{
    if(a && b)
    {
        unsigned int r;
        while(r = a % b)
        {
            a = b;
            b = r;
        }
        return b;
    }
    return a + b;
}

unsigned int fattorizza_semiprimo(unsigned int s)
{
    unsigned int y = (unsigned)sqrt(s);
    unsigned int m = s % y;
    unsigned int p;
    if(!m)
    {
        return y;
    }
    for(;(p = mcd_euclide(s, m)) == 1; m += y);

    printf("VALORE INIZIALE -> %u\n", s % y);
    printf("PASSO -> %u\n", y);
    printf("NUMERO ITERAZIONI -> %u\n", (m - s % y) / y + 1);

    return p;
}

int main()
{
    unsigned int s = 779;

    unsigned int p_1 = fattorizza_semiprimo(s);
    printf("\n%u=%u*%u\n", s, p_1, s / p_1);
}

Correttezza e completezza sembrano rispettate, sull'efficienza ho molti dubbi se si escludono casi appositamente creati! 🤔

Ditemi se siete d'accordo su quanto scritto, poi magari passiamo al resto.
 
Ultima modifica:
Mancata osservanza delle regole del Forum
L'ho riletto in modo più approfondito e ci ho ragionato un po' al fine di individuare una spiegazione più matematica al procedimento descritto. Premetto però che molti punti mi sono ancora oscuri (non so se per carenze mie nel comprendere o per carenze tue nell'esprimerti).

Mi dispiace la tua analisi ma trovo che non sia corretta perchè ti basi su SQTR.

SQTR, e cioè la radice quadrata del semiprimo, è stato il primo esperimento, come specificato nel sito, che ha dato il via a tutto il ragionamento. Questo metodo ha lasciato poi il posto alle potenze. Se continui la lettura ti accorgerai di quanto sia cambiata la struttura dell'algoritmo quando oltre aver abbandonato la radice quadrata ha trovato la X=0

Beh io ho fatto alcune prove con il tuo programma test e qualcosa non mi torna, il programma test dovrebbe trovare un semiprimo in un range casuale partendo (e non capisco perché) da un altro numero primo, portato in ps, qs, e chiave, giusto?
Ok, ho provato con un primo a 30 digit
Visualizza allegato 482272

Visualizza allegato 482273



perché ottengo questo?

Codice:
$ python3 test3-primi.py

nessun divisore trovato



Quindi credo che il programma di test abbia dei problemi, sbaglio?
mi mostri anche il resto dello script o lo posti così che lo analizzo ed eventualmente lo provo.
Scusa se chiamo i numeri elevato.... questo serve a identificare meglio quanto sto per dire. Il riferimento è il numero elevato alla 5, con il numero elevato alla11, con il numero elevato alla 8 (chiave) che sono nel prigramma test

tento anche di spiegarti il concetto. I due numeri, che io chiamo genitori, elevato alla 5 ed alevato alla 11 sono parte della chiave elevata alla 8. difatti se provi a dividere elevato alla 8 diviso elevato alla 5 otterrai una divisione intera: supponi adesso di aggiungere a elevato alla 5, un numero intero, quello che vuoi, e così anche a elevato alla 11, cosa ottieni? Non sono più divisibili tra loro. questo cosa vuol dire? Vuol dire che la loro relazione comunque rimane elevato alla 5, elevato alla 8, elevato alla 11. E' questa relazione continua a fornire il valore giusto di elevato alla 5 nonostante io aggiunga numeri a elevato alla 5 ed elevato alla 11. Fino a un certo punto, e cioè quello che io chiamo campo
 
Ultima modifica:
è quello script di test che hai postato te qualche pagina fa, ho solo cambiato i valori su ps, qs e chiave

Codice:
#* GC57 test
from math import gcd,isqrt
from sympy import nextprime, isprime
from random import randint, seed
import time

#**** imposto il seme di ricerca random
T=int(time.time())
seed(T)

#**** numeri di ricerca
ps = '629158772115558791903906618009**5'
qs = '629158772115558791903906618009**11'

#**** converto le stringhe ps e qs in numeri interi
p=eval(ps)
q=eval(qs)

#**** imposto chiave come base di ricerca
chiave = 629158772115558791903906618009**8
print()

#**** discriminatore
trovato=0
campo=500
aumenta=1000000000
#**** cerco i numeri primi partendo dalla base e aggiungendo un numero casuale
primo1=nextprime(p+randint(1,aumenta*(2**campo)))
primo2=nextprime(q+randint(1,aumenta*(2**campo)))

#**** calcolo il semiprimo ed effettuo la ricerca
n=primo1*primo2
a=n%chiave
b=n-a
r=gcd(a,b)
for i in range(10):
    r=gcd(b,a)
    if r!=1:

        print('Semimprimo =',n)
        print()
        print('Divisore =',r)
        print()
        print('Test divisore. Numero primo=',isprime(r))
        print()
        print(i)
        trovato=1
        break
    a=a+chiave
    b=b-chiave
if trovato==0:
    print('nessun divisore trovato')
 
Ok, ho analizzato questa famiglia che hai messo e cioè 629158772115558791903906618009**5, 629158772115558791903906618009**11, 629158772115558791903906618009**8

Il loro campo di risoluzione non è 2^500 ma più basso. e questo dipende, come ho già spiegato sul sito, dalla grandezza del numero. Sostituisci
campo=200 e li troverà tutti. Il valore del campo è un valore strettamente legato alla grandezza del numero e alla distanza degli esponenti tra loro
 
Mi dispiace la tua analisi ma trovo che non sia corretta perchè ti basi su SQTR.
Il fatto che tu adesso utilizzi una formulazione diversa/aggiornata per la sequenza che ho chiamato m(k) non pregiudica affatto l'analisi che ho fatto, che per quanto mi riguarda risulta chiara e matematicamente corretta. In ogni caso riesci a dirmi senza troppi giri di parole quale sarebbe la formulazione corrente che utilizzi per la sequenza m(k)?
 
Il fatto che tu adesso utilizzi una formulazione diversa/aggiornata.....
Ti mostro uno script che utilizza una formula per determinare il valore di k che io però ho chiamato X e che sarebbe la lontananza in step per la risoluzione della fattorizzazione. Questa X espressa in c1 o c2 dal programma, se dà zero su uno di questi due parametri vuol dire che c'è un bel campo che posso utilizzare. Ho utilizzato i tuoi numeri


Python:
#analizzatore chiavi
from math import gcd, isqrt,sqrt,log
from sympy import nextprime, isprime

#imposto la base della famiglia
p =629158772115558791903906618009**5
q =629158772115558791903906618009**11

#cerco io due fattori primi più vicini alla base impostata
if isprime(p)==True:
    nd=p
else:
    nd=nextprime(p)

if isprime(q)==True:
    nd2=q
else:
    nd2=nextprime(q)

#calcolo il semiprimo
n=nd*nd2

#imposto la base per la chiave
pt=629158772115558791903906618009


#stampo i dati del semiprimo
print('Utilizzo la Potenza di',pt)
print('Lunghezza   =',len(str(n)))
print('Peso in Bit =',int(log(n,2)))
print()
      
#cerco la potenza inferiore vicina e la divido per due
e=int(log(n,pt))
if pt**(e+1)>n:
    e=e//2
else:
    e=(e+1)//2

#inizio l'analisi combinando le varie potenze
print('*************************************')
print('Chiave Presa da ',pt,'^',e)
print()
chiave=pt**(e)
a=n%chiave
b=n-a
c1=(b//chiave)%nd
c2=(b//chiave)%nd2
if len(str(c1))>9:
    print('C1 Maggiore di 10^9')
else:
    print('C1 =',c1,'    (',len(str(c1)),')')
if len(str(c2))>9:
    print('C2 Maggiore di 10^9')
else:
    print('C2 =',c2,'    (',len(str(c2)),')')
 
Ma possibile che vedo ancora variabili hardcoded? Ma dove è la dinamicità dell’algoritmo?
 
Ti mostro uno script che utilizza una formula per determinare il valore di k che io però ho chiamato X
Ma nel mio precedente post ho affrontato la questione della fattorizzazione, qui tu adesso mi sembra di capire che stai trattando la generazione dei primi, infatti non vedo nessun utilizzo di gcd()... 😔

Come scritto in precedenza
Da quello che ho capito, l'idea di fondo è quella di eseguire il processo di fattorizzazione del semiprimo s=p*q ricercando un multiplo m di p o q attraverso il calcolo di MCD(s,m) per diversi valori di m (in realtà tu calcoli MCD(s-m,m), ma, essendo (s-m)+m=s ed essendo in generale MCD(a,b)=MCD(a+b,b), non cambia niente). Tale ricerca si fermerà al valore m' di m tale che 1<MCD(s,m')<s, infatti, avendo s solo due divisori propri, sarà evidentemente MCD(s,m') uguale a p o q.
Tutto si riduce quindi alla successione di valori m da testare.
Giusto?
Adesso fai ancora tentativi con vari m o vai a colpo sicuro, nel senso che già sei in possesso di un m che è multiplo di uno dei due divisori primi? E in ogni caso puoi scrivere/riportare/esplicitare la formula di m per esteso senza utilizzare variabili intermedie che non si sa bene cosa significano?

Ho utilizzato i tuoi numeri
Quali sarebbero i miei numeri, non capisco?

Ma possibile che vedo ancora variabili hardcoded? Ma dove è la dinamicità dell’algoritmo?
Infatti alla luce anche di quello che ho detto all'inizio di questo post, secondo me c'è un equivoco di fondo, ossia che l'algoritmo dell'OP ha più a che fare con la generazione di numeri primi che con la fattorizzazione e la crittografia...
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top