Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Tomas1982 en 5 Octubre 2016, 14:06 pm



Título: cifrar Carpetas
Publicado por: Tomas1982 en 5 Octubre 2016, 14:06 pm
Buenos días ante todo, Estoy tratando de realizar un programa que me organiza los ficheros por extensiones, pero quiero que a terminal este me encripte la carpeta con contraseña para que nadie tenga acceso a ella, e buscado por la red pero no logro encontrar nada que me funcione, si alguien tuviese alguna idea para lograrlo y quisiera compartirlo lo agradecería...


Título: Re: cifrar Carpetas
Publicado por: MCKSys Argentina en 5 Octubre 2016, 14:17 pm
Seguro que haz buscado bien? Porque me sale ésto en el 3er resultado de Google How to encrypt and decrypt a file by using Visual C# (https://support.microsoft.com/en-us/kb/307010)

Saludos!

PD: Mi búsqueda (https://www.google.com/search?q=.net+cipher+files+and+folder).


Título: Re: cifrar Carpetas
Publicado por: Tomas1982 en 5 Octubre 2016, 15:11 pm
Disculpen por no aclararlo antes, pero el lenguaje que estoy utilizando es vb.net


Título: Re: cifrar Carpetas
Publicado por: MCKSys Argentina en 5 Octubre 2016, 15:34 pm
Bueno, pasar de C# a VB.NET es cuestión de sintaxis solamente.

Incluso, hay herramientas que lo hacen en forma automática.

Saludos!


Título: Re: cifrar Carpetas
Publicado por: okik en 5 Octubre 2016, 15:43 pm
Seguro que haz buscado bien? Porque me sale ésto en el 3er resultado de Google How to encrypt and decrypt a file by using Visual C# (https://support.microsoft.com/en-us/kb/307010)

Saludos!

PD: Mi búsqueda (https://www.google.com/search?q=.net+cipher+files+and+folder).

Eso es para archivos no para carpetas... si no me equivoco


Ahora lo miro a ver...  :P



Pues lo que decía ese código es para cifrar el contenido de un archivo.

Código
  1. Imports System.IO
  2. Imports System.Security
  3. Imports System.Security.Cryptography
  4. Imports System.Runtime.InteropServices
  5. Imports System.Text
  6. Public Class Form1
  7.  
  8.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  9.  
  10.    End Sub
  11.  
  12.    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  13.        ' Must be 64 bits, 8 bytes.
  14.        ' Distribute this key to the user who will decrypt this file.
  15.        Dim sSecretKey As String
  16.        sSecretKey = CSEncryptDecrypt.Class1.GenerateKey() ' Get the Key for the file to Encrypt.
  17.        Dim gch As GCHandle = GCHandle.Alloc(sSecretKey, GCHandleType.Pinned)                       ' For additional security Pin the key.
  18.        CSEncryptDecrypt.Class1.EncryptFile("C:\Prueba\Texto.txt", "C:\Prueba\TextoEncrypt.txt", sSecretKey)        ' Encrypt the file.        
  19.        CSEncryptDecrypt.Class1.ZeroMemory(gch.AddrOfPinnedObject(), CType(sSecretKey.Length * 2, IntPtr))
  20.        gch.Free()
  21.    End Sub
  22.  
  23.    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
  24.        ' Must be 64 bits, 8 bytes.
  25.        ' Distribute this key to the user who will decrypt this file.
  26.        Dim sSecretKey As String
  27.        sSecretKey = CSEncryptDecrypt.Class1.GenerateKey() ' Get the Key for the file to Encrypt.
  28.        Dim gch As GCHandle = GCHandle.Alloc(sSecretKey, GCHandleType.Pinned)
  29.        CSEncryptDecrypt.Class1.DecryptFile("C:\Prueba\TextoEncrypt.txt", "C:\Prueba\Decrypt.txt", sSecretKey)    ' Decrypt the file.
  30.        CSEncryptDecrypt.Class1.ZeroMemory(gch.AddrOfPinnedObject(), CType(sSecretKey.Length * 2, IntPtr)) ' Remove the Key from memory.
  31.        gch.Free()
  32.    End Sub
  33. End Class
  34.  
  35.  
  36. Namespace CSEncryptDecrypt
  37.  
  38.    Class Class1
  39.        <DllImport("kernel32.dll")> _
  40.        Public Shared Sub ZeroMemory(ByVal addr As IntPtr, ByVal size As IntPtr)
  41.        End Sub
  42.        '  Call this function to remove the key from memory after use for security
  43.        '<System.Runtime.InteropServices.DllImport("KERNEL32.DLL", EntryPoint:="RtlZeroMemory")> _
  44.        'Public Shared Function ZeroMemory(Destination As IntPtr, Length As Integer) As Boolean
  45.        'End Function
  46.  
  47.        ' Function to Generate a 64 bits Key.
  48.        Public Shared Function GenerateKey() As String
  49.            ' Create an instance of Symetric Algorithm. Key and IV is generated automatically.
  50.            Dim desCrypto As DESCryptoServiceProvider = DirectCast(DESCryptoServiceProvider.Create(), DESCryptoServiceProvider)
  51.  
  52.            ' Use the Automatically generated key for Encryption.
  53.            Return ASCIIEncoding.ASCII.GetString(desCrypto.Key)
  54.        End Function
  55.  
  56.        Public Shared Sub EncryptFile(sInputFilename As String, sOutputFilename As String, sKey As String)
  57.            Dim fsInput As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)
  58.  
  59.            Dim fsEncrypted As New FileStream(sOutputFilename, FileMode.Create, FileAccess.Write)
  60.            Dim DES As New DESCryptoServiceProvider()
  61.            DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
  62.            DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
  63.            Dim desencrypt As ICryptoTransform = DES.CreateEncryptor()
  64.            Dim cryptostream As New CryptoStream(fsEncrypted, desencrypt, CryptoStreamMode.Write)
  65.  
  66.            Dim bytearrayinput As Byte() = New Byte(CInt(fsInput.Length - 1)) {}
  67.            fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
  68.            cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
  69.            cryptostream.Close()
  70.            fsInput.Close()
  71.            fsEncrypted.Close()
  72.        End Sub
  73.  
  74.        Public Shared Sub DecryptFile(sInputFilename As String, sOutputFilename As String, sKey As String)
  75.            Dim DES As New DESCryptoServiceProvider()
  76.            'A 64 bit key and IV is required for this provider.
  77.            'Set secret key For DES algorithm.
  78.            DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
  79.            'Set initialization vector.
  80.            DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
  81.  
  82.            'Create a file stream to read the encrypted file back.
  83.            Dim fsread As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)
  84.            'Create a DES decryptor from the DES instance.
  85.            Dim desdecrypt As ICryptoTransform = DES.CreateDecryptor()
  86.            'Create crypto stream set to read and do a
  87.            'DES decryption transform on incoming bytes.
  88.            Dim cryptostreamDecr As New CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read)
  89.            'Print the contents of the decrypted file.
  90.            Dim fsDecrypted As New StreamWriter(sOutputFilename)
  91.            fsDecrypted.Write(New StreamReader(cryptostreamDecr).ReadToEnd())
  92.            fsDecrypted.Flush()
  93.            fsDecrypted.Close()
  94.        End Sub
  95.  
  96.  
  97.    End Class
  98. End Namespace


Encontré este código lo he testado y funciona:
Código
  1. Imports System.Security.AccessControl
  2. Imports System.IO
  3.  
  4.  
  5. Public Class Form1
  6.  
  7.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  8.  
  9.  
  10.    End Sub
  11.  
  12.    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  13.        Dim FolderBrowserDialog1 As New FolderBrowserDialog
  14.        With FolderBrowserDialog1
  15.            If .ShowDialog() = DialogResult.OK Then
  16.                TextBox1.Text = .SelectedPath
  17.            End If
  18.        End With
  19.  
  20.    End Sub
  21.  
  22.    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
  23.        Dim fs As FileSystemSecurity = File.GetAccessControl(TextBox1.Text)
  24.        fs.AddAccessRule(New FileSystemAccessRule(Environment.UserName, FileSystemRights.FullControl, AccessControlType.Deny))
  25.        File.SetAccessControl(TextBox1.Text, CType(fs, FileSecurity))
  26.    End Sub
  27.  
  28.    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
  29.        Dim fs As FileSystemSecurity = File.GetAccessControl(TextBox1.Text)
  30.        fs.RemoveAccessRule(New FileSystemAccessRule(Environment.UserName, FileSystemRights.FullControl, AccessControlType.Deny))
  31.        File.SetAccessControl(TextBox1.Text, CType(fs, FileSecurity))
  32.    End Sub
  33. End Class

FUENTE:
http://burnignorance.com/vb-net-tricks/how-to-lock-and-unlock-a-folder-through-code-in-vb-net/

Esto bloquea el acceso a la carpeta. Lo que no se es si será accesible desde un Linxu Live por ejemplo o algún programa de arranque, o quizás desde el modo seguro.




Lo se la contraseña se me ocurre que la metas cifrada, con el código de arriba por ejemplo dentro de la misma carpeta, desde el programa cuando se quiera desbloquear, el programa desbloquearía la carpeta el tiempo justo para poder acceder a la contraseña descifrarla y compararla con la que introduce el usuario. Se ve un poco, chapuza pero es lo que se me ocurre ahora. Podrías mirarte en ingeniería inversa, a ver.





Título: Re: cifrar Carpetas
Publicado por: Tomas1982 en 5 Octubre 2016, 17:35 pm
Gracias por el aporte..


Título: Re: cifrar Carpetas
Publicado por: Tomas1982 en 5 Octubre 2016, 18:56 pm
El código esta muy bueno, pero cuando trato de proteger la carpeta ubicada en una memoria, no me funciona... 


Título: Re: cifrar Carpetas
Publicado por: okik en 5 Octubre 2016, 19:43 pm
El código esta muy bueno, pero cuando trato de proteger la carpeta ubicada en una memoria, no me funciona...  

Ejecuta como administrador

Imagino que lo sabes pero por si acaso te lo comento.

Para hacer que el programa se ejecute como administrador por defecto. Vas a propiedades del proyecto y clicas en Ver configuración de Windows.

se te abrirá el App.manifest y verás un código XML:
Donde pone
Código
  1. <requestedExecutionLevel level="asInvoker" uiAccess="false" />

quitas asInvoker y pones requireAdministrator

te quedará así:
Código
  1. <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Guarda y cuando inicies el programa dentro del entorno de programación (f5) Visual studio te preguntará si deseas reiniciar con nuevas credenciales, le dices que sí.  y ahora VS iniciará el programa como administrador, además que el programa quedará compilado con el nuevo manifiesto y cuando lo inicies se iniciará con privilegios de administrador.

Ahora aunque la carpeta esté abierta se podrá cambiar el atributo.







Título: Re: cifrar Carpetas
Publicado por: Tomas1982 en 5 Octubre 2016, 21:19 pm
Mi hermano muy bueno el comentario pero ya lo había probado  y no me resulto, y la idea es poder mover el resultado protegido para cualquier maquina y que no puedan ver el contenido sin mi permiso. Saludos  


Título: Re: cifrar Carpetas
Publicado por: okik en 6 Octubre 2016, 11:41 am
@Tomas1982  pues tienes lo razón he bloqueado una carpeta en un pendrive y en otro PC con misma versión de SO y se abre sin problemas.

Cuando dijiste "memoria" creía que te referías que la carpeta estaba en uso, en memoria. En cuyo caso se solucionaba ejecutando como administrador.

Pues se un truquillo, es bastante malo, pero por lo menos un usuario novato no sabrá como abrir la carpeta, a no ser que busque o se informe de como.

Solo conozco una manera "portable" de mantener la carpeta protegida y es usando un archivo Desktop.ini en el interior de la carpeta.

Lo editas con esto:

Código:
[.ShellClassInfo]
CLSID={b8cdcb65-b1bf-4b42-9428-1dfdb7ee92af}

guardas y luego la carpeta la tienes que cambiar el atributo a System. Es decir a carpeta del sistema. Puedes usar API usando SetFileAttributes  y  la constante Const FILE_ATTRIBUTE_SYSTEM = &H4 y para quitarle el atributo FILE_ATTRIBUTE_NORMAL


con Net sería:
Código:
        Dim Attributes As FileAttribute = FileAttribute.System
        FileSystem.SetAttr(strDirectorio, Attributes)

Pero ya ves lo fácil que se puede quitar el atributo. Incluso se puede con la consola y además será accesible desde cualquier sistema que no sea windows.

Lo bueno es que sería portable.

De haber una forma de hacer lo que pides, que yo también estuve buscando hace tiempo, debe ser cambiando el atributo de la carpeta  como hace SetFileAttributes.

Un día lo conseguí, pero no se como lo hice. Hice tantas tonterías que no se que es lo que hizo que una carpeta fuera completamente inaccesible incluso fuera de Windows, no había manera. Pero hice tantos cambios y tantas tonterías que no se que fue lo que cambió la carpeta a ese estado. O sea que poderse se puede.







Título: Re:
Publicado por: BlackBlex en 6 Octubre 2016, 14:47 pm
¿Que tal si comprimes la carpeta y sobre este lo encriptas como archivo?
No te sirve así?

Enviado desde mi MotoG3 mediante Tapatalk


Título: Re:
Publicado por: okik en 6 Octubre 2016, 14:53 pm
¿Que tal si comprimes la carpeta y sobre este lo encriptas como archivo?
No te sirve así?

Enviado desde mi MotoG3 mediante Tapatalk
No no le servirá porque el contenido de la carpeta puede ser relativamente grande según el programa en el que desea aplicar esa función.  Eso podría demorar mucho tiempo ya que el hace un listado de archivos que contengan una determinada extensión en un número indeterminado de directorios y se copian en dicha carpeta. Con lo cual si hay 1532 archivo por ejemplo de tipo *.exe, pues tardaría bastante.


Título: Re:
Publicado por: Eleкtro en 6 Octubre 2016, 17:21 pm
No no le servirá porque el contenido de la carpeta puede ser relativamente grande según el programa en el que desea aplicar esa función.  Eso podría demorar mucho tiempo ya que el hace un listado de archivos que contengan una determinada extensión en un número indeterminado de directorios y se copian en dicha carpeta. Con lo cual si hay 1532 archivo por ejemplo de tipo *.exe, pues tardaría bastante.

Solamente en caso de que se le aplique la compresión. Se puede "comprimir" en modo de almacenamiento (storage) sin compresión alguna, lo que no demora absolutamente nada en comparación.

Saludos!


Título: Re:
Publicado por: okik en 6 Octubre 2016, 17:42 pm
Solamente en caso de que se le aplique la compresión. Se puede "comprimir" en modo de almacenamiento (storage) sin compresión alguna, lo que no demora absolutamente nada en comparación.

Saludos!
...y cifrarlo luego si que tardaría ¿no?

Bueno acabo de probar por curiosidad comprimir sin compresion, pero tarda igual ¿a qué te refieres?

si se trataso por ejemplo, hipotéticamente, de un troyano que va a copiar X archivos en una carpeta y bloquearla, hiptéticamente, y no quieres que el usuario se entere..... a eso me refería, no se trata que tarde 1 minuto de 5 en comparación si no que no tarde nada, de nada.


Título: Re:
Publicado por: Eleкtro en 6 Octubre 2016, 19:05 pm
acabo de probar por curiosidad comprimir sin compresion, pero tarda igual ¿a qué te refieres?

Ejemplo en WinRAR:
(http://i.imgur.com/XD0znfP.png)
( zip, store, y contraseña establecida. )

Archivos a comprimir: 160
Tamaño total de los archivos: 2 1 GB aprox.
Tiempo transcurrido para la "compresión": (menos de) 2 segundos aprox.

Solo tarda lo que se tardan en copiar los archivos, puesto que no se realiza compresión, de ahí mis palabras: "no tarda nada en absoluto, en comparación".

...y cifrarlo luego si que tardaría ¿no?

No, al establecer una contraseña se añade información/metadatos al archivo comprimido.

Saludos!


Título: Re:
Publicado por: okik en 6 Octubre 2016, 19:22 pm
Ejemplo en WinRAR:
(http://i.imgur.com/XD0znfP.png)
( zip, store, y contraseña establecida. )

Archivos a comprimir: 160
Tamaño total de los archivos: 2 1 GB aprox.
Tiempo transcurrido para la "compresión": (menos de) 2 segundos aprox.

Solo tarda lo que se tardan en copiar los archivos, puesto que no se realiza compresión, de ahí mis palabras: "no tarda nada en absoluto, en comparación".

No, al establecer una contraseña se añade información/metadatos al archivo comprimido.

Saludos!

Eso he hecho yo con el winrar y me tarda. no se, tendrás un ordenador más potente. no se.
añado: no tengo la opción "store", tengo "no comprimir", que supongo que sería el equivalente

De todos modos él tendría que tener instalado el winrar y usar comandos. Sigo sin verlo.


1 GB en 2 s, madre mía tu tienes uno de la NASA por lo menos XD
¿Usas SSD? imagino que si. No puedes esperar que todos tengan una compu como al tuya


Título: Re:
Publicado por: Eleкtro en 6 Octubre 2016, 19:38 pm
Eso he hecho yo con el winrar y me tarda. no se, tendrás un ordenador más potente. no se.

1 GB en 2 s, madre mía tu tienes uno de la NASA por lo menos XD
¿Usas SSD? imagino que si. No puedes esperar que todos tengan una compu como al tuya

No, no uso SSD, tengo un SATA normal, no se que decirte, no me llega ni a 2 segundos para realizar esa operación, en general deberías notar la diferencia y mucho, puesto que lo que normalmente te tardaria en comprimir 60 segundos, de esta manera no tarda ni 3.



De todos modos él tendría que tener instalado el winrar y usar comandos. Sigo sin verlo.

No es necesario, yo solo he puesto un ejemplo aleatorio (lo más rápido que tenía a mano) para demostrar lo que te expliqué, pero se puede implementar facilmente utilizando librerías de compresión para .NET, como DotNetZip o SevenZipSharp, ambas soportan la "no compresión" y el cifrado.

También se puede recurrir al namespace System.IO.Compression, soporta la "no compresión", pero desconozco si soporta el cifrado.

Saludos!


Título: Re:
Publicado por: okik en 6 Octubre 2016, 19:47 pm
... de esta manera no tarda ni 3.

Perdona que insista, pero es que lo dices como si fuera una constante universal o algo así. Es relativo depende del ordenador. No se si trabajas en reparación de ordenadores, si es así te invito a que pruebes con diferentes compus que tengas a mano de diversos clientes a ver que pasa.

Si el autor del post va a usar el programa para él con su propia compu y se le comprime 1GB en 2s, estupendo. Pero si lo va a usar en otros ordenadores, pues vamos en el mío me sale la barrita y se tira más de un minuto. Lo he probado en un portatil del 2008, o sea que tiene ya 8 añitos.



y termino porque es tontería discutir por algo que es obvio  :P




Título: Re:
Publicado por: Eleкtro en 6 Octubre 2016, 19:59 pm
Perdona que insista, pero es que lo dices como si fuera una constante universal o algo así. Es relativo depende del ordenador.

Si el autor del post va a usar el programa para él con su propia compu y se le comprime 1GB en 2s, estupendo. Pero si lo va a usar en otros ordenadores, pues vamos en el mío me sale la barrita y se tira más de un minuto. Lo he probado en un portatil del 2008, o sea que tiene ya 8 añitos.
y termino porque es tontería discutir por algo que es obvio  :P

Mejor que termines, por que como tu has dicho es absurdo discutir esto y tener que demostrarte como funcionan las cosas para luego recibir estas respuestas críticonas sin sentido.

Vamos a ver, si en un PC, sea el que sea, tarda un tiempo determinado "X" con compresión, entonces en ese PC (relativamente a su potencia pues claro está joder, los hay más lentos y más rápidos), sin la compresión tardará 60 veces menos que "X" (60 veces por decir algo, puede que más, o que menos) puesto que entre comprimir y solo copiar si que existe una constante de velocidad, la velocidad de escritura del disco (relativa a los demás factores del PC), ¿lo entiendes o no lo entiendes?, pues ya está, intenta no tergiversar mis palabras, puesto que me parece que se entendió a la perfección la primera vez.

Además de algo tan obvio, si yo digo que tengo un HDD normalito, y que me tarda eso en copiar, entonces es una buena base para tomar como punto de comparación al decirte que te debería tardar más o menos lo mismo, 2 segundos aprox., puesto que tu PC y HDD también será normalito al fin y al cabo (como tu mismo has dicho), ¿se entiende ahora o sigues sin querer entenderlo?, y aun tardría menos la segunda copia y las copias posteriores (siempre que sean consecutivas) debido al caching que se hace a los archivos de la copia anterior.

Saludos!



Título: Re: cifrar Carpetas
Publicado por: Tomas1982 en 6 Octubre 2016, 20:50 pm
Discúlpeme, pero la cuestión no es discernir en que si esta bien o no, la cuestión es  tratar de buscar la solución mas apropiada y que les sirva a todos los interesados del foro. Realmente cundo les hice la pegunta pensé en la herramienta Hide folder que protege las carpetas sin ocupar tiempo. Que si ya esta hecho, de alguna manera se pudiera implementar en VB.net. En cuanto a la opción que proponen comprimiendo lo probare para ver si me resulta, la cuestión es que trabajo hasta con PC pentium 4 las que ya son un poco obsoletas. Saludos a ambos.  


Título: Re: cifrar Carpetas
Publicado por: Lekim en 7 Octubre 2016, 11:16 am
Hola

 A mi también me gustaría saber como bloquear una directorio. De acuerdo con Tomas1982, desviar el objetivo a comprimir y búscate la vida pues no está bien. Entré pensando que alguien aportó la solución y me encuentro que aparte de lo que ha aportado okik, ¿la solución es comprimir? eso es esconder el bulto.

He leído los comentarios y a mí me tarda en comprimir (sin comprimir) 1.39 gb 2 min 53s con Winrar y 3 min con WinZip

Mi PC me costó 150 euros, lo compré por piezas, lo más básico, con CPU AMD, tiene 4 años. Lo máximo que permite es Windows 7. Queda claro entonces que esto es así y ya, no discutan más jaja. Rectificar es de sabios.

Para aclarar un poco el asunto os comento lo siguiente. Habéis nombrado los discos duros pero tienen en cuenta otros factores como la CPU, memoria, componentes, tecnología. Es de lógica que todos los ordenadores no procesan el  mismo trabajo igual de rápido. La CPU se ocupa del control y el proceso de datos en las computadoras. Teniendo en cuenta esto y otros factores como chips, memoria y tecnologías que ayudan o  simplifican el trabajo de la CPU pues es lógico pensar que no todos los ordenadores tengan una tecnología y una CPU que procese igual de rápido una misma tarea. No te va a trabajar igual un ordenador de 98 que otro del 2003 que otro de 2016. La tecnología mejora con los años y mejoran en rapidez a  la hora de ralizar la misma tarea.

También hay que tener en cuenta la ocupación de la CPU y la memoria a la hora de realizar un tarea

Comprimir tampoco me parece buena idea.

Tomas1982, en cuanto a bloquear un directorio, he buscado en Google y hay programas que lo hacen. Entonces se puede, pero creo que corresponde más al foro de ingeniería inversa. No creo que NET haga esas cosas, a no ser que se use código no administrado por Net Framework.


S2s


Título: Re: cifrar Carpetas
Publicado por: Eleкtro en 7 Octubre 2016, 18:11 pm
A mi también me gustaría saber como bloquear una directorio. De acuerdo con Tomas1982, desviar el objetivo a comprimir y búscate la vida pues no está bien. Entré pensando que alguien aportó la solución y me encuentro que aparte de lo que ha aportado okik, ¿la solución es comprimir? eso es esconder el bulto.

El usuario @BlackBlex, quien aportó la idea de la compresión, es tan válida como cualquier otra idea, puesto que te guste o no es una solución que resuelve el problema. De hecho, como un directorio no es más que una colección de archivos, pongo muy en duda que exista una manera más sencilla que la solución de la compresión, o el packaging mejor dicho, sin compresión, es decir, copiar los archivos y unirlos/empacarlos en un solo archivo, como un archivo comprimido.

Por supuesto una solución más profesional pero que requeriría muchísimo tiempo de desarrollo, sería idear una solución basada en el desarrollo de un servicio crítico de Windows + una extensión de shell, la extensión nos serviría para agregar opciones al menú contextual de directorios con las que poder asignar una contraseña (cifrar y descifrar) haciendo click derecho sobre un directorio, y el servicio de Windows se encargaría de hacerle un api-hook a las funciones internas implicadas del proceso Explorer y las llamadas a las funciones Win32 en general (y de todos los demás procesos activos) para prohibir cualquier tipo de intento de lectura a la carpeta mientras tenga una contraseña especificada y administrada por nuestro servicio crítico, evitando así la necesidad de copiar archivos o comprimir, pero logicamente esto llevaría bastantes meses de desarrollo y ni yo ni nadie estará dispuesto a regalar su tiempo para desarrollarlo, así que el packer en mi opinión sigue siendo la opción más sensata, realista, y sencilla:

(http://i.imgur.com/d4fFJxd.png)

Aparte de todo esto, como información adicional, según parece la API de Windows expone la función "EncryptFile", la cual según la documentación de Microsoft sirve tanto para cifrar un archivo como una carpeta, esta función debería corresponder a la funcionalidad de cifrado que podemos hacer uso de forma guiada en la UI de Windows, es decir, una cifrado sin contraseña (como era de esperar).
Si indagamos un poco más en la extensa documentación de MSDN (cosa que no es mi labor hacer, pero bueno, ya que algunos usuarios sois tan jodidamente críticones y no os conformais con una sola prueba) encontramos un articulo titulado "Encrypted Files and User Keys" y la función "SetUserFileEncryptionKey" + "AddUsersToEncryptedFile", sería la manera de poder utilizar una contraseña personalizada para nuestro directorio cifrado mediante "EncryptFile", sin embargo, podemos comprobar que el modo de empleo para este tipo de implementación no sería lo más adecuado, puesto que se basa en el uso de certificados de usuario, así que luego cuando llamesemos a la función "DecryptFile", ésta decidiría automaticamente si el directorio se debe descifrar o no según el certificado y no como debería ser según una contraseña que introdujesemos al momento de intentar descifrar la carpeta, así que en un principio a mi modo de ver resulta muy engorroso y nada práctico como solución para este tipo de implementación de un algoritmo de protección de carpetas por contraseña.

En la librería de clases de .NET podemos encontrar la función "System.IO.File.Encrypt()", pero al parecer (según la descripción) solo funciona para archivos y no usa contraseñas de ningún tipo (puesto que será un wrapper de la función Win32 "EncryptFile" y ya está), y tampoco hay un equivalente para cifrar directorios en el namespace "System.IO.Directory"

Luego también está el namespace "System.Security.Cryptography" que nos permite utilizar varios algoritmos de hashing, SHA, MD, y de cifrado, AES, ROT, etc (tengo varias implementaciones de distintos algoritmos de cifrado con contraseña en mi librería gratuita ElektroKit, en el namespace "Elektro.Core.Cryptography.Tools.CryptoUtil", por si alguien le interesa), pero no creo que esto nos sirviese para nada util, puesto que creo que seguiriamos teniendo que copiar el contenido original para generar un nuevo archivo, y tendriamos que desarrollar un loader/unpacker intermedario para poder introducir la contraseña cifrada mediante esta meteodología, muy poco práctico.

Fuentes:
  • Handling Encrypted Files and Directories - MSDN (https://msdn.microsoft.com/en-us/library/aa365005%28v=vs.85%29.aspx)
  • Encrypted Files and User Keys - MSDN (https://msdn.microsoft.com/en-us/library/aa364019%28v=vs.85%29.aspx)
  • EncryptFile function - MSDN (https://msdn.microsoft.com/en-us/library/aa364021%28v=vs.85%29.aspx)
  • DecryptFile function - MSDN (https://msdn.microsoft.com/en-us/library/aa363903%28v=vs.85%29.aspx)



Dicho esto, @Lekim, como te conozco de sobra y se que tipo de persona eres (aunque al menos ahora no te haces el anónimo-valiente en el foro para insultarme), y se por donde pretendes que vayan los tiros, te recuerdo que yo lo único que hice fue aclarar un detalle del comentario que hizo @Okik, con el fin de dar a conocer la verdad de una información incorrecta que se dió por su parte, creo que es algo positivo corregir los detalles para que los demás puedan tomar en cuenta la nueva información dada en ese tipo de correccinones, pero a raíz de eso @okik me preguntó algo con esas formas criticonas que ya van pareciendose una costumbre como tus costumbres Lekim, y en fin, simplemente acabé dando información adicional sobre como se puede aplicar la compresión, NADA MÁS, yo no sugerí el método de la compresión, pero aun sin haberlo hecho, es una opción muy sensata, quizás la que más.

El resto de lo que me has comentado sobre tu PC y que te tarda 2 minutos y etc, mira, paso de decir que no me creo nada de lo que me digas por que que me parece que tus comentarios solo son con intención de intentar fastidiarme sin más y hacer creer que yo miento o algo, así que mejor te lo explicaré y lo demostraré con un video, no quiero seguir mal gastando mis palabras contigo:
0AHMPct6ljM

Saludetes.