转换C#加密/解密到PHP加密/解密和周围的其他方法

时间:2019-02-02 20:32:17

标签: c# php mysql encryption

因此,我已经制作了一个桌面应用程序(在网站之前),当时我已经在其中进行了登录,注册系统以及课程的加密。现在我有了一个使用注册和登录系统创建网站的想法,因为我认为这会更容易,但是问题是我已经在桌面应用程序之后创建了网站,这意味着我已经进行了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加密示例或给我代码。

0 个答案:

没有答案