记一次Python与C#的AES加密对接
前言
这几天做自动化测试的同事找到我,说是帮她看看有个AES加密的问题要怎么处理。
大概就是文档中贴了一段C#的AES加密代码,然后她要翻译成python的版本,去做一些测试相关的工作。
在我印象中,AES加密在不同语言中对接或多或少都有一点点不一样,并不会像同一种一言那么流畅,总是要踩踩坑才能解决。
文档中C#版本的实现
public static string AesEncrypt(string toEncrypt, string key)
{
byte[] keyArray = SHA256(key);
byte[] toEncryptArray = Encoding.UTF8.GetBytes(toEncrypt);
byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
RijndaelManaged rDel = new RijndaelManaged
{
Key = keyArray,
IV = iv,
Mode = CipherMode.CBC,
Padding = PaddingMode.PKCS7,
BlockSize = 128
};
ICryptoTransform cTransform = rDel.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
public static byte[] SHA256(string str)
{
byte[] SHA256Data = Encoding.UTF8.GetBytes(str);
SHA256Managed Sha256 = new SHA256Managed();
byte[] by = Sha256.ComputeHash(SHA256Data);
return by;
}
实现上都很常见,网上一搜也是一堆,重点在于 CBC 和 PKCS7。
对应的Python版本
from Crypto.Cipher import AES
import base64
import hashlib
def jm_sha256(data):
sha256 = hashlib.sha256()
sha256.update(data.encode("utf-8"))
res = sha256.digest()
# print("sha256加密结果:", res)
return res
def pkcs7padding(text):
bs = AES.block_size
length = len(text)
bytes_length = len(bytes(text, encoding='utf-8'))
# tips:utf-8编码时,英文占1个byte,而中文占3个byte
padding_size = length if(bytes_length == length) else bytes_length
padding = bs - padding_size % bs
# tips:chr(padding)看与其它语言的约定,有的会使用'\0'
padding_text = chr(padding) * padding
return text + padding_text
def aes_encrypt_v2(content, key):
key_bytes = jm_sha256(key)
iv = "\0".encode("utf-8") * 16
aes = AES.new(key_bytes, AES.MODE_CBC, iv)
content_padding = pkcs7padding(content)
encrypt_bytes = aes.encrypt(bytes(content_padding, encoding='utf-8'))
result = str(base64.b64encode(encrypt_bytes), encoding='utf-8')
return result
mystr1 = "123"
mykey1 = "12345678"
# 3gVLeGnili1JBTYLHAk8pQ==
print(aes_encrypt_v2(mystr1, mykey1))
mystr2 = "你好abcd1234"
mykey2 = "1234567812345678"
# Qkz+MXCIESJZVgHJffouTQ==
print(aes_encrypt_v2(mystr2, mykey2))
参考文章
记一次Python与C#的AES加密对接的更多相关文章
- C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]
原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...
- AES加密例子(python和php版本)
AES加密例子(python和php版本) AES加密例子(python和php版本)
- Python: AES加密与解密
起源: 视频下载,解析到一个网站时,发现其视频id是用AES加密过的,用的是https://code.google.com/archive/p/crypto-js/这个库.解密很简单的一句js代码: ...
- python AES 加密
pad: ZeroPadding mode: cbc #!/usr/bin/env python# -*- coding:utf-8 -*-# 这里使用pycrypto库# 按照方法:easy_in ...
- 使用Python进行AES加密和解密
摘录于:http://blog.csdn.net/nurke/article/details/77267081 另外参考:http://www.cnblogs.com/kaituorensheng/p ...
- Python 的AES加密与解密
AES加密方式有五种:ECB, CBC, CTR, CFB, OFB 从安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现 python 在 Windows下使用AE ...
- python笔记43-加解密AES/CBC/pkcs7padding
前言 有些公司对接口的安全要求比较高,传参数的时候,不会明文的传输,先对接口加密,返回的数据也加密返回. 目前比较常见的加密方式是AES/CBC/pkcs7padding. AES五种加密模式 在AE ...
- 最新版-Python和Java实现Aes相互加解密
前情 需要使用Python和Java实现同一个AES加解密算法,使Python版本加密的密文能够由Java代码解密,反之亦然. Python实现 Python为3.6版本 # -*- coding: ...
- Python AES加密
使用pycrypto模块https://pypi.python.org/pypi/pycrypto/ >>> from Crypto.Cipher import AES>> ...
随机推荐
- win10 安装cuda和cudnn
首先通过nvidia-smi 查看自己的显卡驱动对应的cuda版本. 参考:https://blog.csdn.net/qq_40212975/article/details/89963016 再去官 ...
- 【oracle】ORA-06550 字符串长度限制在范围
number(2)输入了100 就会导致异常
- 第1章 你好,C++并发世界
#include<iostream> #include<thread> void print(){ std::cout << "hello world&q ...
- java之父类中的构造器是否能被子类继承?
子类默认继承父类的属性和方法,但不会继承父类的构造器,而是在子类被实例化时会默认调用父类的空构造器.子类在创建的时候会调用自己的空构造器,并在空构造器会隐式调用super(),即父类的空构造器.如果父 ...
- CountDownLatch原理分析
CountDownLatch原理分析 CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行.例如,应用程序的主线程希望在负责启动框架服务的线程已经启动 ...
- 【构建之法教学项目】一个简单的基于C#的电子商务系统演练场景的代码示例
电子商务平台,是一个历史悠久而又充满挑战的行业,他和社交一起成为中国互联网市场的两极.电子商务系统是一个非常复杂的系统,他实现了人与物.人与人的链接,同时也需要大量的技术来支撑,实现系统的高可用.这些 ...
- ros2中创建一个python package
完整的python package的目录结构如下: source /opt/ros/dashing/setup.bash cd ros2_ws/src && ros2 pkg crea ...
- Jmeter元件——JSON Extractor后置处理器介绍2
在前段时间将JSON Extractor元件做了个简单的介绍:Jmeter元件——JSON Extractor后置处理器介绍1,今天以一个具体的json,以不同的方式提取数据做个详细的介绍. 一.模拟 ...
- jquery.wordexport.js打印echarts.js画出的柱状图
jquery.wordexport.js打印echarts.js画出的柱状图. echarts画出的图是不能直接打印出来的(echarts的柱状图是用canvas画出来的),而jquery.worde ...
- iOS引导页(镂空效果)
推荐使用SDK:pod 'EAFeatureGuideView' 温馨提示:(引导的图片图标需要私人订制的可以用自己的,让UI提供) 参考链接:https://www.jianshu.com/p/c9 ...