使用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。

使用AES加密时,结果不一样的更多相关文章

  1. AES加密时抛出 Illegal key size or default parameters

    使用AES加密时,当密钥大于128时,代码会抛出java.security.InvalidKeyException: Illegal key size or default parameters Il ...

  2. AES加密时抛出java.security.InvalidKeyException: Illegal key size or def

    原文:AES加密时抛出java.security.InvalidKeyException: Illegal key size or def 使用AES加密时,当密钥大于128时,代码会抛出 java. ...

  3. AES加密时抛出java.security.InvalidKeyException: Illegal key size or default parametersIllegal key size or default parameters

    使用AES加密时,当密钥大于128时,代码会抛出java.security.InvalidKeyException: Illegal key size or default parameters Il ...

  4. AES加密时的 java.security.InvalidKeyException: Illegal key size 异常

    程序代码 // 设置加密模式为AES的CBC模式 Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); SecretKe ...

  5. url请求时,参数中的+在服务器接收时为空格,导致AES加密报出javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher

    报错的意思的是使用该种解密方式出入长度应为16bit的倍数,但实际的错误却不是这个,错误原因根本上是因为在http请求是特殊字符编码错误,具体就是base64生成的+号,服务器接收时成了空格,然后导致 ...

  6. AES加密

    package com.edu.hpu; import java.math.BigInteger; import java.security.MessageDigest; import java.se ...

  7. C#中使用DES和AES加密解密

    C#中使用DES和AES加密解密 2008-01-12 09:37 using System;using System.Text;using System.Security.Cryptography; ...

  8. ruby AES加密解密

    最近和京东合作做一个项目,在接口对接传递参数时,参数需要通过AES加密解密. 本来想到用gem 'aescrypt'处理,但是aescrypt的编码方式用的base64,而京东那边用的是16进制.所以 ...

  9. Java 环境下使用 AES 加密的特殊问题处理

    在 Java 环境下使用 AES 加密,在密钥长度和字节填充方面有一些比较特殊的处理. 1. 密钥长度问题 默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误 ...

  10. Php AES加密、解密与Java互操作的问题

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

随机推荐

  1. CSP初赛知识点:Linux 系统

    CSP初赛知识点:Linux 系统 前言 近年 CSP 初赛几乎前 5 道选择题都有一两道有关 Linux 系统的使用,所以作为备战 CSP-J/S 2024 的资料,整理下来啦. 祝各位今年所有考试 ...

  2. MyBatis——注解开发

    注解开发完成增删改   * (在完成简单功能时)使用注解开发会比配置文件开发更加方便 查询:@Select 添加:@Insert 修改:@Update 删除:@Delete               ...

  3. oneforall配置环境,报错cannot import name 'sre_parse' from 're' 解决方法

    高版本python中re模块没有了sre_parse模块, 可以修改python中的exrex.py 代码,直接导入sre_parse模块

  4. Linux_动态库与静态库(其一)

    1.动态库和静态库的定义 动态库(.so):动态库是编译后不嵌入目标文件中的共享库,在程序运行的时候才去链接动态库的代码,可以被多个程序共享使用,通常以 .so 结尾. 静态库(.a):静态库是将一组 ...

  5. 【USB3.0协议学习】Topic3·三种Reset Events分析

    USB3.0中的三种Reset Events 1. PowerOn Reset PowerOn Reset被用来代指上电复位,当一个device接入到root hub或者外置hub的时候,该devic ...

  6. USB硬件特性(速度、名称、供电)

    USB传输速度 USB1.0版本,USB LS(Low Speed低速),速度1.5Mbps. USB1.1版本,USB FS(Full Speed全速),速度12Mbps. USB2.0版本,USB ...

  7. 使用DeepKE训练命名实体识别模型DEMO(官方DEMO)

    使用DeepKE训练命名实体识别模型DEMO(官方DEMO) 说明: 首次发表日期:2024-10-10 DeepKE资源: 文档: https://www.zjukg.org/DeepKE/ 网站: ...

  8. 使用 Debugger 断点 如果打开了断点调试 就会跳转空白页面

    <!DOCTYPE html> <html> <header> <title>test</title> </header> &l ...

  9. C#的Skip 和 Take 方法

    using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using Syst ...

  10. js中数据的基本类型

    有5种基本数据类型分类 : 1. 数字型  number 2. 字符型 string 3. 布尔型 boolean 4. undefined 未定义  就是声明了但是没有赋值 5. null 空指针 ...