使用AES加密时,结果不一样
使用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加密时,结果不一样的更多相关文章
- AES加密时抛出 Illegal key size or default parameters
使用AES加密时,当密钥大于128时,代码会抛出java.security.InvalidKeyException: Illegal key size or default parameters Il ...
- AES加密时抛出java.security.InvalidKeyException: Illegal key size or def
原文:AES加密时抛出java.security.InvalidKeyException: Illegal key size or def 使用AES加密时,当密钥大于128时,代码会抛出 java. ...
- 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 ...
- AES加密时的 java.security.InvalidKeyException: Illegal key size 异常
程序代码 // 设置加密模式为AES的CBC模式 Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); SecretKe ...
- url请求时,参数中的+在服务器接收时为空格,导致AES加密报出javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
报错的意思的是使用该种解密方式出入长度应为16bit的倍数,但实际的错误却不是这个,错误原因根本上是因为在http请求是特殊字符编码错误,具体就是base64生成的+号,服务器接收时成了空格,然后导致 ...
- AES加密
package com.edu.hpu; import java.math.BigInteger; import java.security.MessageDigest; import java.se ...
- C#中使用DES和AES加密解密
C#中使用DES和AES加密解密 2008-01-12 09:37 using System;using System.Text;using System.Security.Cryptography; ...
- ruby AES加密解密
最近和京东合作做一个项目,在接口对接传递参数时,参数需要通过AES加密解密. 本来想到用gem 'aescrypt'处理,但是aescrypt的编码方式用的base64,而京东那边用的是16进制.所以 ...
- Java 环境下使用 AES 加密的特殊问题处理
在 Java 环境下使用 AES 加密,在密钥长度和字节填充方面有一些比较特殊的处理. 1. 密钥长度问题 默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误 ...
- Php AES加密、解密与Java互操作的问题
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
随机推荐
- 树状数组 java模板(纯代码)
public class TrieNums { int n; /*Nums start from 0*/ int[] storage; /*TrieNums index start from 1*/ ...
- Atcoder Beginner Contest 367
A.Shout Everyday \(\text{Diff }43\) 给你 \(24\) 小时制下的 \(A,B,C\) 三个时刻,问 \(A\) 是否在 \([B,C]\) 范围内 考虑到先将 \ ...
- Docker安装(安装Docker-CE)(三)
现版本安装Docker已经非常简单了,有很多种方式,而自17年开始,Docker分为Docker-CE(社区版).Docker-EE(企业版),另外Docker-IO是较早的版本,通常用的都是Dock ...
- Linux工具:Winscp显示隐藏的文件
事件起因: 需要用Winscp上传文件到服务器,然后发现文件被隐藏了 解决办法: Winscp软件的快捷键 : Ctrl + Alt + HWindscp软件的设置方法: 菜单栏 选项 -> 面 ...
- 70.http拦截能做些什么(问的是axios的封装)
请求拦截器统一添加 token ,也可以手动的判断token是否过期 : 响应拦截器判断返回数据的逻辑处理,被动的判断token过期并处理 :
- Exchange2016虚拟目录介绍
Exchange2016虚拟目录介绍 Autodiscover 允许Outlook自动发现邮箱设置,以便用户无需手动配置Outlook的高级设置. ecp 用于访问EAC. EWS 提供如服务可用性, ...
- 云原生爱好者周刊:玩 Kubernetes 游戏,赢取免费机票
云原生一周动态要闻: Grafana 8.2.2 发布 OSM(Open Service Mesh)发布 v1.0 的第一个候选版本 谷歌宣布推出 Google Distributed Cloud K ...
- Rigid Body Simulation
目录 0 前言 1 核心技术 1.1 Semi-implicit Euler 1.2 刚体模拟 1.3 Collision 2 实现 X Ref 0 前言 声明:此篇博客仅用于个人学习记录之用,并非是 ...
- SpringBoot之后端图形验证码实现
此验证码的实现没有用到太多的插件,话不多说直接上代码,大家拿过去就可以用. 1.验证码类 package com.youyou.login.util.validatecode; import lomb ...
- 串(C语言实现)
文章目录 1.串的数据类型定义 数据对象 1.1 数据关系 1.2 基本操作 2.串的存储结构 2.1 串的顺序存储 2.2 串的链式存储 3.串的模式匹配算法 3.1BF 算法 3.2KMP 算法 ...