当前位置:首页 > 行业动态 > 正文

C与JavaScript互转加密解密代码实践探究

在C#和JavaScript之间进行加解密的互转,通常需要使用相同的加密算法和密钥。以下是一个示例代码,展示如何在C#和JavaScript之间进行AES加密和解密的互转:C#代码:,“ csharp,using System;,using System.IO;,using System.Security.Cryptography;,using System.Text;public class AesEncryption,{, public static string Encrypt(string plainText, string key), {, using (Aes aes = Aes.Create()), {, aes.Key = Encoding.UTF8.GetBytes(key);, aes.IV = new byte[16]; // 初始化向量, ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV); using (MemoryStream ms = new MemoryStream()), {, using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)), {, using (StreamWriter sw = new StreamWriter(cs)), {, sw.Write(plainText);, }, }, return Convert.ToBase64String(ms.ToArray());, }, }, },},` JavaScript代码:,` javascript,const crypto = require('crypto');function encrypt(text, key) {, const iv = Buffer.alloc(16, 0); // 初始化向量, const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(key), iv);, let encrypted = cipher.update(text, 'utf8', 'base64');, encrypted += cipher.final('base64');, return encrypted;,},“注意:为了确保互操作性,请确保在C#和JavaScript中使用相同的密钥和初始化向量(IV)。

在现代软件开发中,加解密操作是保障数据安全的重要手段之一,C#和JavaScript作为两种广泛使用的编程语言,各自提供了丰富的加解密库和方法,下面将详细分享C#和JavaScript之间的加解密互转代码,包括对称加密、非对称加密和哈希算法的实现方式及其应用场景。

C#中的加解密实现

对称加密(AES)

C#使用System.Security.Cryptography命名空间下的类来实现AES加密,以下是一个AES加密和解密的示例:

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
class Program
{
    static void Main()
    {
        string originalText = "Hello, World!";
        string key = "mySecretKey12345"; // 密钥长度应为16、24或32字节
        string iv = "myIV12345678901234"; // 初始化向量长度应为16字节
        // 加密
        string encryptedText = EncryptString(originalText, key, iv);
        Console.WriteLine("Encrypted: " + encryptedText);
        // 解密
        string decryptedText = DecryptString(encryptedText, key, iv);
        Console.WriteLine("Decrypted: " + decryptedText);
    }
    static string EncryptString(string plainText, string key, string iv)
    {
        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = Encoding.UTF8.GetBytes(key);
            aesAlg.IV = Encoding.UTF8.GetBytes(iv);
            aesAlg.Mode = CipherMode.CBC;
            aesAlg.Padding = PaddingMode.PKCS7;
            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);
                    }
                    return Convert.ToBase64String(msEncrypt.ToArray());
                }
            }
        }
    }
    static string DecryptString(string cipherText, string key, string iv)
    {
        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = Encoding.UTF8.GetBytes(key);
            aesAlg.IV = Encoding.UTF8.GetBytes(iv);
            aesAlg.Mode = CipherMode.CBC;
            aesAlg.Padding = PaddingMode.PKCS7;
            ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
            using (MemoryStream msDecrypt = new MemoryStream(Convert.FromBase64String(cipherText)))
            {
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                    {
                        return srDecrypt.ReadToEnd();
                    }
                }
            }
        }
    }
}

非对称加密(RSA)

C#使用System.Security.Cryptography命名空间下的类来实现RSA加密,以下是一个RSA加密和解密的示例:

using System;
using System.Security.Cryptography;
using System.Text;
class Program
{
    static void Main()
    {
        string originalText = "Hello, World!";
        string publicKeyXml = null;
        string privateKeyXml = null;
        // 生成密钥对
        using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048))
        {
            publicKeyXml = rsa.ToXmlString(false); // 获取公钥
            privateKeyXml = rsa.ToXmlString(true); // 获取私钥
        }
        // 加密
        string encryptedText = EncryptString(originalText, publicKeyXml);
        Console.WriteLine("Encrypted: " + encryptedText);
        // 解密
        string decryptedText = DecryptString(encryptedText, privateKeyXml);
        Console.WriteLine("Decrypted: " + decryptedText);
    }
    static string EncryptString(string plainText, string publicKeyXml)
    {
        using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048))
        {
            rsa.FromXmlString(publicKeyXml);
            byte[] data = rsa.Encrypt(Encoding.UTF8.GetBytes(plainText), false);
            return Convert.ToBase64String(data);
        }
    }
    static string DecryptString(string cipherText, string privateKeyXml)
    {
        using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048))
        {
            rsa.FromXmlString(privateKeyXml);
            byte[] data = Convert.FromBase64String(cipherText);
            byte[] decryptedData = rsa.Decrypt(data, false);
            return Encoding.UTF8.GetString(decryptedData);
        }
    }
}

哈希算法(SHA-256)

C#使用System.Security.Cryptography命名空间下的类来实现SHA-256哈希,以下是一个SHA-256哈希的示例:

using System;
using System.Security.Cryptography;
using System.Text;
class Program
{
    static void Main()
    {
        string originalText = "Hello, World!";
        string hashedText = HashSHA256(originalText);
        Console.WriteLine("Hashed: " + hashedText);
    }
    static string HashSHA256(string text)
    {
        using (SHA256 sha256 = SHA256.Create())
        {
            byte[] bytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(text));
            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < bytes.Length; i++)
            {
                builder.Append(bytes[i].ToString("x2"));
            }
            return builder.ToString();
        }
    }
}

JavaScript中的加解密实现

对称加密(AES)

JavaScript使用crypto-js库来实现AES加密,以下是一个AES加密和解密的示例:

const CryptoJS = require("crypto-js");
let secretKey = 'mySecretKey123'; // 密钥长度应为16、24或32字节
let iv = 'myIV12345678901234'; // 初始化向量长度应为16字节
let originalText = 'Hello, World!';
let encryptedText = CryptoJS.AES.encrypt(originalText, secretKey).toString();
console.log('Encrypted:', encryptedText);
let decryptedText = CryptoJS.AES.decrypt(encryptedText, secretKey).toString(CryptoJS.enc.Utf8);
console.log('Decrypted:', decryptedText);

非对称加密(RSA)

JavaScript使用crypto模块来实现RSA加密,以下是一个RSA加密和解密的示例:

const crypto = require('crypto');
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { modulusLength: 2048 });
let originalText = 'Hello, World!';
let encryptedText = crypto.publicEncrypt({ key: publicKey, padding: crypto.constants.RSA_PKCS1_PADDING }, Buffer.from(originalText, 'utf8')).toString('base64');
console.log('Encrypted:', encryptedText);
let decryptedText = crypto.privateDecrypt({ key: privateKey, padding: crypto.constants.RSA_PKCS1_PADDING }, Buffer.from(encryptedText, 'base64')).toString('utf8');
console.log('Decrypted:', decryptedText);

哈希算法(SHA-256)

JavaScript使用crypto模块来实现SHA-256哈希,以下是一个SHA-256哈希的示例:

const crypto = require('crypto');
const hash = crypto.createHash('sha256');
hash.update('Hello, World!');let hashedText = hash.digest('hex');console.log('Hashed:', hashedText);

C#与JavaScript之间的加解密互转代码示例

1. C#加密后在JavaScript中解密

假设我们在C#中使用AES加密了一个字符串,现在我们需要在JavaScript中解密它,我们需要将加密后的字符串从C#传递到JavaScript环境,这里我们使用Base64编码来传输加密后的字符串。

C#端加密代码:

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Web; // 用于URL编码
class Program
{
    static void Main()
    {
        string originalText = "Hello from C#!";
        string key = "mySecretKey12345"; // 密钥长度应为16、24或32字节
        string iv = "myIV12345678901234"; // 初始化向量长度应为16字节
        string encryptedText = EncryptString(originalText, key, iv);
        string base64Encoded = HttpUtility.UrlEncode(encryptedText); // URL编码以便安全传输到前端
        Console.WriteLine("Encoded Encrypted Text: " + base64Encoded);
    }
    static string EncryptString(string plainText, string key, string iv)
    {
        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = Encoding.UTF8.GetBytes(key);
            aesAlg.IV = Encoding.UTF8.GetBytes(iv);
            aesAlg.Mode = CipherMode.CBC;
            aesAlg.Padding = PaddingMode.PKCS7;
            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);
                    }
                }
                return Convert.ToBase64String(msEncrypt.ToArray());
            }
        }
    }
}

JavaScript端解密代码:

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
<script>
let encryptedData = 'U2FsdGVkX1+5Z1pQZl4Vt0uF4q8j+g=='; // 这是从C#端接收到的加密后的字符串(已进行Base64解码)
let key = 'mySecretKey12345'; // 密钥长度应为16、24或32字节(与C#端一致)
let iv = 'myIV12345678901234'; // 初始化向量长度应为16字节(与C#端一致)
let bytes = CryptoJS.AES.decrypt(encryptedData, key);let decryptedData = bytes.toString(CryptoJS.enc.Utf8);console.log('Decrypted:', decryptedData);</script>
0