前言

这几天做自动化测试的同事找到我,说是帮她看看有个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加密对接的更多相关文章

  1. C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]

    原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...

  2. AES加密例子(python和php版本)

    AES加密例子(python和php版本) AES加密例子(python和php版本)

  3. Python: AES加密与解密

    起源: 视频下载,解析到一个网站时,发现其视频id是用AES加密过的,用的是https://code.google.com/archive/p/crypto-js/这个库.解密很简单的一句js代码: ...

  4. python AES 加密

    pad: ZeroPadding mode: cbc #!/usr/bin/env python# -*- coding:utf-8 -*-# 这里使用pycrypto‎库# 按照方法:easy_in ...

  5. 使用Python进行AES加密和解密

    摘录于:http://blog.csdn.net/nurke/article/details/77267081 另外参考:http://www.cnblogs.com/kaituorensheng/p ...

  6. Python 的AES加密与解密

    AES加密方式有五种:ECB, CBC, CTR, CFB, OFB 从安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现 python 在 Windows下使用AE ...

  7. python笔记43-加解密AES/CBC/pkcs7padding

    前言 有些公司对接口的安全要求比较高,传参数的时候,不会明文的传输,先对接口加密,返回的数据也加密返回. 目前比较常见的加密方式是AES/CBC/pkcs7padding. AES五种加密模式 在AE ...

  8. 最新版-Python和Java实现Aes相互加解密

    前情 需要使用Python和Java实现同一个AES加解密算法,使Python版本加密的密文能够由Java代码解密,反之亦然. Python实现 Python为3.6版本 # -*- coding: ...

  9. Python AES加密

    使用pycrypto模块https://pypi.python.org/pypi/pycrypto/ >>> from Crypto.Cipher import AES>> ...

随机推荐

  1. win10 安装cuda和cudnn

    首先通过nvidia-smi 查看自己的显卡驱动对应的cuda版本. 参考:https://blog.csdn.net/qq_40212975/article/details/89963016 再去官 ...

  2. 【oracle】ORA-06550 字符串长度限制在范围

    number(2)输入了100 就会导致异常

  3. 第1章 你好,C++并发世界

    #include<iostream> #include<thread> void print(){ std::cout << "hello world&q ...

  4. java之父类中的构造器是否能被子类继承?

    子类默认继承父类的属性和方法,但不会继承父类的构造器,而是在子类被实例化时会默认调用父类的空构造器.子类在创建的时候会调用自己的空构造器,并在空构造器会隐式调用super(),即父类的空构造器.如果父 ...

  5. CountDownLatch原理分析

    CountDownLatch原理分析 CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行.例如,应用程序的主线程希望在负责启动框架服务的线程已经启动 ...

  6. 【构建之法教学项目】一个简单的基于C#的电子商务系统演练场景的代码示例

    电子商务平台,是一个历史悠久而又充满挑战的行业,他和社交一起成为中国互联网市场的两极.电子商务系统是一个非常复杂的系统,他实现了人与物.人与人的链接,同时也需要大量的技术来支撑,实现系统的高可用.这些 ...

  7. ros2中创建一个python package

    完整的python package的目录结构如下: source /opt/ros/dashing/setup.bash cd ros2_ws/src && ros2 pkg crea ...

  8. Jmeter元件——JSON Extractor后置处理器介绍2

    在前段时间将JSON Extractor元件做了个简单的介绍:Jmeter元件——JSON Extractor后置处理器介绍1,今天以一个具体的json,以不同的方式提取数据做个详细的介绍. 一.模拟 ...

  9. jquery.wordexport.js打印echarts.js画出的柱状图

    jquery.wordexport.js打印echarts.js画出的柱状图. echarts画出的图是不能直接打印出来的(echarts的柱状图是用canvas画出来的),而jquery.worde ...

  10. iOS引导页(镂空效果)

    推荐使用SDK:pod 'EAFeatureGuideView' 温馨提示:(引导的图片图标需要私人订制的可以用自己的,让UI提供) 参考链接:https://www.jianshu.com/p/c9 ...