前情

需要使用Python和Java实现同一个AES加解密算法,使Python版本加密的密文能够由Java代码解密,反之亦然。

Python实现

Python为3.6版本

  1. # -*- coding: utf-8 -*-
  2. import base64
  3. from Crypto.Cipher import AES
  4. from urllib import parse
  5.  
  6. AES_SECRET_KEY = 'lingyejunAesTest' #此处16|24|32个字符
  7. IV = "1234567890123456"
  8.  
  9. # padding算法
  10. BS = len(AES_SECRET_KEY)
  11. pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
  12. unpad = lambda s: s[0:-ord(s[-1:])]
  13.  
  14. class AES_ENCRYPT(object):
  15. def __init__(self):
  16. self.key = AES_SECRET_KEY
  17. self.mode = AES.MODE_CBC
  18.  
  19. #加密函数
  20. def encrypt(self, text):
  21. cryptor = AES.new(self.key.encode("utf8"), self.mode, IV.encode("utf8"))
  22. self.ciphertext = cryptor.encrypt(bytes(pad(text), encoding="utf8"))
  23. #AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题,使用base64编码
  24. return base64.b64encode(self.ciphertext)
  25.  
  26. #解密函数
  27. def decrypt(self, text):
  28. decode = base64.b64decode(text)
  29. cryptor = AES.new(self.key.encode("utf8"), self.mode, IV.encode("utf8"))
  30. plain_text = cryptor.decrypt(decode)
  31. return unpad(plain_text)
  32.  
  33. if __name__ == '__main__':
  34. aes_encrypt = AES_ENCRYPT()
  35. my_email = "lingyejun@python.aes"
  36. e = aes_encrypt.encrypt(my_email)
  37. d = aes_encrypt.decrypt(e)
  38. print(my_email)
  39. print(e)
  40. print(d)

Java实现

  1. import sun.misc.BASE64Decoder;
  2. import sun.misc.BASE64Encoder;
  3.  
  4. import javax.crypto.Cipher;
  5. import javax.crypto.spec.IvParameterSpec;
  6. import javax.crypto.spec.SecretKeySpec;
  7.  
  8. public class AesTest {
  9.  
  10. /**
  11. * 加密用的Key 可以用26个字母和数字组成
  12. * 此处使用AES-128-CBC加密模式,key需要为16位。
  13. */
  14. private static String sKey = "lingyejunAesTest";
  15. private static String ivParameter = "1234567890123456";
  16.  
  17. // 加密
  18. public static String encrypt(String sSrc) throws Exception {
  19. Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
  20. byte[] raw = sKey.getBytes();
  21. SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
  22. IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());//使用CBC模式,需要一个向量iv,可增加加密算法的强度
  23. cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
  24. byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
  25. return new BASE64Encoder().encode(encrypted);//此处使用BASE64做转码。
  26. }
  27.  
  28. // 解密
  29. public static String decrypt(String sSrc) {
  30. try {
  31. byte[] raw = sKey.getBytes("ASCII");
  32. SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
  33. Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
  34. IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
  35. cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
  36. byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);//先用base64解密
  37. byte[] original = cipher.doFinal(encrypted1);
  38. String originalString = new String(original, "utf-8");
  39. return originalString;
  40. } catch (Exception ex) {
  41. return null;
  42. }
  43. }
  44.  
  45. public static void main(String[] args) {
  46. String email = "lingyejun@java.aes";
  47. try {
  48. String sec = encrypt(email);
  49. System.out.println(sec);
  50. System.out.println(decrypt("CcOtM9WXv0N+Owh/xxedZJnuNUaTU7y3aUBESQLUvVM="));
  51. } catch (Exception e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. }

再将Java代码加密出来的密钥放到Python中进行解密

大功告成,实现了AES在Java和Python的互转。

最新版-Python和Java实现Aes相互加解密的更多相关文章

  1. java MD5/AES/DES加解密汇总

    package com.test.test1.util; import java.security.MessageDigest; import java.security.SecureRandom; ...

  2. 两种JavaScript的AES加密方式(可与Java相互加解密)

    由于JavaScript属于弱类型脚本语言,因此当其与强类型的后台语言进行数据交互时会产生各种问题,特别是加解密的操作.本人由于工作中遇到用js与Java进行相互加解密的问题,在网上查了很多资料及代码 ...

  3. .NET/android/java/iOS AES通用加密解密(修正安卓)

    移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...

  4. .NET/android/java/iOS AES通用加密解密

    移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...

  5. SM4加密算法实现Java和C#相互加密解密

    SM4加密算法实现Java和C#相互加密解密 近期由于项目需要使用SM4对数据进行加密,然后传给Java后台,Java后台使用的也是SM4的加密算法但是就是解密不正确,经过一步步调试发现Java中好多 ...

  6. C# RSA加解密与验签,AES加解密,以及与JAVA平台的密文加解密

    前言: RSA算法是利用公钥与密钥对数据进行加密验证的一种算法.一般是拿私钥对数据进行签名,公钥发给友商,将数据及签名一同发给友商,友商利用公钥对签名进行验证.也可以使用公钥对数据加密,然后用私钥对数 ...

  7. java 与 c# 3des 加解密

    java 与 c# 3des 加解密   主要差异如下: 1.  对于待加密解密的数据,各自的填充模式不一样 C#的模式有:ANSIX923.ISO10126.None.PKCS7.Zero,而Jav ...

  8. node.js 实现 AES CTR 加解密

    node.js 实现 AES CTR 加解密 node aesctr 前言 由于最近我们在做一款安全的文件分享 App, 所有文件均需要使用 aes ctr 来进行加密,aes key 还有一整套完整 ...

  9. java C# objective-c AES对称加解密

    /** * AES加解密 */ public class AESHelper { final static String AES_KEY = "43hr8fhu34b58123"; ...

随机推荐

  1. JAVA基础之DBUtils与连接池

    利用DBUtils进一步简化JDBC数据库的增删改查的代码,同时利用从连接池中接取连接,进而进行简化和减少资源的消耗! 一.DBUtils: 1.DBUtils就是JDBC的简化开发工具包.需要项目导 ...

  2. DEDECMS文章标题显示不全的原因以及解决方法

    首先这里说一下编码问题:UTF-8与GBK(通常为GB2312). GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准):GBK编码专门用来解决中文编码的,是双字节的 ...

  3. python smtp登陆邮箱失败

    >>> server.connect('smtp.163.com') (220, b'163.com Anti-spam GT for Coremail System (163com ...

  4. 关于 Spring AOP (AspectJ) 你该知晓的一切

    版权声明:本文为CSDN博主「zejian_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/javazej ...

  5. 六、Linux_SSH服务器状态

    一.保持Xshell连接Linux服务器状态 1.登录服务器后 cd /etc/ssh/ vim sshd_config 找到 ClientAliveInterval 0和ClientAliveCou ...

  6. ReqMan — 需求提取和协同处理工具

            ReqMan是由德国engineering method AG公司开发的一款高效的.可自由定制的需求提取和协同处理工具.ReqMan 能够将PDF.Word.Excel等格式的文档提取 ...

  7. 逆向破解之160个CrackMe —— 008-009

    CrackMe —— 008 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...

  8. 微信小程序~页面跳转和路由

    一个小程序拥有多个页面,我们可以通过wx.navigateTo推入一个新的页面,如图3-6所示,在首页使用2次wx.navigateTo后,页面层级会有三层,我们把这样的一个页面层级称为页面栈.

  9. test20190905 ChiTongZ

    100+22+90=212.前两道题不错,但T3 没什么意义. 围观刘老爷超强 T1 解法. ChiTongZ的水题赛 [题目简介] 我本可以容忍黑暗,如果我不曾见过太阳. 考试内容略有超纲,不超纲的 ...

  10. Centos7 yum安装postgresql 9.5

    添加RPM yum install https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64/pgdg-centos ...