使用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 (不写邀请码,没有现金送) 国 ...
随机推荐
- CSS & JS Effect – Image 倒影框
效果 Step1: HTML 结构 <div class="image"> <img src="./images/img-2.png" /&g ...
- C++ 数据输入cin (解决CLoin输入中文程序出错)
数据输入cin 语法:cin >> 变量 解决 CLoin 使用cin输入中文程序无法正常运行 按住Ctrl+alt+shift+/键 弹出对话框选择注册表 取消勾选run.process ...
- angularjs中控制视图的控制器的两种注入依赖项及服务的写法
在AngularJS中,控制器是用于控制视图行为的重要组件.当定义控制器时,有两种主要的方式注入依赖项: 1. 显式依赖注入,聚聚使用字符串数组形式来注入依赖项: myapp.controller(' ...
- 智慧矿山IT智能运维自动化解决方案
矿山企业是国民经济中的重要组成部分,其资源开发和产业链条中涉及的环节与过程非常繁琐和复杂.随着我国矿山企业规模逐年扩大,为了提高其生产效率和降低其生产成本,信息化.数字化建设成为当下矿山企业发展的重要 ...
- 微信小程序点击按钮进行页面跳转
下面是wxml代码 <button type="primary" bindtap="go">跳转到list页面</button> 下面是 ...
- python:批量删除指定文件目录中多个文件
#coding:utf-8# 任务需要,需要删除多余的文件,手动删除太麻烦,几行python搞定 import os from glob import glob path = r"/medi ...
- 从url地址获取主机名
function getHost(url) { var host = "null"; if(typeof url == "undefined"|| null = ...
- 0503-autograd实战之线性回归
0503-autograd实战之线性回归 目录 一.用 variable 实现线性回归(autograd 实战) 二.第五章总结 pytorch完整教程目录:https://www.cnblogs.c ...
- spring boot 与spring boot admin整合问题处理
1.在整合springboot admin server时,发现admin client无法注册到admin server上 查找原因后发现代码中报错:HttpMediaTypeNotAcceptab ...
- KubeKey 升级 Kubernetes 次要版本实战指南
作者:运维有术 前言 知识点 定级:入门级 KubeKey 如何升级 Kubernetes 次要版本 Kubernetes 升级准备及验证 KubeKey 升级 Kubernetes 的常见问题 实战 ...