php – Código C# para descriptografar uma senha criptografada …

php - erro laravel: Classe alvo [validator] ...

Atualmente, estou desenvolvendo um novo sistema usando C# em minha organização que requer autenticação em um conjunto existente de credenciais de gestor. Essas credenciais de gestor são armazenadas em uma tábua de banco de dados com a senha já criptografada. Portanto para eu realizar essa autenticação eu precisaria criptografar a senha recebida ou descriptografar a senha do banco de dados usando a mesma criptografia.

O problema que estou enfrentando é que a criptografia usada anteriormente é a livraria de criptografia Codeigniter 3. Porquê é uma livraria e meu conhecimento de PHP não é dos melhores, estou tendo problemas para recriar essa criptografia/descriptografia em C#. Passei qualquer tempo tentando resolver esse problema antes de vir cá. No entanto, ao tentar descriptografar a senha, o programa aquém retorna “HMAC irrito”, o que significa que o HMAC calculado e o HMAC tirado da senha cifrada não correspondem. Ignorar essa verificação gera o erro “O preenchimento é irrito e não pode ser removido”.

Fiz algumas pesquisas sobre esses erros e há duas causas possíveis. Meu processo de descriptografia está incorrecto ou a chave de criptografia (masterKey) usada está errada. No momento, não consigo verificar a chave de criptografia em produção (atualmente usando a chave de criptografia do código-fonte UAT) devido a restrições, por isso estou me concentrando no meu código por enquanto.

Para reunir o que preciso de ajuda, preciso de ajuda para verificar se minha solução atual em C# pode descriptografar corretamente um texto criptografado usando a livraria de criptografia Codeigniter 3. Por obséquio, encontre meu código aquém.

Atualmente estou tentando descriptografar a senha do banco de dados, mas estou sincero para seguir a rota de criptografia de senha de ingressão, se isso for mais fácil.

Aquém está minha função de descriptografia:

public string Decrypt(string encryptedData)
{
    string plainText;
    // Decode the base64-encoded data
    byte[] decodedData = Convert.FromBase64String(encryptedData);
    // Extract HMAC and ciphertext
    int hmacLength = 64; // Assuming SHA-512 HMAC
    byte[] hmacBytes = new byte[hmacLength];
    Array.Copy(decodedData, 0, hmacBytes, 0, hmacLength);
    byte[] ciphertextBytes = new byte[decodedData.Length - hmacLength];
    Array.Copy(decodedData, hmacLength, ciphertextBytes, 0, Sua visita nos ajuda a continuar oferecendo o melhor para você!    byte[] hmacKey = HKDF(Encoding.UTF8.GetBytes(masterKey), "SHA512", null, 32, "authentication");
    // Validate HMAC
    using (var hmac = new HMACSHA512(Encoding.UTF8.GetBytes(masterKey)))
    
        result 
    // Decrypt the ciphertext
    byte[] keyBytes = HKDF(Encoding.UTF8.GetBytes(masterKey), "SHA512", null, 32, "encryption");
    byte[] iv = new byte[16]; // Assuming a 16-byte IV
    using (Aes aesAlg = Aes.Create())
    {
        aesAlg.Key = keyBytes;
        aesAlg.IV = iv;
        aesAlg.Mode = CipherMode.CBC;
 Sua visita nos ajuda a continuar oferecendo o melhor para você!       aesAlg.Padding = PaddingMode.PKCS7;
        ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
        using (MemoryStream msDecrypt = new MemoryStream(ciphertextBytes))
        {
            using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
            
        result 
        }
    }
    return plainText;
}

Aquém está a função HKDF:

private static byte[] HKDF(byte[] key, string digestAlgorithm, byte[] salt, int length, string info)
{
    using (var hmac = new HMACSHA512(key))
    {
        hmac.Key = key;
        // Initial HMAC
        byte[] prk = hmac.ComputeHash((salt ?? Array.Empty()).Concat(Encoding.UTF8.GetBytes(info ?? "")).ToArray());
        byte[] outputKey = new byte[length];
        int offset = 0;
        int blockIndex = 1;
        while (offset < length)
        {
            byte[] block = hmac.ComputeHash(prk.Concat(Encoding.UTF8.GetBytes(info + (char)blockIndex)).ToArray());
            Array.Copy(block, 0, outputKey, offset, Math.Min(block.Length, length - offset));
            offset += block.Length;
            blockIndex++;
        }
        return outputKey;
    }
}

Por último está a função AreEqualConstantTime:

private static bool AreEqualConstantTime(byte[] a, byte[] b)
{
    int result = a.Length ^ b.Length;
    for (int i = 0; i < a.Length && i < b.Length; i++)
    = a[i] ^ b[i];
    
    return result == 0;
}

Nascente código foi criado com base em referência on-line Sua visita nos ajuda a continuar oferecendo o melhor para você! observando o processo de criptografia/descriptografia do Codeigniter 3.

Tags:

Crédito: Natividade Original

Adriano Pina

Adriano Pina

Análise de Sistemas | SEO e Google Ads | Fundador da Loja Script PHP Aqui & Marca Shoslh de tecnologia

Especialista em transformar ideias em soluções digitais e acelerar o crescimento online.

Deixe um comentário

Tem perguntas? Nos envia sua mensagem 24/7!

(17) 99100-0874

Endereço & Contato

Centro, Interior de São Paulo
E-mail: [email protected]

Links Úteis
BAIXAR APP | SCRIPT PHP AQUI
Certificados
0
    0
    Seu carrinho
    Seu carrinho está vazio

    Usamos cookies para garantir que oferecemos a melhor experiência em nosso site. 

       

    X

    Clique em um de nossos representantes abaixo para conversar no WhatsApp ou envie um email para: 📧 [email protected]

    Precisa de ajuda fale conosco?