Italian Criptare dati con B4A

nonno

Active Member
Licensed User
Longtime User
Ciao ragazzi dovrei criptare dei dati, in VB6 uso i codici asci ma qua con B4A non saprei come fare?!
Grazie 1000 per eventuali suggerimenti
 

Star-Dust

Expert
Licensed User
Longtime User
Se vuoi passarli in byte per poi utilizzarli in ascii o come ti pare a te fai cosi:
B4X:
Dim S As String ="Ciao"

Dim B() As Byte = S.GetBytes

Poi con la libreria B4Xserializator usando la classe RandomAccess puoi trovare il comando WriteEncryptedObject (vedi qui)
Oppure Encryption library (vedi qui)
 

nonno

Active Member
Licensed User
Longtime User
Ciao ragazzi grazie al consiglio di Star-Dust riesco a convertire il file..., per poterlo usare devo convertirlo ma come devo fare ? :(:(
mi sembra che usare " UTF-8 o ASCII oppure UTF8 la conversione in numeri binari non cambia, anche questo mi sembra strano o_O

B4X:
Dim msg1 As String = "Ciao Ragazi del forum B4A Italiano"
    Dim msgx As String
    Dim msg2() As Byte = msg1.GetBytes("UTF-8")' / ASCII / UTF8 
   
    For i=0 To msg2.Length - 1
        msgx = msgx &  msg2(i)
       
    Next
 

Star-Dust

Expert
Licensed User
Longtime User
2 sub una per la codifica e salvataggio della stringa
e un altra per la lettura del file codificato e la decodifica in una stringa
B4X:
Sub SalvaTestoCodificato
    Dim Str As String "Stringa da codificare"
 
    BytesToFile(File.DirRootExternal,"stringa.code",Complementar(Code(Str))
End Sub

Sub CaricaTestoCodificato
    Dim S As String= Decode(Complementar(FileToBytes(File.DirRootExternal,"stringa.code") ))
End Sub

Sub per il salvataggio e il caricamento dei file in Byte
B4X:
Sub BytesToFile (Dir As String, FileName As String, Data() As Byte)
    Dim out As OutputStream = File.OpenOutput(Dir, FileName, False)
    out.WriteBytes(Data, 0, Data.Length)
    out.Close
End Sub

Sub FileToBytes (Dir As String, FileName As String) As Byte()
    Return Bit.InputStreamToBytes(File.OpenInput(Dir, FileName))
End Sub

Da stringa a array di byte (code), Da Array di Byte a stringa (Decode), e Sub per codificare in complemento a 2 (in modo da rendere il file non leggibile)
B4X:
' Da Stringa a Array di Byte
Sub Code(S As String) As Object
    Return S.GetBytes("UTF8")
End Sub

' Da Array di Byte a Stringa
Sub Decode(bytes() As Byte) As String
    Return BytesToString(bytes, 0, bytes.Length, "UTF8")
End Sub

' Codifica di ogni byte con complemento a 2
Sub Complementar(Bytes() As Byte) As Object
    Dim Cry(Bytes.Length) As Byte
 
    For i=0 To Bytes.Length-1
        ' complemento a 2
        Cry(i)=255-Bytes(i)
    Next
 
    Return Cry
End Sub
 

nonno

Active Member
Licensed User
Longtime User
' Da Stringa a Array di Byte
Sub Code(S As String) As Object
Return S.GetBytes("UTF8")
End Sub
Scusate, avrei bisogno di un semplice esempio (tipo 111 che corrisponde alla "o" oppure "32" che corrisponde allo spazio, dovrei capere come trasformali in lettera il "111" e il "32" in spazio.
non voglio trasformare l'intera stringa ma carattere per carattere, ho fatto molti tentativi senza riuscirci.
Grazie 1000
 

udg

Expert
Licensed User
Longtime User
Cerca le funzioni Chr e Asc.
La prima prende un valore e lo trasforma in carattere (unicode); la seconda opera all'inverso, da carattere a codice.
Per la crittazione vera e propria fai riferimento ai suggerimenti di SD nel post#2; in genere è altamente sconsigliato inventarsi propri sistemi di crittazione che difficilemnte potranno regegre il confronto con quanto prodotto da esperti del settore.
 

nonno

Active Member
Licensed User
Longtime User
Cerca le funzioni Chr e Asc.
infatti con l'esempio di SD Dim B() As Byte = S.GetBytes li converto ma non riesco a trasformarli in strina o meglio mi trasforma l'intera stringa, io voglio manipolare i dati aggiungendo valori diversi a secondo della posizione, lunghezza file, ecc. come ho gia fatto in vb6.
Grazie 1000
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
Basta operare su ciascun byte.
La stringa si passa a byte e poi si opera sul singolo byte.

B4X:
Dim S ad String =""
For i=0To Bytes.Length-1
       Log(Bytes(i))
       Dim SingoloValore as Byte=Bytes(i)
       S=S & chr(SingoloValore + ValoreDaAggiungereSecondoPosizione)
Next
oppure
B4X:
Sub Code(Bytes() As Byte) As String
    Dim Cry(Bytes.Length) As Byte
    For i=0 To Bytes.Length-1
        ' complemento a 2
        Cry(i)=Bytes(i) + ValoreDaAggiungereSecondoPosizione
    Next
    Return BytesToString(bytes, 0, bytes.Length, "UTF8")
End Sub

Ma anche io penso come @udg che è meglio usare una codifica professionale e non una fai da te
 
Top