Newsgroup: it.comp.lang.visual-basic
Titolo: [?]Shift dei singoli byte di un file

Per un amico ho sviluppato una banale funzione di
crittazione dei file al fine di renderli illeggibili, senza
scomodare le CryptoAPI.
L'intento "era" quello di incrementare/decrementare di uno i
singoli byte del file. Poiche' tale crittazione andrebbe
fatta su file di alcune decine/centinaia di MB, e fare il
tutto byte per byte richiedeva troppo tempo, mi sono
limitato a spostare solo i primi 100K (sufficiente per lo
scopo preposto), lasciando inalterato il resto.
Ho fatto un po' di test su MPG, AVI, MP3 e sembrava andare
tutto ok (dimensione file crittato ok, operazione inversa
ok). Ma su un file di testo, non so per quale arcano motivo,
nella doppia operazione crittatura/decrittatura mi aggiunge
tante y (con dieresi sopra), variando la dimensione del file
originale. Di seguito posto il codice della routine,
sperando che qualcuno trovi l'inghippo :p
------------------------------------------------------------
Private Sub EncryptDecrypt(ByVal FileInput As String, _
                           ByVal FileOutput As String, _
                           ByVal doEncrypt As Boolean)
    On Error GoTo EncryptDecrypt_Error
    Dim fni As Integer
    Dim fno As Integer
    Dim b() As Byte
    Dim i As Long
    Dim shift As Long
    Dim FileLen As Long
    Dim LastByte As Long
    If doEncrypt Then
        shift = 1
    Else
        shift = -1
    End If
    fni = FreeFile
    Open FileInput For Binary Access Read Lock Read Write As
#fni
    FileLen = LOF(fni)
    If FileLen > 100000 Then
        LastByte = 100000
    Else
        LastByte = FileLen
    End If
    fno = FreeFile
    Open FileOutput For Binary Access Write Lock Read Write
As #fno
    ReDim b(0 To 0)
    Do Until EOF(fni)
        i = i + 1
        Get #fni, i, b(0)
        Put #fno, i, b(0) + shift
        'Lascia il resto del file, cosi' com'e'.
        If i = LastByte And LastByte <> FileLen Then
            i = i + 1
            ReDim b(0 To FileLen - LastByte)
            Get #fni, i, b()
            Put #fno, i, b()
            Exit Do
        End If
    Loop
EncryptDecrypt_Error:
    Close #fni
    Close #fno
End Sub
------------------------------------------------------------
Grazie per l'aiuto,
Lokar
-- 
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
Statuto: 
http://www.it-lang-vb.net/docs/Statuto.txt
UGIdotNET - 
http://www.ugidotnet.org

         Put #fno, i, b(0) + shift
E se b(0) pesa 255 e shift vale 1?
Per il resto (la variazione di lunghezza del file ottenuto) non riesco a
vedere l'errore, se c'è, ma ti consiglierei di leggere a blocchi ampi
(occhio a non andare oltre la fine del file) e crittare in memoria sul
blocco stesso, da riscrivere crittato, fino al numero di bytes desiderati
complessivi.

Una delle prime cose che mi salta all'occhio e' che non c'e' nessun
controllo sui limiti ... un byte vale al massimo 255 e minimo 0... se leggi
un byte che vale 255 e gli sommi 1 dovrebbe diventare 0, non 256....
Poi non c'e' nessun punto in cui specifichi che dal file va letto un byte
per volta... sei sicuro che usando Dim b (0 to 0) venga creata una variabile
gross aun byte ?? Non lo so, ma mi sembra strano....

             ReDim b(0 To FileLen - LastByte)
Qui vedrei (b è in base 0) decisamente un "... To FileLen - LastByte - 1"

[Lokar]
Grazie per i preziosi suggerimenti. Metto in pratica e vi
faccio sapere :) (C'ho anche un lavoro che mi aspetta...)
