online encriptar encriptacion desencriptar criptografia con como cifrado archivos c# vb6 cryptography encryption-symmetric

encriptar - Criptografía AES en vb6 yc#



encriptar y desencriptar rsa en java (2)

Me parece que en la muestra de VB6 está especificando CRYPT_NO_SALT, que creo que da como resultado que no se use un vector de inicialización. Es de suponer que esto es todo ceros, pero no estoy seguro.

Sin embargo, en el código C # se obtienen bytes para el texto ASCII "0000000000000000" que no es lo mismo que una matriz de bytes del número cero {0, 0, 0, 0, ... 0} ya que el carácter ''0'' es igual al número 48 en ASCII (ver: http://www.asciitable.com/ ). Creo que esta es probablemente la fuente de tus problemas.

Necesito un algoritmo .NET (idealmente C) que produzca los mismos resultados que vb6 que hice para cifrar y decrypt archivos binarios. He estado intentando cazar el código durante una semana y he tenido poco éxito.

Empecé con Cómo encriptar una cadena en VB6 descifrar VB.NET pero solo era una solución a medias y utilizaba RC2 lugar de AES . Después de tocar un poco, obtuve mi código vb6 para trabajar en AES pero no puedo encontrar la manera de obtener c# para producir los mismos resultados. Creo que tiene que ver con la forma en que estoy haciendo mi Key y IV . He estado revisando los Servicios Criptográficos mis intentos se pueden dividir en dos tipos básicos. Uno donde he probado PasswordDeriveBytes.CryptDeriveKey y trato de hacerlo funcionar con aes . Sin éxito en absoluto. Y prueba donde traté de imitar su comportamiento. A continuación publicaré mi código vb6 y mi intento más cercano de c# . No puedo decir con 100% de certeza que el vb6 es perfecto, por lo que si hay que hacer cambios allí, estoy abierto a ello. Sé que hay una forma de utilizar p invocar y sé que hay una manera de hacer que .net dll sea ​​llamado desde mis vb apps . Preferiría no ir por ese camino.

Función VB6

Public Function Crypt_File(PathToSourceFile As String, PathToDestFile As String, Password As String, HowTo As CryptMethod) As Boolean Const FName As String = "mdlCryptography.Encrypt_file" Dim CryptoContext As Long Dim strProvider As String Dim HashHnd As Long Dim CrypKey As Long Dim Step As Integer Dim CryptBuff As String Dim InFileNum As Long, OutFileNum As Long Dim BytesRemaining As Long, CurrentBufferSize As Long Dim MAX_BUFFER_SIZE As Long Dim DoCryptFinalise As Long Dim Buff As String On Error GoTo Trap: Step = 10 Crypt_File = False If PathToSourceFile = PathToDestFile Then '' Err.Raise 334, FName, "Sourse and Dest Path are the same" End If MAX_BUFFER_SIZE = (2 ^ 20) * 100 ''100 MB Buff = vbNullChar strProvider = MS_ENH_RSA_AES_PROV_A & vbNullChar If Not CBool(CryptAcquireContext(CryptoContext, ByVal Buff, ByVal strProvider, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) Then Err.Raise 33410, FName, "Unable to Acquire Context: " & MS_ENH_RSA_AES_PROV_A End If If Not CBool(CryptCreateHash(CryptoContext, CALG_SHA_256, ByVal 0&, ByVal 0&, HashHnd)) Then Err.Raise 33420, FName, "Unable to Create a hash object. " & MS_ENH_RSA_AES_PROV_A End If If Not CBool(CryptHashData(HashHnd, Password, Len(Password), ByVal 0&)) Then Err.Raise 33430, FName, "Unable to Hash password. " End If If Not CBool(CryptDeriveKey(CryptoContext, CALG_AES_256, HashHnd, ByVal CRYPT_NO_SALT, CrypKey)) Then Err.Raise 33440, FName, "Unable to Derive Key. " End If ''Clear HashHnd If HashHnd <> 0 Then Call CryptDestroyHash(HashHnd) End If HashHnd = 0 ''Prep Data For encryption DoCryptFinalise = 0 InFileNum = FreeFile Step = 20 Open PathToSourceFile For Binary Access Read As #InFileNum If LenB(Dir$(PathToDestFile)) > 0 Then Kill PathToDestFile End If OutFileNum = FreeFile Step = 25 Open PathToDestFile For Binary Access Write As #OutFileNum BytesRemaining = LOF(InFileNum) ''Loop through File Chunks Do While BytesRemaining > 0 If BytesRemaining >= MAX_BUFFER_SIZE Then CurrentBufferSize = MAX_BUFFER_SIZE Else CurrentBufferSize = BytesRemaining DoCryptFinalise = 1 End If Buff = String$(CurrentBufferSize, vbNullChar) Get #InFileNum, , Buff If HowTo = CryptMethod.Encrypt Then CryptBuff = EncryptBuffer(CrypKey, DoCryptFinalise, Buff) Else CryptBuff = DecryptBuffer(CrypKey, DoCryptFinalise, Buff) End If Put #OutFileNum, , CryptBuff BytesRemaining = BytesRemaining - CurrentBufferSize Loop Close #InFileNum Close #OutFileNum Crypt_File = True GoTo Fin Trap: Crypt_File = False If Step = 20 Then Close #InFileNum End If If Step = 25 Then Close #InFileNum Close #OutFileNum End If Err.Raise Err.Number, Err.source, Err.Description Fin: If CrypKey <> 0 Then Call CryptDestroyKey(CrypKey) End If If HashHnd <> 0 Then Call CryptDestroyHash(HashHnd) End If End Function Private Function EncryptBuffer(CrypKey As Long, DoCryptFinalise As Long, Buff As String) As String Dim EncDataLength As Long, EnctBuffLen As Long Dim CryptBuff As String EncDataLength = Len(Buff) EnctBuffLen = EncDataLength + AES_BLOCK_SIZE CryptBuff = String$(EnctBuffLen, vbNullChar) LSet CryptBuff = Buff If Not CBool(CryptEncrypt(CrypKey, ByVal 0&, ByVal DoCryptFinalise, ByVal 0&, CryptBuff, EncDataLength, EnctBuffLen)) Then '' Close #InFileNum '' Close #OutFileNum Err.Raise 33450, "mdlCryptography.EncryptBuffer", "Encryption Error" End If EncryptBuffer = Left$(CryptBuff, EncDataLength) End Function Private Function DecryptBuffer(CrypKey As Long, DoCryptFinalise As Long, Buff As String) As String Dim EncDataLength As Long Dim CryptBuff As String EncDataLength = Len(Buff) CryptBuff = String$(EncDataLength, vbNullChar) LSet CryptBuff = Buff If Not CBool(CryptDecrypt(CrypKey, ByVal 0&, ByVal DoCryptFinalise, ByVal 0&, CryptBuff, EncDataLength)) Then '' Close #InFileNum '' Close #OutFileNum Err.Raise 33450, "mdlCryptography.DecryptBuffer", "Decryption Error" End If DecryptBuffer = Left$(CryptBuff, EncDataLength) End Function

c # Es muy refinado

private void Crypt(bool DoEn) { int Rfc2898KeygenIterations = 100; int AesKeySizeInBits = 128; byte[] rawPlaintext ;//= System.Text.Encoding.Unicode.GetBytes("This is all clear now!"); byte[] cipherText = null; byte[] plainText = null; using (Aes aes = new AesManaged()) { int KeyStrengthInBytes = aes.KeySize / 8; SHA256 MySHA = new SHA256Cng(); MySHA.Initialize(); plainText = Encoding.ASCII.GetBytes(txtPassword.Text); aes.Key = MySHA.ComputeHash(plainText ); aes.IV = Encoding.ASCII.GetBytes("0000000000000000"); if (DoEn) { //using (FileStream fs = new FileStream(txtOut.Text,FileMode.CreateNew )) using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write)) { //using (StreamReader myFile = new StreamReader(txtIn.Text)) //{ // rawPlaintext = System.Text.Encoding.ASCII.GetBytes(myFile.ReadToEnd()); rawPlaintext = File.ReadAllBytes(txtIn.Text); cs.Write(rawPlaintext, 0, rawPlaintext.Length); //} } cipherText = ms.ToArray(); File.WriteAllBytes(txtOut.Text, cipherText); } } else { //using (FileStream fs = new FileStream(txtIn.Text, FileMode.CreateNew)) using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write)) { //using (StreamReader myFile = new StreamReader(txtOut.Text)) //{ //string s = myFile.r.ReadToEnd(); rawPlaintext = File.ReadAllBytes(txtOut.Text); //System.Text.Encoding.ASCII.GetBytes(s); //cipherText = new int[rawPlaintext.Length]; cs.Write(rawPlaintext, 0, rawPlaintext.Length); //cs.Write(cipherText, 0, cipherText.Length); //} } cipherText = ms.ToArray(); File.WriteAllBytes(txtIn.Text, cipherText); } } } //string s = System.Text.Encoding.ASCII.GetString(plainText); //Console.WriteLine(s); }


Su vector aquí producirá un resultado diferente de lo que podría esperar:

aes.IV = Encoding.ASCII.GetBytes("0000000000000000");

Esto devolverá una matriz de bytes que consta de 48, no de 0.

Simplemente puede inicializar una matriz de bytes en su lugar de esta manera:

aes.IV = new byte() {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};