Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Funzione di crypting da 2 stringhe

Ciao a tutti,
prima che mi metta a farla, vorrei sapere se qualcuno ha già disponibile una
funzione che permetta di produrre un codice cifrato date in input 2 stringhe
(il crypting non deve necessariamente essere complesso).
IMPORTANTE: il codice risultante DEVE essere univoco per la coppia di dati
in ingresso (una funzione simile, ma che puo' produrre lo stesso codice da
input diversi ce l'ho gia')!
Se qualcuno ce l'ha, me la potrebbe gentilmente dare (in VB5/6)?
TIA
--
Roal Zanazzi
z...@iol.it

Roal Zanazzi ha scritto nel messaggio ...

Non so' se ho ben capito la tua esigenza....... se si', spero di darti lo
spunto giusto......
Dim ST1 As String
Dim ST2 As String
Dim kript As String
ST1 = "A"
ST2 = "K"
'Effettua crittografia
kript = Chr$(Asc(ST1) Xor Asc(ST2))
MsgBox kript
' Decrittografa
MsgBox Chr$(Asc(ST1) Xor Asc(kript))
MsgBox Chr$(Asc(ST2) Xor Asc(kript))
Ho usato 2 stringhe con un solo carattere ma messo dentro un ciclo for next
la puoi applicare a stringhe a lunghezza n.
Chiaramente poi effetture diverse varianti su questa base.
Praticamente con questa tecnica puoi effettuare la crittografia di un testo
o di quello che vuoi partendo da una specifica "CHIAVE".
Sembra un algoritmo banale ma non lo e'.........
Ciao e fammi sapere..........
Ven.

you wrote :
#Non so' se ho ben capito la tua esigenza....... se si', spero di darti lo
#spunto giusto......
|snip| 
Avevo pensato anch'io a questa soluzione, pero' l'autore dice 
#>IMPORTANTE: il codice risultante DEVE essere univoco per la coppia di dati
#>in ingresso (una funzione simile, ma che puo' produrre lo stesso codice da
#>input diversi ce l'ho gia')!
Nel caso di "Giraffa" come stringa e di "Elefante" come chiave si
genera un valore uguale a quello di "Elefante" come stringa e
"Giraffa" come chiave...
Andrea Laforgia        (
andrea_...@bigfoot.com
)
----------------------------------------------------
There is nothing better for understanding a kangaroo
than seeing it jump.
----------------------------------------------------

"Giraffa" come chiave...
Hai fatto un'ottima osservazione ma hai detto una mezza verita'.
Infatti nel caso di "Giraffa" e "Elefante"  invertendo l'ordine degli
"addendi"  il risultato e' diverso !!!!!
infatti per confermare quanto detto ti allego questo codice. Provalo e
vedrai che ho ragione :
Private Sub Command1_Click()
Dim St1  As String
Dim Key As String
Dim MyString As String
St1 = "Giraffa"
Key = "Elefante"
MyString = Crypt(St1, Key)
If MyString = Crypt("Elefante", "Giraffa ") Then   MsgBox "Uguali "
End Sub
Function Crypt(Stringa As String, Chiave As String) As String
    Dim Ind As Long
    Dim PosKey As Integer
    PosKey = 1
    For Ind = 1 To Len(Stringa)
        Crypt = Crypt & Chr$(Asc(Mid$(Stringa, Ind, 1)) Xor Asc(Mid$(Chiave,
PosKey, 1)))
        PosKey = PosKey + 1
        If PosKey > Len(Chiave) Then PosKey = 1
    Next Ind
End Function
Inoltre la cosa simpatica e' che passando alla stessa FUNCTION Crypt, la
stringa Criptata + la chiave, ti ritorna la stringa originale.
Ma come ti dicevo hai fatto una giusta osservazione ossia , si ha il
problema che dici tu solo ed esclusivamente se la stringa da criptare ha la
stessa lunghezza della chiave.
Ma poi...... e' un problema ???????? e se si'..... ci sono 10000 ( forse +
;-))  modi per arginarlo.
Ciao
Ven.

you wrote :
#infatti per confermare quanto detto ti allego questo codice. Provalo e
#vedrai che ho ragione :
Si, lo so, una funzione identica alla tua l'ho scritta anch'io ed in
effetti scrivere "Elefante" e crittarlo con "Giraffa" vuol dire
crittarlo con "GiraffaG".
#Inoltre la cosa simpatica e' che passando alla stessa FUNCTION Crypt, la
#stringa Criptata + la chiave, ti ritorna la stringa originale.
Ovviamente, e' una conseguenza dello xor, questo e' uno dei motivi per
cui si puo' scrivere :
a = a xor b
b = b xor a
a = a xor b
per scambiare due interi a e b senza l'uso della variabile temporanea.
#Ma come ti dicevo hai fatto una giusta osservazione ossia , si ha il
#problema che dici tu solo ed esclusivamente se la stringa da criptare ha la
#stessa lunghezza della chiave.
#Ma poi...... e' un problema ???????? e se si'..... ci sono 10000 ( forse +
#;-))  modi per arginarlo.
Basterebbe far variare l'ultimo carattere della chiave con tutti i
caratteri presenti in essa, per esempio.



No, nulla di pronto.
Secondo me:
- Se la chiave e' fissa allora e' possibile avere una stringa criptata
univoca della stessa lunghezza in bytes della stringa di origine.
- Se la chiave non e' fissa allora e' _impossibile_ avere una stringa
criptata univoca della stessa lunghezza in bytes della stringa di origine.
E' necessario che la stringa criptata abbia insita anche informazioni
proprie della chiave oltre che della stringa da criptare. Questo allunga la
stringa criptata.
Un metodo potrebbe essere questo:
Stringa di chiave: "CHIAVE"
Stringa da criptare: "le mie cose segrete"
Accorparle in questo modo:  "lCeH ImAiVeE cose segrete"  ( un carattere
della stringa e una della chiave, fino ad esaurimento della lunghezza della
chiave)
Quindi applichi il tuo  algoritmo di codifica, non lo xor, ma la somma, tipo
questo:
dim chChiave as integer
dim chStringa as integer
dim chCodificato as integer
chChiave=asc(mid$(Chiave$,1,1))
chStringa=asc(mid$(Stringa$,1,1))
chCodificato = (chStringa + chChiave) and 255
per decriptarlo:
chChiave=asc(mid$(Chiave$,1,1))
chStringa=asc(mid$(Stringa$,1,1))
chCodificato = (chStringa - chChiave) and 255
Mi pare buona.
Pero... non sono certo al 100% che questo metodo garantisca l'univocita', ma
ad ogghio e croce... >;-P
Saluroni


Ettore non per fare il critico...... ma mi spieghi a cosa serve fare un AND
con 255 ???
x and 255 da infatti sempre e comunque x !!!!
Ciao
Ven.

 con 255 ???
fa figo! :-))


SOLO se x e' di tipo byte...
Mentre, come si vede dalle dichiarazioni che non hai incluso nel tuo msg, le
variabili usate sono tutte di tipo integer.
--
Roal Zanazzi
z...@iol.it

x and 255 da infatti sempre e comunque x !!!!
Mi sa che vi siete fatti trarre in inganno da una mia imprecisione ;-)))
L'origine era una stringa, ed anche il risultato e' una stringa (la stringa
criptata) .
Il codice quindi diventa cosi':
dim chChiave as integer
dim chStringa as integer
dim chCodificato$
dim chDecodificato$
dim strIn$, strOut$
....
chChiave=asc(mid$(Chiave$,1,1))
chStringa=asc(mid$(strIn$,1,1))
chCodificato$ = chr$((chStringa + chChiave) and 255)
strOut$ = strOut$ & chCodificato$
....
per decriptarlo:
.....
chChiave=asc(mid$(Chiave$,1,1))
chStringa=asc(mid$(strIn$,1,1))
chDecodificato$ = chr$((chStringa - chChiave) and 255)
strOut$ = strOut$ & chDecodificato$
.....
Suppini: 250 e' da criptare, 96 e' la chiave di cript
    x = (250+96) and 255
ossia x = 90   ' numero criptato
Per decriptarlo, se fai:
    x = (90-96)
ossia x = -6  ' uno schifo
mentre se fai:
    x = (90-96) and 255
ossia x = 250  ' numero decriptato
Salutoni
Ciao
By -MES-   Maronese Ettore
http://ilmes.freeweb.org
(con OCX per stampare i recordset)
Sito Comune di programmatori Visual Basic
http://www.murialdo.it/it_lang_vb

variabili usate sono tutte di tipo integer.
Oltretutto, se vengono definiti come BYTE andrebbe in overflow.
Esempio:
    Dim a As Byte
    Dim b As Byte
    Dim c As Byte
    a = 250
    b = 96
    c = a + b   ' QUI MI DA ERRORE DI OVERFLOW
Salutoni
Ettore By -MES-
(dal lavoro)

variabili usate sono tutte di tipo integer.
Giustissima osservazione.......mi sa che e' ora che vado in ferie !!!!!!!
;-))
Ciao
Ven.