Spanish (SOLUCIONADO) ¿Como puedo encriptar un String en un archivo de texto?

Sergio Castellari

Active Member
Licensed User
Hola gente,

Tengo un archivo "configuraciones.txt", que lo guardo/leo con
File.WriteMap(TXTFileDir,TXTFileName,Map1) / map1 = File.ReadMap(TXTFileDir,TXTFileName)

Esto funciona correctamente. La ruta del archivo es File.DirInternal.

Pero necesito que un key del map, se pueda encriptar al grabarlo, y desencriptarlo al leerlo.

Saludos,
Sergio
 

Lucas Siqueira

Active Member
Licensed User
Longtime User
Hola gente,

Tengo un archivo "configuraciones.txt", que lo guardo/leo con
File.WriteMap(TXTFileDir,TXTFileName,Map1) / map1 = File.ReadMap(TXTFileDir,TXTFileName)

Esto funciona correctamente. La ruta del archivo es File.DirInternal.

Pero necesito que un key del map, se pueda encriptar al grabarlo, y desencriptarlo al leerlo.

Saludos,
Sergio

Escribir y leer datos

B4X:
Sub Globals
    Dim dir_file_conf As String = File.DirInternal
    Dim name_file_conf As String = "settings.txt"
End Sub

Sub Activity_Create(FirstTime As Boolean)
    write_conf( "Kyle" , "123456" )
    read_conf
End Sub

Sub write_conf(name As String, password As String)
    Dim map_conf As Map
    map_conf.Initialize
    map_conf.Put("name",name)
    map_conf.Put("password",password)
   
    File.WriteMap( dir_file_conf , name_file_conf , map_conf )
End Sub

Sub read_conf()
    Dim map_conf As Map = File.ReadMap( dir_file_conf , name_file_conf )
   
    Log( "name: " & map_conf.get("name") )
    Log( "password: " & map_conf.get("password") )
End Sub
 

josete

Member
Licensed User
Longtime User
Yo use los metodos ReadEncryptedObject y WriteEncryptedObject del objeto RandomAccesFile pero en mi caso para guardar una lista de varibles definidas con type.Encriptar solo una key representa guardarla en otra linea del fichero o en otro fichero a parte,quiza te seria mas facil guardar y leer todo el map completo encriptado.
https://www.b4x.com/android/forum/t...ormation-with-randomaccessfile-library.11565/
Yo lo uso asi en una app que me he hecho para guardar contraseñas:
B4X:
Sub getList As List  
    Dim raf As RandomAccessFile
    Dim list As List
    list.Initialize
    raf.Initialize(File.DirInternal,archiveName,False)
    list = raf.ReadEncryptedObject(encriptionText,0)
    raf.Close
    Return list
End Sub  

Sub saveList (list As List)
    Dim list_ As List = list
    list_.SortTypeCaseInsensitive("Title",True)
    Dim raf As RandomAccessFile
    raf.Initialize(File.DirInternal,archiveName,False)
    raf.WriteEncryptedObject(list_,encriptionText,0)
    raf.Close
End Sub
 

Sergio Castellari

Active Member
Licensed User
Hola @josete,

Primero gracias por la ayuda.
Claro tu dices, encriptar todo el archivo, o sino tendria que utilizar un archivo distinto para "guardar" solo la key que quiero encriptar.

Lo que pretendo es simplemente una rutina que "encripte" un string y me devuelve otro String "encriptado" para que pueda guardarlo/recuperarlo de un archivo TXT.
He visto la LIB B4XEncriptation, funciona barbaro, pero devuelve la encriptacion en formato Byte y al intentar "recuperarla" del archivo TXT, se ve que algo se pierde y da error.

He estado buscando alguna rutina en el foro, que simplemente encripte/desencripte un texto, pero devolviendo String. Algo simple, no requiero una encriptacion fuerte, sino algo simple a los ojos de algun empleado piscueto, pero no he encontrado.

Ahora escribi en el foro ingles...ojala el traductor google funcione para que me entiendan...

Saludos,
Sergio
 

josejad

Expert
Licensed User
Longtime User
Hola Sergio:

Quizás este post te sirva. La rutina que indican al final, devuelve un string:

 

josejad

Expert
Licensed User
Longtime User
O quizás puedes guardarlo en kvs, es bastante simple.

Además de que no es tan fácil de ver como un .txt, tiene una función kvs.PutEncrypted y kvs.GetEncrypted
 

Sergio Castellari

Active Member
Licensed User
Gracias @José J. Aguilar

Aja...no habia visto ése post....voy amirarlo, porque creo que es eso lo que nececito.

¿Ehhh? Que es el KVS ? .... voy a mirarlo tambien.... ¿Vos lo usas?

Desde ya gracias!
Saludos
 

Sergio Castellari

Active Member
Licensed User
apa.....entonces capaz que este meto KVS es aun mejor que lo que quiero, ya que decis que se pueden guardar imagenes...

mmmm...la miraré

Gracias!
 

josejad

Expert
Licensed User
Longtime User
Sólo tienes que seleccionar en las librerías "KeyValueStore2", añades en el Starter:

B4X:
Sub Process_Globals
    Public kvs As KeyValueStore
End Sub

Sub Service_Create
    kvs.Initialize(File.DirInternal, "kvs")
End Sub

Y ya puedes usarla en aplicación como si fuera un map. Guardas por ejemplo el login de tu usuario y así compruebas al abrir la app si ya está logueado, etc...
Por ejemplo:
B4X:
Sub Activity_Create(FirstTime As Boolean)
    If Not(Starter.kvs.ContainsKey("email")) Then 'Previamente en el login, habré hecho por ejemplo: starter.kvs.put("email", userEmail)
        auth.Initialize("auth")
        Logueado = False
        Activity.LoadLayout("Login")
        Activity.Title = "Login"
    Else
        CargarMenus
    End If
End Sub
 

Sergio Castellari

Active Member
Licensed User
Bueno tratando de hacer mi primer aporte, aquí coloco la rutina que armé en base a la ayuda prestada por @José J. Aguilar y un post

Yo la tengo en una Clase general, para poder llamar desde cualquier lugar:

B4X:
'***********************************************************
'* Cripto() Encripta/Desencripta un String simple          *
'*    Recibe: cTxt ---> Texto a Encriptar                  *
'*                 ---> TextoBase64 a desencriptar         *
'*            cTipo --> "E" Encriptar / "D" Desencriptar   *
'* Retorna: un String (compatible con archivos.txt)        *
'******************************************** 06-05-2020 ***
Public Sub Cripto(cTxt As String, cTipo As String) As String
    Dim c As B4XCipher
    Dim su As StringUtils
    Dim e() As Byte
    If cTipo = "E" Then
        Log("Texto a Encriptar: " & cTxt)
        e = c.Encrypt(cTxt.GetBytes("utf8"),"xpenfWv")
        Return su.EncodeBase64(e)
    Else If cTipo = "D" Then
        Log("Texto a Desencriptar: " & cTxt)
        e = su.DecodeBase64(cTxt)
        If e.Length = 0 Then Return ""
        e = c.Decrypt(e,"xpenfWv")
        Return BytesToString(e, 0, e.Length, "utf8")
    Else
        Return cTxt
    End If
End Sub

Saludos,
 
Top