You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求将指定C# AES加密函数转换为等效JavaScript代码

把C# AES加密函数转换为JavaScript版本

原C#加密函数

C#代码实际使用AES-CBC算法,密钥为Base64格式,IV是16字节全0数组,明文以UTF-8编码加密,最终输出Base64格式密文:

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

class Program
{
    static void Main()
    {
        string sonuc = OpenSSLEncryptApi("plainText","GSTEGSTEjdfheyhdHSHSHSHDHHDHmdjjdn12ndndn5r=");
        Console.WriteLine(sonuc);
    }   
    public static string OpenSSLEncryptApi(string plainText, string apikey)
    {
        byte[] iv = new byte[16]; // 16字节全0数组
        byte[] array;
        using (Aes aes = Aes.Create())
        {
            aes.Key = Convert.FromBase64String(apikey); // 密钥Base64解码
            aes.IV = iv;
            ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
            using (MemoryStream memoryStream = new MemoryStream())
            {
                using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter streamWriter = new StreamWriter((Stream)cryptoStream))
                    {
                        streamWriter.Write(plainText); // 默认UTF-8编码写入明文
                    }
                    array = memoryStream.ToArray();
                }
            }
        }
        return Convert.ToBase64String(array);
    }
}

初始尝试的JavaScript代码

最初错误使用TripleDES算法,且密钥处理逻辑不符合C#逻辑:

var text = 'plainText';
var key = "GSTEGSTEjdfheyhdHSHSHSHDHHDHmdjjdn12ndndn5r=";

key = CryptoJS.enc.Utf16LE.parse(key);
//key = CryptoJS.dec.Base64.parse(key);

key = CryptoJS.MD5(key)
key.words.push(key.words[0], key.words[1]);

//var options = {mode: CryptoJS.mode.ECB};//CBC
var options = {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7};

var textWordArray = CryptoJS.enc.Utf16LE.parse(text);

var encrypted = CryptoJS.TripleDES.encrypt(textWordArray, key,options);
var base64String = encrypted.toString()

console.Log(base64String);

修改后的JavaScript代码(仍有问题)

改为AES算法,但IV处理错误(用字符串解析而非全0字节数组):

function aesEncrypt (data) {
   const key = 'GSTEGSTEjdfheyhdHSHSHSHDHHDHmdjjdn12ndndn5r=';
   const iv = '0000000000000000';
   
   const cipher = CryptoJS.AES.encrypt(data, CryptoJS.enc.Utf8.parse(key), {
       iv: CryptoJS.enc.Utf8.parse(iv), // parse the IV 
       padding: CryptoJS.pad.Pkcs7,
       mode: CryptoJS.mode.CBC
   })
   
   // e.g. B6AeMHPHkEe7/KHsZ6TW/Q==
   return cipher.toString()
}

正确的JavaScript实现

要和C#结果一致,需严格匹配以下关键点:

  • 密钥:对Base64格式的密钥解码,而非直接解析为UTF-8
  • IV:生成16字节全0数组(对应C#的new byte[16])
  • 明文:使用UTF-8编码(C# StreamWriter默认编码)
  • 算法:AES-CBC + PKCS7填充

正确代码如下:

function aesEncrypt(plainText, apiKey) {
    // 解码Base64格式的密钥
    const key = CryptoJS.enc.Base64.parse(apiKey);
    // 生成16字节全0的IV
    const iv = CryptoJS.lib.WordArray.create(16);
    
    // 用UTF-8编码明文
    const textWordArray = CryptoJS.enc.Utf8.parse(plainText);
    
    // AES-CBC加密,PKCS7填充
    const encrypted = CryptoJS.AES.encrypt(textWordArray, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    
    // 返回Base64格式密文
    return encrypted.toString();
}

// 测试示例
const result = aesEncrypt('plainText', 'GSTEGSTEjdfheyhdHSHSHSHDHHDHmdjjdn12ndndn5r=');
console.log(result); // 输出与C#版本一致的密文

内容的提问来源于stack exchange,提问作者Nuri Erginer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 20:30:33