最新版-Python和Java实现Aes相互加解密
前情
需要使用Python和Java实现同一个AES加解密算法,使Python版本加密的密文能够由Java代码解密,反之亦然。
Python实现
Python为3.6版本
- # -*- coding: utf-8 -*-
- import base64
- from Crypto.Cipher import AES
- from urllib import parse
- AES_SECRET_KEY = 'lingyejunAesTest' #此处16|24|32个字符
- IV = "1234567890123456"
- # padding算法
- BS = len(AES_SECRET_KEY)
- pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
- unpad = lambda s: s[0:-ord(s[-1:])]
- class AES_ENCRYPT(object):
- def __init__(self):
- self.key = AES_SECRET_KEY
- self.mode = AES.MODE_CBC
- #加密函数
- def encrypt(self, text):
- cryptor = AES.new(self.key.encode("utf8"), self.mode, IV.encode("utf8"))
- self.ciphertext = cryptor.encrypt(bytes(pad(text), encoding="utf8"))
- #AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题,使用base64编码
- return base64.b64encode(self.ciphertext)
- #解密函数
- def decrypt(self, text):
- decode = base64.b64decode(text)
- cryptor = AES.new(self.key.encode("utf8"), self.mode, IV.encode("utf8"))
- plain_text = cryptor.decrypt(decode)
- return unpad(plain_text)
- if __name__ == '__main__':
- aes_encrypt = AES_ENCRYPT()
- my_email = "lingyejun@python.aes"
- e = aes_encrypt.encrypt(my_email)
- d = aes_encrypt.decrypt(e)
- print(my_email)
- print(e)
- print(d)
Java实现
- import sun.misc.BASE64Decoder;
- import sun.misc.BASE64Encoder;
- import javax.crypto.Cipher;
- import javax.crypto.spec.IvParameterSpec;
- import javax.crypto.spec.SecretKeySpec;
- public class AesTest {
- /**
- * 加密用的Key 可以用26个字母和数字组成
- * 此处使用AES-128-CBC加密模式,key需要为16位。
- */
- private static String sKey = "lingyejunAesTest";
- private static String ivParameter = "1234567890123456";
- // 加密
- public static String encrypt(String sSrc) throws Exception {
- Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
- byte[] raw = sKey.getBytes();
- SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
- IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());//使用CBC模式,需要一个向量iv,可增加加密算法的强度
- cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
- byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
- return new BASE64Encoder().encode(encrypted);//此处使用BASE64做转码。
- }
- // 解密
- public static String decrypt(String sSrc) {
- try {
- byte[] raw = sKey.getBytes("ASCII");
- SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
- Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
- IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
- cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
- byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);//先用base64解密
- byte[] original = cipher.doFinal(encrypted1);
- String originalString = new String(original, "utf-8");
- return originalString;
- } catch (Exception ex) {
- return null;
- }
- }
- public static void main(String[] args) {
- String email = "lingyejun@java.aes";
- try {
- String sec = encrypt(email);
- System.out.println(sec);
- System.out.println(decrypt("CcOtM9WXv0N+Owh/xxedZJnuNUaTU7y3aUBESQLUvVM="));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
再将Java代码加密出来的密钥放到Python中进行解密
大功告成,实现了AES在Java和Python的互转。
最新版-Python和Java实现Aes相互加解密的更多相关文章
- java MD5/AES/DES加解密汇总
package com.test.test1.util; import java.security.MessageDigest; import java.security.SecureRandom; ...
- 两种JavaScript的AES加密方式(可与Java相互加解密)
由于JavaScript属于弱类型脚本语言,因此当其与强类型的后台语言进行数据交互时会产生各种问题,特别是加解密的操作.本人由于工作中遇到用js与Java进行相互加解密的问题,在网上查了很多资料及代码 ...
- .NET/android/java/iOS AES通用加密解密(修正安卓)
移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...
- .NET/android/java/iOS AES通用加密解密
移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...
- SM4加密算法实现Java和C#相互加密解密
SM4加密算法实现Java和C#相互加密解密 近期由于项目需要使用SM4对数据进行加密,然后传给Java后台,Java后台使用的也是SM4的加密算法但是就是解密不正确,经过一步步调试发现Java中好多 ...
- C# RSA加解密与验签,AES加解密,以及与JAVA平台的密文加解密
前言: RSA算法是利用公钥与密钥对数据进行加密验证的一种算法.一般是拿私钥对数据进行签名,公钥发给友商,将数据及签名一同发给友商,友商利用公钥对签名进行验证.也可以使用公钥对数据加密,然后用私钥对数 ...
- java 与 c# 3des 加解密
java 与 c# 3des 加解密 主要差异如下: 1. 对于待加密解密的数据,各自的填充模式不一样 C#的模式有:ANSIX923.ISO10126.None.PKCS7.Zero,而Jav ...
- node.js 实现 AES CTR 加解密
node.js 实现 AES CTR 加解密 node aesctr 前言 由于最近我们在做一款安全的文件分享 App, 所有文件均需要使用 aes ctr 来进行加密,aes key 还有一整套完整 ...
- java C# objective-c AES对称加解密
/** * AES加解密 */ public class AESHelper { final static String AES_KEY = "43hr8fhu34b58123"; ...
随机推荐
- JAVA基础之DBUtils与连接池
利用DBUtils进一步简化JDBC数据库的增删改查的代码,同时利用从连接池中接取连接,进而进行简化和减少资源的消耗! 一.DBUtils: 1.DBUtils就是JDBC的简化开发工具包.需要项目导 ...
- DEDECMS文章标题显示不全的原因以及解决方法
首先这里说一下编码问题:UTF-8与GBK(通常为GB2312). GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准):GBK编码专门用来解决中文编码的,是双字节的 ...
- python smtp登陆邮箱失败
>>> server.connect('smtp.163.com') (220, b'163.com Anti-spam GT for Coremail System (163com ...
- 关于 Spring AOP (AspectJ) 你该知晓的一切
版权声明:本文为CSDN博主「zejian_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/javazej ...
- 六、Linux_SSH服务器状态
一.保持Xshell连接Linux服务器状态 1.登录服务器后 cd /etc/ssh/ vim sshd_config 找到 ClientAliveInterval 0和ClientAliveCou ...
- ReqMan — 需求提取和协同处理工具
ReqMan是由德国engineering method AG公司开发的一款高效的.可自由定制的需求提取和协同处理工具.ReqMan 能够将PDF.Word.Excel等格式的文档提取 ...
- 逆向破解之160个CrackMe —— 008-009
CrackMe —— 008 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- 微信小程序~页面跳转和路由
一个小程序拥有多个页面,我们可以通过wx.navigateTo推入一个新的页面,如图3-6所示,在首页使用2次wx.navigateTo后,页面层级会有三层,我们把这样的一个页面层级称为页面栈.
- test20190905 ChiTongZ
100+22+90=212.前两道题不错,但T3 没什么意义. 围观刘老爷超强 T1 解法. ChiTongZ的水题赛 [题目简介] 我本可以容忍黑暗,如果我不曾见过太阳. 考试内容略有超纲,不超纲的 ...
- Centos7 yum安装postgresql 9.5
添加RPM yum install https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64/pgdg-centos ...