使用 C# 进行 AES 加密 使用 crypto-js 进行解密

2024-01-26

我正在尝试使用 C# 加密字符串并使用 Angular crypto-js 库解密它,但它给了我不同的输出。 我尝试了不同的 c# aes 加密实现,但 crypto-js 库无法解密 c# 中的加密数据。感谢您的任何帮助。

这是我的代码

程序.cs

 static void Main()
    {
        var r = EncryptString("exampleString", "examplePassword");
        Console.Write(r);
    }

 public static string EncryptString(string plainText, string passPhrase)
    {
        if (string.IsNullOrEmpty(plainText))
        {
            return "";
        }
        // generate salt
        byte[] key, iv;
        var salt = new byte[8];
        var rng = new RNGCryptoServiceProvider();
        rng.GetNonZeroBytes(salt);
        DeriveKeyAndIv(passPhrase, salt, out key, out iv);
        // encrypt bytes
        var encryptedBytes = EncryptStringToBytesAes(plainText, key, iv);
        // add salt as first 8 bytes
        var encryptedBytesWithSalt = new byte[salt.Length + encryptedBytes.Length + 8];
        Buffer.BlockCopy(Encoding.ASCII.GetBytes("Salted__"), 0, encryptedBytesWithSalt, 0, 8);
        Buffer.BlockCopy(salt, 0, encryptedBytesWithSalt, 8, salt.Length);
        Buffer.BlockCopy(encryptedBytes, 0, encryptedBytesWithSalt, salt.Length + 8, encryptedBytes.Length);
        // base64 encode
        return Convert.ToBase64String(encryptedBytesWithSalt);
    }
    private static void DeriveKeyAndIv(string passPhrase, byte[] salt, out byte[] key, out byte[] iv)
    {
        // generate key and iv
        var concatenatedHashes = new List<byte>(48);
        var password = Encoding.UTF8.GetBytes(passPhrase);
        var currentHash = new byte[0];
        var md5 = MD5.Create();
        bool enoughBytesForKey = false;
        // See http://www.openssl.org/docs/crypto/EVP_BytesToKey.html#KEY_DERIVATION_ALGORITHM
        while (!enoughBytesForKey)
        {
            var preHashLength = currentHash.Length + password.Length + salt.Length;
            var preHash = new byte[preHashLength];
            Buffer.BlockCopy(currentHash, 0, preHash, 0, currentHash.Length);
            Buffer.BlockCopy(password, 0, preHash, currentHash.Length, password.Length);
            Buffer.BlockCopy(salt, 0, preHash, currentHash.Length + password.Length, salt.Length);
            currentHash = md5.ComputeHash(preHash);
            concatenatedHashes.AddRange(currentHash);
            if (concatenatedHashes.Count >= 48)
                enoughBytesForKey = true;
        }
        key = new byte[32];
        iv = new byte[16];
        concatenatedHashes.CopyTo(0, key, 0, 32);
        concatenatedHashes.CopyTo(32, iv, 0, 16);
        md5.Clear();
    }

    static byte[] EncryptStringToBytesAes(string plainText, byte[] key, byte[] iv)
    {
        // Check arguments.
        if (plainText == null || plainText.Length <= 0)
            throw new ArgumentNullException("plainText");
        if (key == null || key.Length <= 0)
            throw new ArgumentNullException("key");
        if (iv == null || iv.Length <= 0)
            throw new ArgumentNullException("iv");
        // Declare the stream used to encrypt to an in memory
        // array of bytes.
        MemoryStream msEncrypt;
        // Declare the RijndaelManaged object
        // used to encrypt the data.
        RijndaelManaged aesAlg = null;
        try
        {
            // Create a RijndaelManaged object
            // with the specified key and IV.
            aesAlg = new RijndaelManaged { Mode = CipherMode.CBC, KeySize = 256, BlockSize = 128, Key = key, IV = iv };
            // Create an encryptor to perform the stream transform.
            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
            // Create the streams used for encryption.
            msEncrypt = new MemoryStream();
            using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            {
                using (var swEncrypt = new StreamWriter(csEncrypt))
                {
                    //Write all data to the stream.
                    swEncrypt.Write(plainText);
                    swEncrypt.Flush();
                    swEncrypt.Close();
                }
            }
        }
        finally
        {
            // Clear the RijndaelManaged object.
            aesAlg?.Clear();
        }
        // Return the encrypted bytes from the memory stream.
        return msEncrypt.ToArray();
    }

简单地使用 crypto-js 解密它

 let CryptoJS = require('crypto-js');
let r = CryptoJS.AES.decrypt('exampleString', 'examplePassword').toString();

示例代码试图解密原始未加密的字符串,这看起来可能是在尝试简化发布问题的示例代码时创建的错误?无论哪种方式,所需的步骤都不太困难,但需要替换 toString() 调用。

var data = "U2FsdGVkX1/Zvh/5BnLfUgfbg5ROSD7Aohumr9asPM8="; // Output from C#
let r2 = CryptoJS.enc.Utf8.stringify(CryptoJS.AES.decrypt(data, 'examplePassword'));
console.log(r2);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 C# 进行 AES 加密 使用 crypto-js 进行解密 的相关文章

随机推荐

  • AngularJS $scope 表单属性在 ng-submit 后未定义

    我从 Angular 开始 但我仍然对语法和许多不同的编码方式感到非常困惑以获得相同的结果 我最新的问题是 当我提交表单时 我无法通过执行以下操作来获取其值 scope attribute name HTML div src div div
  • Rails 4:带有关联的 form_for

    Rails 和 ruby 新手 挣扎着form for和协会 我正在尝试设置一个 Rails 应用程序 允许用户从客户端列表中进行选择 客户通过以下方式关联has many through关系 我让模型按预期工作 并且我可以通过 Rails
  • 使用 androids 可视化器类获取可变频率范围

    我想获取智能手机播放的声音的某些频率范围的值 以便我可以通过蓝牙将它们转发到可视化这些范围的设备 这些范围是 0 63Hz63 160赫兹160 400赫兹400 1000赫兹1000 2 500Hz2 500 6 250Hz6 250 1
  • MySQL“错误 1046 (3D000):更新查询时未选择数据库”

    我有一个 UPDATE 查询 其中明确引用了数据库 但 MySQL 仍然抱怨以下消息 ERROR 1046 3D000 No database selected 其他结构相似但使用 INSERT 的查询可以正常工作 其他仅执行 SELECT
  • Endpoint包含授权元数据,但未找到支持授权的中间件

    我目前正在将本地开发的应用程序迁移到数字海洋中的 Ubuntu 16 04 Droplet 我正在使用 NET Core 3 1 并已为其配置了我的服务器 但是 当我导航到控制器上使用 Authorize 属性 我仅在我的生产服务器上 而不
  • LINQ to XML 和 DataGridView

    您好 我第一次尝试使用 DataGridView 和 LINQ 这就是我正在尝试做的事情 我想使用它 尽管它不必使用 DataGridView 来读取和显示 XML 文件的内容 这部分是下面的工作代码 但我想在表单或 DataGridVie
  • 两个ArrayList 一个RecyclerView Adapter

    我有一个聊天屏幕 我可以在其中与其他用户聊天 我正在将聊天数据 通过列表的消息 时间和发件人 发送到 RecyclerAdapter 后者用数据填充聊天视图 现在我还有一个列表 其中包含不同布局的数据 像这样 这是我将第二个数组列表调用到
  • 使用 url 重定向下载文件

    我可以通过 url 下载文件 但是当我从 bash 尝试时 我得到的是 html 页面而不是文件 如何使用curl wget 或其他方式下载带有url 重定向 301 永久移动 的文件 UPD 来自 url 请求的标头 curl I htt
  • 使用命令提示符修改 cmd.exe 属性

    这不是很好的递归吗 我的外部驱动器上有一个便携式命令提示符 它有一个很好的 bat 文件来配置一些初始设置 但我想要更多 这是我知道如何从 bat 设置的内容 颜色 颜色 XY 其中 x 和 y 是预定义颜色的十六进制数字 Prompt p
  • ini_set("upload_max_filesize","200M") 在 php 中不起作用[重复]

    这个问题在这里已经有答案了 可能的重复 覆盖 upload max filesize https stackoverflow com questions 949415 overriding upload max filesize 我使用这些
  • 我需要一个循环遍历日期间隔

    我有开始日期和结束日期 我需要遍历这两个日期之间的每一天 最好的方法是什么 我只能建议这样的事情 Date currentDate new Date startDate getTime while true if currentDate g
  • xcode 无法识别类的更改

    由于某种原因 xcode 无法识别我对程序 这是一个 C 命令行程序 中的某个类所做的任何更改 例如 如果我为此类创建一个新方法并尝试在另一个文件中使用它 该文件已经包含该类的 h 文件 并且我已经在该文件中广泛使用了该类 它会给我一个错误
  • cassandra CQL 中的内连接

    如何在 cassandra 中编写子查询 嵌套查询 CQL 中是否提供了此功能 我尝试过的例子 cqlsh testdb gt select itemname from item where itemid select itemid fro
  • Docker compose找不到本地包

    因此 我在 GOlang 中创建了 REST api 和一个 grpc 服务 现在我想在 docker compose 中组合它 我的 docker compose 看起来像这样 version 3 services db image po
  • 在同一台计算机上运行 Internet Explorer 6、Internet Explorer 7 和 Internet Explorer 8

    和其他人一样 我需要在 Internet Explorer 6 和 Internet Explorer 7 上测试我的代码 现在 Internet Explorer 8 为开发人员提供了一些很棒的工具 我想使用它们 我还想开始使用 Inte
  • 在bat文件中查询npm错误状态

    我们目前正在将 UI 项目 总共 3 个 的构建转移到 Grunt 为了简化转换 我想提供一个可以运行的bat文件npm install对于每个项目 但是我想知道发出此命令时是否出现问题 我所追求的只是糖衣 我知道 npm 会回显错误 但我
  • psql: FATAL: 用户 PAM 身份验证失败

    PostgreSQL 9 2 4 我无法再使用过去工作过的用户登录 我假设配置有问题 因此 为了进行测试 我创建了一个测试用户角色 testing 其选项与相关角色相同 作为仍然可以登录的 postgres 用户 CREATE ROLE t
  • 如何在Python 2.7中实现带超时的锁

    有没有一种方法可以在Python中实现多线程锁acquire方法可以有任意超时吗 到目前为止我发现的唯一可行的解 决方案使用轮询 这 我觉得不优雅而且效率低下 不保留锁的有界等待 进度保证作为临界区问题的解决方案 有没有更好的方法来实现这个
  • IList 到 IQueryable

    我有一个列表 我想将其包装到 IQueryable 中 这可能吗 List
  • 使用 C# 进行 AES 加密 使用 crypto-js 进行解密

    我正在尝试使用 C 加密字符串并使用 Angular crypto js 库解密它 但它给了我不同的输出 我尝试了不同的 c aes 加密实现 但 crypto js 库无法解密 c 中的加密数据 感谢您的任何帮助 这是我的代码 程序 cs