开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 158|回复: 5
收起左侧

[C#] 一个C#的aes加密 有没有大佬帮忙用易语言对接解密

[复制链接]
结帖率:50% (1/2)
发表于 3 天前 | 显示全部楼层 |阅读模式   浙江省嘉兴市
50精币
欢迎大家建议和知道,忙了一晚上可能是。。
也许把精益的AES源码翻出来 一对一的也许能解决。。
已经试过很多种加密模式了
感谢大佬
解密都忙一晚上了。 别说加密了  加密也要用阿 数据交互
//解密方法
public static string Decrypt(string cipherText, string password)
{
    try
    {

        byte[] fullCipher = Convert.FromBase64String(cipherText);

        using (Aes aes = Aes.Create())
        {
            aes.KeySize = 256;
            aes.BlockSize = 128;

            // 从加密数据中提取IV
            byte[] iv = new byte[aes.BlockSize / 8];
            Array.Copy(fullCipher, 0, iv, 0, iv.Length);

            // 使用相同的IV和密码生成密钥
            using (var key = new Rfc2898DeriveBytes(password, iv, 10000))
            {
                aes.Key = key.GetBytes(aes.KeySize / 8);
                aes.IV = iv;
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.PKCS7;

                using (var decryptor = aes.CreateDecryptor(aes.Key, aes.IV))
                {
                    using (var ms = new MemoryStream(fullCipher, iv.Length, fullCipher.Length - iv.Length))
                    {
                        using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
                        {
                            using (var reader = new StreamReader(cs))
                            {
                                return reader.ReadToEnd(); // 返回解密后的字符串
                            }
                        }
                    }
                }
            }
        }

    }
    catch
    {
        if (MainForm.trizhi != null)
        {
            MainForm.trizhi.Text += "\n数据异常 - 114514\n";
        }
        else
        {
            MessageBox.Show("[数据异常]", "错误", 0, MessageBoxIcon.Error);
        }
        return "null";
    }

}


//加密方式
    public class enc
    {
        // 加密方法
        public static string Encrypt(string plainText, string password)
        {
            // 随机生成一个 16 字节的 IV
            using (Aes aes = Aes.Create())
            {
                aes.KeySize = 256; // 设置 AES 密钥大小
                aes.BlockSize = 128; // 设置 AES 块大小
                aes.GenerateIV(); // 随机生成IV

                // 通过 Rfc2898DeriveBytes 来生成密钥
                using (var key = new Rfc2898DeriveBytes(password, aes.IV, 10000))
                {
                    aes.Key = key.GetBytes(aes.KeySize / 8); // 生成密钥
                    aes.Mode = CipherMode.CBC; // 使用 CBC 模式
                    aes.Padding = PaddingMode.PKCS7; // 填充模式

                    using (var encryptor = aes.CreateEncryptor(aes.Key, aes.IV))
                    {
                        using (var ms = new MemoryStream())
                        {
                            // 先写入IV,确保解密时可以使用相同的IV
                            ms.Write(aes.IV, 0, aes.IV.Length);

                            using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                            {
                                using (var writer = new StreamWriter(cs))
                                {
                                    writer.Write(plainText);
                                }
                            }

                            return Convert.ToBase64String(ms.ToArray()); // 将加密后的字节数组转换为Base64字符串
                        }
                    }
                }
            }
        }


回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳

签到天数: 7 天

发表于 3 天前 | 显示全部楼层   河南省驻马店市
加密和解密的password不一致...

解密:
[JavaScript] 纯文本查看 复制代码
public static string Decrypt(string cipherText, string password)
{
    if (string.IsNullOrEmpty(cipherText) || !IsBase64String(cipherText))
    {
        return "null";
    }

    try
    {
        byte[] fullCipher = Convert.FromBase64String(cipherText);

        using (Aes aes = Aes.Create())
        {
            aes.KeySize = 256;
            aes.BlockSize = 128;

            // 提取 IV(前 16 字节)
            byte[] iv = new byte[16];
            Array.Copy(fullCipher, 0, iv, 0, iv.Length);

            // 生成密钥
            using (var key = new Rfc2898DeriveBytes(password, iv, 10000))
            {
                aes.Key = key.GetBytes(32); // 256-bit key
                aes.IV = iv;
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.PKCS7;

                using (var decryptor = aes.CreateDecryptor(aes.Key, aes.IV))
                using (var ms = new MemoryStream(fullCipher, iv.Length, fullCipher.Length - iv.Length))
                using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
                using (var reader = new StreamReader(cs))
                {
                    return reader.ReadToEnd();
                }
            }
        }
    }
    catch (Exception ex)
    {
        if (MainForm.trizhi != null)
        {
            MainForm.trizhi.Text += $"\n解密失败: {ex.Message}\n";
        }
        else
        {
            MessageBox.Show($"解密失败: {ex.Message}", "错误", 0, MessageBoxIcon.Error);
        }
        return "null";
    }
}




加密:
[JavaScript] 纯文本查看 复制代码
public static string Encrypt(string plainText, string password)
{
    try
    {
        using (Aes aes = Aes.Create())
        {
            aes.KeySize = 256;
            aes.BlockSize = 128;
            aes.GenerateIV(); // 随机 IV

            using (var key = new Rfc2898DeriveBytes(password, aes.IV, 10000))
            {
                aes.Key = key.GetBytes(32); // 256-bit key
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.PKCS7;

                using (var encryptor = aes.CreateEncryptor(aes.Key, aes.IV))
                using (var ms = new MemoryStream())
                {
                    ms.Write(aes.IV, 0, aes.IV.Length); // 写入 IV

                    using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                    using (var writer = new StreamWriter(cs))
                    {
                        writer.Write(plainText);
                    }

                    return Convert.ToBase64String(ms.ToArray());
                }
            }
        }
    }
    catch (Exception ex)
    {
        if (MainForm.trizhi != null)
        {
            MainForm.trizhi.Text += $"\n加密失败: {ex.Message}\n";
        }
        else
        {
            MessageBox.Show($"加密失败: {ex.Message}", "错误", 0, MessageBoxIcon.Error);
        }
        return "null";
    }
}

回复

使用道具 举报

签到天数: 7 天

发表于 3 天前 | 显示全部楼层   河南省驻马店市
帮你修改了  回复还要审核
QQ20250611-100819.png
加密和解密的password不一致

二次IV被破坏~~~~详细代码 等管理审核通过
回复

使用道具 举报

结帖率:55% (11/20)

签到天数: 7 天

发表于 3 天前 | 显示全部楼层   浙江省湖州市
### C# AES加密/解密转换为易语言实现

分析了你的C#代码后,我发现这是一个标准的AES-256-CBC加密,使用PKCS7填充,并通过PBKDF2算法(Rfc2898DeriveBytes)从密码派生密钥。下面我将为你提供对应的易语言实现方案。

#### 实现思路

1. 使用易语言的密码学支持库处理AES加密/解密
2. 实现PBKDF2算法从密码派生密钥
3. 处理Base64编码/解码
4. 处理IV的提取和生成

#### 易语言实现代码

```易语言
.版本 2
.支持库 spec
.支持库 spec_crypto

.子程序 AES解密, 文本型
.参数 密文, 文本型
.参数 密码, 文本型
.局部变量 完整密文, 字节集
.局部变量 IV, 字节集
.局部变量 数据, 字节集
.局部变量 密钥, 字节集
.局部变量 解密器, 加密对象
.局部变量 解密结果, 字节集
.局部变量 结果, 文本型

// 从Base64解码完整密文
完整密文 = 到字节集 (Base64解码 (密文))

// 提取IV (前16字节)
IV = 子字节集 (完整密文, 1, 16)

// 提取实际加密数据
数据 = 子字节集 (完整密文, 17, 取字节集长度 (完整密文) - 16)

// 使用PBKDF2从密码和IV派生密钥
密钥 = PBKDF2 (到字节集 (密码), IV, 10000, 32)

// 创建AES解密器
解密器.创建 ("AES", 256, CIPHER_CBC, 密钥, IV)

// 解密数据
解密结果 = 解密器.解密 (数据)

// 转换为文本并返回
结果 = 到文本 (解密结果)
返回 (结果)

.子程序 AES加密, 文本型
.参数 明文, 文本型
.参数 密码, 文本型
.局部变量 数据, 字节集
.局部变量 IV, 字节集
.局部变量 密钥, 字节集
.局部变量 加密器, 加密对象
.局部变量 加密结果, 字节集
.局部变量 完整结果, 字节集

// 准备数据
数据 = 到字节集 (明文)

// 生成随机IV
IV = 随机字节集 (16)

// 使用PBKDF2从密码和IV派生密钥
密钥 = PBKDF2 (到字节集 (密码), IV, 10000, 32)

// 创建AES加密器
加密器.创建 ("AES", 256, CIPHER_CBC, 密钥, IV)

// 加密数据
加密结果 = 加密器.加密 (数据)

// 组合IV和加密数据
完整结果 = 字节集合并 (IV, 加密结果)

// 转换为Base64并返回
返回 (Base64编码 (完整结果))

.子程序 PBKDF2, 字节集
.参数 密码, 字节集
.参数 盐值, 字节集
.参数 迭代次数, 整数型
.参数 输出长度, 整数型
.局部变量 结果, 字节集
.局部变量 HMAC, 加密对象
.局部变量 U, 字节集
.局部变量 T, 字节集
.局部变量 i, 整数型
.局部变量 j, 整数型
.局部变量 计数, 字节集

// 初始化结果
结果 = 字节集 ()

// 计算需要多少个HMAC块
.局部变量 块数, 整数型
块数 = 取整 (输出长度 / 20)
.如果真 (输出长度 % 20 ≠ 0)
    块数 = 块数 + 1
.如果真结束

// 对每个块进行处理
.计次循环首 (块数, i)
    // 准备计数器 (4字节大端序)
    计数 = 到字节集 (i)
    计数 = 子字节集 (计数, 1, 4)
   
    // 第一次HMAC: U1 = HMAC(password, salt || i)
    HMAC.创建 ("HMAC-SHA1", 0, 0, 密码, 字节集 ())
    U = HMAC.加密 (字节集合并 (盐值, 计数))
    T = U
   
    // 剩余迭代: Ui = HMAC(password, Ui-1)
    .计次循环首 (迭代次数 - 1, j)
        U = HMAC.加密 (U)
        // 异或操作
        .局部变量 k, 整数型
        .计次循环首 (取字节集长度 (T), k)
            T [k] = T [k] ^ U [k]
        .计次循环尾 ()
    .计次循环尾 ()
   
    // 追加到结果
    结果 = 字节集合并 (结果, T)
.计次循环尾 ()

// 截取所需长度
.如果真 (取字节集长度 (结果) > 输出长度)
    结果 = 子字节集 (结果, 1, 输出长度)
.如果真结束

返回 (结果)

.子程序 随机字节集, 字节集
.参数 长度, 整数型
.局部变量 结果, 字节集
.局部变量 i, 整数型

结果 = 字节集 (长度)
.计次循环首 (长度, i)
    结果 [i] = 取随机数 (0, 255)
.计次循环尾 ()

返回 (结果)
```

#### 注意事项

1. **依赖支持库**:
   - 代码使用了`spec_crypto`支持库处理加密操作
   - 如果没有该支持库,可能需要使用其他密码学库或API

2. **错误处理**:
   - 代码中未包含详细的错误处理,实际应用中应添加
   - 例如检查Base64解码、密钥派生等操作的结果

3. **编码问题**:
   - 确保C#和易语言使用相同的字符编码(通常是UTF-8)
   - 可能需要在转换文本和字节集时指定编码

4. **性能优化**:
   - PBKDF2实现可能不是最高效的,如有性能需求可考虑优化

如果在使用过程中遇到问题,可以先测试简单的字符串加解密,逐步排查是否与编码、IV处理或密钥派生有关。
回复

使用道具 举报

结帖率:50% (1/2)

签到天数: 5 天

 楼主| 发表于 3 天前 | 显示全部楼层   浙江省嘉兴市
laihobglei 发表于 2025-6-11 10:10
帮你修改了  回复还要审核

加密和解密的password不一致

密文的前16位为IV。。。这个加密解密一直在用的C# 对接客户Duan是没问题的 感谢。
我要的是易语言来解密他
回复

使用道具 举报

结帖率:50% (1/2)

签到天数: 5 天

 楼主| 发表于 3 天前 | 显示全部楼层   浙江省嘉兴市
appleqc 发表于 2025-6-11 11:10
### C# AES加密/解密转换为易语言实现

分析了你的C#代码后,我发现这是一个标准的AES-256-CBC加密,使用PK ...

感谢AI大佬
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表