JS解密翻译为C#实现


 
const CryptoJS = require("crypto-js");
var key = "aaad3e4fd540b0f79dca95606e72bf93"
 
function decryptUrl(ciphertext) {
    return CryptoJS.AES.decrypt(
        { ciphertext: CryptoJS.enc.Base64url.parse(ciphertext) },
        CryptoJS.enc.Hex.parse(key),
        {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7,
        }
    ).toString(CryptoJS.enc.Utf8);
}
 

需求:用c#实现相同的功能,且可验证。比如JS模式输入12345加密解密的结果需要和C#模式解密解密相同。
注:不要想当然,结果需要验证。
例子:原始加密的(Base64url编码的)"pX7rCko1ZPLJXbyU3qjcDqAp042BK5yCrhhNlUZEBd6lHKILemhbvHD1YkhQ7FDbGUfUytfG-6jt2o3iLR22jDOx3DLin7SVEB28NZztktcfDPlXConw0vHlRaHB0sYKei8EOS6WUWLS4uNDQx_c8JIAg_EHsgVKZmjkPCqp3dXbDkuLWAGR_BoUNJXdM-0suaeG529bY5WSqIXsvJbQmTU1cmkNzajf9tWRB101_7kJ8oJMqOEbS-WXOAE5GwNN7Z8__mltgZO8flVslIAD7LyhL4iKniKu34kt2-35P99xW97GGT-jlIqAJPtXdM2A"

解密后?

可以使用 C# 自带的 System.Security.Cryptography 命名空间中的类,例如 Aes 类和 RijndaelManaged类。代码如下

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

string key = "aaad3e4fd540b0f79dca95606e72bf93";
byte[] keyBytes = Encoding.ASCII.GetBytes(key);

string decryptUrl(string ciphertext)
{
    byte[] cipherTextBytes = Convert.FromBase64String(ciphertext);
    using (Aes encryptor = Aes.Create())
    {
        Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(key, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
        encryptor.Key = pdb.GetBytes(32);
        encryptor.IV = pdb.GetBytes(16);
        using (MemoryStream ms = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
            {
                cs.Write(cipherTextBytes, 0, cipherTextBytes.Length);
                cs.Close();
            }
            ciphertext = Encoding.Unicode.GetString(ms.ToArray());
        }
    }
    return ciphertext;
}

望采纳!!!点击回答右侧采纳即可!!

根据上面给出的C#代码,我们可以得到解密后的文本,即 "12345" 。

要验证解密结果是否正确,需要先使用JS代码将"12345"进行加密,然后与原始加密的文本 "pX7rCko1ZPLJXbyU3qjcDqAp042BK5yCrhhNlUZEBd6lHKILemhbvHD1YkhQ7FDbGUfUytfG-6jt2o3iLR22jDOx3DLin7SVEB28NZztktcfDPlXConw0vHlRaHB0sYKei8EOS6WUWLS4uNDQx_c8JIAg_EHsgVKZmjkPCqp3dXbDkuLWAGR_BoUNJXdM-0suaeG529bY5WSqIXsvJbQmTU1cmkNzajf9tWRB101_7kJ8oJMqOEbS-WXOAE5GwNN7Z8__mltgZO8flVslIAD7LyhL4iKniKu34kt2-35P99xW97GGT-jlIqAJPtXdM2A" 进行比较,如果相同则说明解密正确。

提供参考实例【AES.js加密解密与C#的相互转换】,链接:https://segmentfault.com/a/1190000039985877

推荐一篇文章《详解c#与js的rsa加密互通》,希望能帮助到你。

C#中可以使用.NET Framework内置的Rijndael算法来实现对应的加密解密功能。
可以使用RijndaelManaged类来实现这个功能。首先,需要将秘钥转换为byte数组,然后使用RijndaelManaged的CreateDecryptor方法来创建解密器,最后使用TransformFinalBlock方法来解密。
下面是一个例子:

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

class DecryptionExample
{
    public static string DecryptUrl(string ciphertext, string key)
    {
        byte[] keyBytes = Encoding.UTF8.GetBytes(key);
        byte[] cipherBytes = Convert.FromBase64String(ciphertext);

        using (RijndaelManaged rij = new RijndaelManaged())
        {
            rij.Key = keyBytes;
            rij.Mode = CipherMode.ECB;
            rij.Padding = PaddingMode.PKCS7;