使用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. CSS & JS Effect – Image 倒影框

    效果 Step1: HTML 结构 <div class="image"> <img src="./images/img-2.png" /&g ...

  2. C++ 数据输入cin (解决CLoin输入中文程序出错)

    数据输入cin 语法:cin >> 变量 解决 CLoin 使用cin输入中文程序无法正常运行 按住Ctrl+alt+shift+/键 弹出对话框选择注册表 取消勾选run.process ...

  3. angularjs中控制视图的控制器的两种注入依赖项及服务的写法

    在AngularJS中,控制器是用于控制视图行为的重要组件.当定义控制器时,有两种主要的方式注入依赖项: 1. 显式依赖注入,聚聚使用字符串数组形式来注入依赖项: myapp.controller(' ...

  4. 智慧矿山IT智能运维自动化解决方案

    矿山企业是国民经济中的重要组成部分,其资源开发和产业链条中涉及的环节与过程非常繁琐和复杂.随着我国矿山企业规模逐年扩大,为了提高其生产效率和降低其生产成本,信息化.数字化建设成为当下矿山企业发展的重要 ...

  5. 微信小程序点击按钮进行页面跳转

    下面是wxml代码 <button type="primary" bindtap="go">跳转到list页面</button> 下面是 ...

  6. python:批量删除指定文件目录中多个文件

    #coding:utf-8# 任务需要,需要删除多余的文件,手动删除太麻烦,几行python搞定 import os from glob import glob path = r"/medi ...

  7. 从url地址获取主机名

    function getHost(url) { var host = "null"; if(typeof url == "undefined"|| null = ...

  8. 0503-autograd实战之线性回归

    0503-autograd实战之线性回归 目录 一.用 variable 实现线性回归(autograd 实战) 二.第五章总结 pytorch完整教程目录:https://www.cnblogs.c ...

  9. spring boot 与spring boot admin整合问题处理

    1.在整合springboot admin server时,发现admin client无法注册到admin server上 查找原因后发现代码中报错:HttpMediaTypeNotAcceptab ...

  10. KubeKey 升级 Kubernetes 次要版本实战指南

    作者:运维有术 前言 知识点 定级:入门级 KubeKey 如何升级 Kubernetes 次要版本 Kubernetes 升级准备及验证 KubeKey 升级 Kubernetes 的常见问题 实战 ...