c#和avascript加解密之间的互转代码分享


在C#和JavaScript之间进行加解密互转,我们通常会选择一种通用的算法,比如AES(高级加密标准)。这里我将为你提供一个基本的示例,展示如何在C#和JavaScript中使用AES算法进行加密和解密,以实现数据的互转。

### C# 加密和解密

在C#中,我们可以使用`System.Security.Cryptography`命名空间下的`Aes`类来实现AES加密和解密。


using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

public class AesEncryption
{
    public static string Encrypt(string plainText, string key)
    {
        byte[] encrypted;

        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = Encoding.UTF8.GetBytes(key.Substring(0, 32));
            aesAlg.IV = Encoding.UTF8.GetBytes(key.Substring(32));

            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

            using (MemoryStream msEncrypt = new MemoryStream())
            {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(plainText);
                    }
                    encrypted = msEncrypt.ToArray();
                }
            }
        }

        return Convert.ToBase64String(encrypted);
    }

    public static string Decrypt(string cipherText, string key)
    {
        byte[] cipherBytes = Convert.FromBase64String(cipherText);

        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = Encoding.UTF8.GetBytes(key.Substring(0, 32));
            aesAlg.IV = Encoding.UTF8.GetBytes(key.Substring(32));

            ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

            using (MemoryStream msDecrypt = new MemoryStream(cipherBytes))
            {
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                    {
                        return srDecrypt.ReadToEnd();
                    }
                }
            }
        }
    }
}

### JavaScript 加密和解密

在JavaScript中,我们可以使用`crypto-js`库来执行AES加密和解密。首先,你需要通过npm或CDN引入`crypto-js`。


<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>

<script>
    function encrypt(text, secretKey) {
        var key = CryptoJS.enc.Utf8.parse(secretKey.substring(0, 32));
        var iv = CryptoJS.enc.Utf8.parse(secretKey.substring(32));

        var encrypted = CryptoJS.AES.encrypt(text, key, {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });

        return encrypted.toString();
    }

    function decrypt(ciphertext, secretKey) {
        var key = CryptoJS.enc.Utf8.parse(secretKey.substring(0, 32));
        var iv = CryptoJS.enc.Utf8.parse(secretKey.substring(32));

        var bytes = CryptoJS.AES.decrypt(ciphertext, key, {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });

        return bytes.toString(CryptoJS.enc.Utf8);
    }
</script>

注意,在上述C#和JavaScript示例中,我们使用了相同的密钥和IV(初始化向量),并且它们都是从同一个密钥字符串中分割出来的。在实际应用中,你可能需要更安全地管理密钥和IV,例如使用密钥管理系统(KMS)来存储和分发密钥。

另外,请注意在传输加密数据时,应确保密文和密钥的安全性,避免在不安全的通道上明文传输。