惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
Martin Fowler
Martin Fowler
B
Blog RSS Feed
D
DataBreaches.Net
L
LangChain Blog
月光博客
月光博客
S
SegmentFault 最新的问题
阮一峰的网络日志
阮一峰的网络日志
V
Visual Studio Blog
美团技术团队
Jina AI
Jina AI
博客园 - 司徒正美
雷峰网
雷峰网
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
小众软件
小众软件
罗磊的独立博客
博客园_首页
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
A
About on SuperTechFans
Engineering at Meta
Engineering at Meta

博客园 - 云起

ArcGISPro SDK Addin打包机制 一次 ArcGISPro Addin项本地化的排查实录 记一次arm机器装系统的经历 记一次vs中无法找到win sdk的问题 arcpy运行时,报错产品许可尚未初始化 Visual Studio 2022生成解决方案代码图报错“无法连接到指定的数据库” win10下定制文件夹 excel中,根据文件名查询文件路径 ArcGISPro SDK 3.1版本中使用QueuedTask的小问题 Compress-Archive压缩zip包的小瑕疵 Pro更新字段别名,重载数据后失效 在多个office文档内替换关键字 git日志分组 xlst处理时命名空间带来的小坑 更新压缩流 使用excel生成简单的日历 微软中文输入法带来的一点小坑,导致arcgispro输入中文异常 使用C#获取文件详情 Pro更改启动界面 命令行程序读取注册表失败的分析 pg_index
使用AES加密时,结果不一样
云起 · 2024-07-29 · via 博客园 - 云起

使用AES加密时,发现得到的结果不一致。
python示例

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from Crypto.Random import get_random_bytes
import base64

def encrypt_ecb(plaintext, key):
    # 创建AES的ECB模式加密器
    cipher = AES.new(key, AES.MODE_ECB)
    
    # 对明文进行填充,使其长度符合AES的要求
    ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))
    
    # 返回加密后的密文
    return ciphertext

# 明文字符串
plaintext = b'temp'

# 密钥,AES需要16字节(128位),这里使用'test'并填充到16字节
key = b'你的key' + b'\0' * (16 - len(b'test'))

# 加密
ciphertext = encrypt_ecb(plaintext, key)

# 将密文转换为Base64编码的字符串以便于显示
ciphertext_base64 = base64.b64encode(ciphertext).decode('utf-8')

print(f"Encrypted text: {ciphertext_base64}")

C# 示例代码

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

class Program
{
    static void Main(string[] args)
    {
        string plainText = "temp"; // 要加密的字符串
        string key = "你的key"; // 密钥

        byte[] encryptedBytes = EncryptStringToBytes_Aes(plainText, key);
        string encryptedString = Convert.ToBase64String(encryptedBytes);

        Console.WriteLine($"Encrypted String: {encryptedString}");
    }

    private static byte[] EncryptStringToBytes_Aes(string plainText, string key)
    {
        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = Encoding.UTF8.GetBytes(key.PadRight(16, '\0'));
            aesAlg.Mode = CipherMode.ECB;
            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 msEncrypt.ToArray();
                }
            }
        }
    }
}

经过比对和排查,发现是key不一致导致的。
AES在应用的时候,最终采用的是byte数组,可以验证下数组值是否一致。当然,也要保证模式是一样的,之后才是验证key的一致性。
一方面要注意key比较短的时候,是否使用的同样的填充策略,保持空位填充的byte一致。
另一方面要注意key比较长的时候是否会发生截断,比如python使用不同编码的字符串时,得到的byte[]是长短不一样的,尽量都转成统一字符集处理,例如utf8。