C与JavaScript互转加密解密代码实践探究
- 行业动态
- 2025-03-02
- 1
在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>