Преобразование шифрования / дешифрования C # в PHP шифрование / дешифрование и наоборот - PullRequest
0 голосов
/ 02 февраля 2019

Итак, я сделал настольное приложение (до веб-сайта), где я сделал логин и систему регистрации в нем и, конечно же, шифрование.И теперь у меня появилась идея сделать сайт с системой регистрации и входа в систему, потому что я думал, что это будет проще, но проблема в том, что я сделал сайт после настольного приложения, что означает, что я сделал шифрование / дешифрование на C #до веб-сайта, и я хочу преобразовать шифрование C # в PHP (если это возможно), чтобы соответствовать информации о пользователях моей базы данных (пароль, имя пользователя, почта и т. д.).Это мой код шифрования и дешифровки C #: Шифрование:

    private static byte[] AesEncrypt(byte[] bytesToBeEncrypted, byte[] 
    passwordBytes)
    {
        byte[] encryptedBytes;
        var saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }; // min 8

        using (var ms = new MemoryStream())
        {
            using (var aes = new RijndaelManaged())
            {
                aes.KeySize = 256;
                aes.BlockSize = 128;

                var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
                aes.Key = key.GetBytes(aes.KeySize / 8);
                aes.IV = key.GetBytes(aes.BlockSize / 8);

                aes.Mode = CipherMode.CBC;

                using (var cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
                    cs.Close();
                }

                encryptedBytes = ms.ToArray();
            }
        }

        return encryptedBytes;
    }

Расшифровка:

            private static byte[] AesDecrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes)
    {
        byte[] decryptedBytes;
        var saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }; // min 8 

        using (var ms = new MemoryStream())
        {
            using (var aes = new RijndaelManaged())
            {
                aes.KeySize = 256;
                aes.BlockSize = 128;

                var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
                aes.Key = key.GetBytes(aes.KeySize / 8);
                aes.IV = key.GetBytes(aes.BlockSize / 8);

                aes.Mode = CipherMode.CBC;

                using (var cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
                    cs.Close();
                }

                decryptedBytes = ms.ToArray();
            }
        }

        return decryptedBytes;
    }

Метод, который я использую для шифрования данных:

            public static string Encrypt(string clearText, string password, byte[] salt = null)
    {
        var baPwd = Encoding.UTF8.GetBytes(password);
        var baPwdHash = SHA256.Create().ComputeHash(baPwd);
        var baText = Encoding.UTF8.GetBytes(clearText);
        byte[] baSalt;

                    baSalt = salt;
                    var baEncrypted = new byte[baSalt.Length + baText.Length];
                    for (var i = 0; i < baSalt.Length; i++)
                        baEncrypted[i] = baSalt[i];
                    EncryptionSalt = baSalt.ToString();
                    for (var i = 0; i < baText.Length; i++)
                        baEncrypted[i + baSalt.Length] = baText[i];
                    baEncrypted = AesEncrypt(baEncrypted, baPwdHash);
                    var result = Convert.ToBase64String(baEncrypted);
                    EncryptionSalt = baSalt.ToString();
                    return result;
                }

    }

Метод, которыйЯ использую для расшифровки данных:

            public static string Decrypt(string cipherText, string password)
    {
        var baPwd = Encoding.UTF8.GetBytes(password);
        var baPwdHash = SHA256.Create().ComputeHash(baPwd);
        var baText = Convert.FromBase64String(cipherText);
        var baDecrypted = AesDecrypt(baText, baPwdHash);
        const int saltLength = 12;
        var baResult = new byte[baDecrypted.Length - saltLength];
        for (var i = 0; i < baResult.Length; i++)
            baResult[i] = baDecrypted[i + saltLength];
        var result = Encoding.UTF8.GetString(baResult);
        return result;
    }

Пример использования шифрования C # в моем коде C #:

    Encryption.Encrypt(password, Encryption.RandomBytes().ToString(), salt));

И метод RandomBytes:

            public static byte[] RandomBytes()
    {
        const int saltLength = 12;
        var ba = new byte[saltLength];
        RandomNumberGenerator.Create().GetBytes(ba);
        return ba;
    }

Во-первыхМне нужно знать, возможно ли это, во-вторых, если кто-то хочет, чтобы вы могли привести пример шифрования в PHP или дать код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...