背景:

因项目需要,需要将一个python2编写的aes加密方式改为java实现。

1.源python2实现

from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
import hashlib
import urllibclass aesCrypt():def __init__(self, undealKey):key = turnMd5(undealKey)print undealKeydealKey = dealKeyAndIV(key.lower())self.key = dealKey# self.iv = ivself.mode = AES.MODE_ECBself.BS = AES.block_size# 补位self.pad = lambda s: s + (self.BS - len(s) % self.BS) * chr(self.BS - len(s) % self.BS)self.unpad = lambda s: s[0:-ord(s[-1])]def encrypt(self, text):text = self.pad(text)cryptor = AES.new(self.key, self.mode)# 目前AES-128 足够目前使用ciphertext = cryptor.encrypt(text)# 把加密后的字符串转化为16进制字符串return b2a_hex(ciphertext)# 解密后,去掉补足的空格用strip() 去掉def decrypt(self, text):cryptor = AES.new(self.key, self.mode)plain_text = cryptor.decrypt(a2b_hex(text))return self.unpad(plain_text.rstrip('\0'))def turnHex(character):
<略>def debugPrint(str):print strdef dealKeyAndIV(undealKey):

<略>
def turnMd5(str): <略>

2.经历

1. 我只有python3的环境,因使用到

Crypto

这个package的很难安装上去,经过多种尝试,使用pycryptodome替代,故需要修改部分代码

2. 改成python3的文件

from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
import hashlib
import urllibclass aesCrypt():def __init__(self, undealKey):key = turnMd5(undealKey)print(undealKey)dealKey = dealKeyAndIV(key.lower())self.key = dealKey# self.iv = ivself.mode = AES.MODE_ECBself.BS = AES.block_size# 补位self.pad = lambda s: s + (self.BS - len(s) % self.BS) * chr(self.BS - len(s) % self.BS)self.unpad = lambda s: s[0:-ord(s[-1])]def encrypt(self, text):text = self.pad(text)#finalkey=bytes([239,159,125,206,247,119,225,116,254,91,100,130,255,144,207,70])cryptor = AES.new(bytes(self.key), self.mode)# 目前AES-128 足够目前使用#ss=bytes([67, 122, 99, 115, 81, 111, 68, 112, 67, 47, 67, 75, 48, 108, 98, 90, 99, 68, 47, 115, 88, 87, 52, 65, 43, 105, 119, 83, 72, 122, 88, 109, 55, 110, 98, 54, 102, 85, 89, 84, 56, 89, 117, 120, 102, 79, 110, 78, 70, 69, 120, 104, 97, 48, 68, 115, 83, 112, 89, 85, 84, 57, 49, 98, 113, 66, 120, 77, 107, 108, 52, 74, 105, 99, 72, 56, 49, 112, 105, 71, 106, 116, 103, 77, 87, 69, 71, 57, 43, 52, 69, 120, 54, 86, 82, 56, 56, 51, 102, 88, 74, 52, 112, 86, 117, 110, 120, 68, 117, 68, 100, 56, 53, 100, 109, 109, 88, 82, 106, 110, 48, 118, 107, 99, 115, 105, 89, 102, 97, 51, 110, 122, 72, 85, 122, 54, 67, 107, 55, 74, 85, 109, 115, 49, 73, 79, 99, 78, 76, 86, 66, 53, 87, 110, 53, 110, 106, 68, 76, 83, 65, 70, 114, 84, 106, 71, 68, 87, 110, 73, 69, 61, 4, 4, 4, 4])#ss=text.encode()#print(a2b_hex(ss))#print(a2b_hex(ss))ciphertext = cryptor.encrypt(text.encode("utf-8"))# 把加密后的字符串转化为16进制字符串return b2a_hex(ciphertext)# 解密后,去掉补足的空格用strip() 去掉def decrypt(self, text):cryptor = AES.new(self.key, self.mode)plain_text = cryptor.decrypt(a2b_hex(text))return self.unpad(plain_text.rstrip('\0'))def turnHex(character):value = ord(character)# print valuetemp = value - 48if value - 48 > 9:if (value - 97 <= 5) & (value - 97 >= 0):temp = value - 87return tempdef dealKeyAndIV(undealKey):flag = 0 result=[]# debugPrint 'len=',len(undealKey)/2while flag < len(undealKey)/2:characterH = undealKey[flag*2]# debugPrint characterHhighBit = turnHex(characterH) * 16# debugPrint highBitcharacterL = undealKey[flag*2+1]# debugPrint characterLlowBit = turnHex(characterL)# debugPrint lowBitascValue = highBit+lowBit# debugPrint ascValue
        result.append(ascValue)# debugPrint resultflag += 1# print '-------'return resultdef turnMd5(str):m2 = hashlib.md5()data = str.encode(encoding="utf-8")m2.update(data)return m2.hexdigest()

改写java程序

   private static byte[] pading(String str){byte[] strBs=str.getBytes();int n=strBs.length/16;byte[] pading=new byte[16*(n+1)];System.arraycopy(strBs, 0, pading, 0, strBs.length);//不足16位的进行补足int len=16 - str.length()%16;for(int i=strBs.length;i<pading.length;i++){pading[i]=(byte)len;}return pading;}public static String bytesToHexString(byte[] src){  StringBuilder stringBuilder = new StringBuilder("");  if (src == null || src.length <= 0) {  return null;  }  for (int i = 0; i < src.length; i++) {  int v = src[i] & 0xFF;  String hv = Integer.toHexString(v);  if (hv.length() < 2) {  stringBuilder.append(0);  }  stringBuilder.append(hv);  }  return stringBuilder.toString();  }public static String MD5Encode(String source, String encoding, boolean uppercase) {String result = null;try {result = source;// 获得MD5摘要对象MessageDigest messageDigest = MessageDigest.getInstance("MD5");// 使用指定的字节数组更新摘要信息
            messageDigest.update(result.getBytes(encoding));// messageDigest.digest()获得16位长度result = bytesToHexString(messageDigest.digest());} catch (Exception e) {e.printStackTrace();}return uppercase ? result.toUpperCase() : result;}public static Integer turnHex(char c){int ret=0;switch(c){case '0':return 0;case '1':return 1;case '2':return 2;case '3':return 3;case '4':return 4;case '5':return 5;case '6':return 6;case '7':return 7;case '8':return 8;case '9':return 9;case 'a':return 10;case 'b':return 11;case 'c':return 12;case 'd':return 13;case 'e':return 14;case 'f':return 15;}return ret;}private static byte[] dealKeyAndIV(String str){byte[] keys=new byte[16];int flag = 0;while(flag < str.length()/2){char characterH =str.charAt(flag*2);int highBit = turnHex(characterH) * 16;char characterL = str.charAt(flag*2+1);int lowBit = turnHex(characterL);int ascValue = highBit+lowBit;keys[flag]=(byte) ascValue;//System.out.println(ascValue);flag += 1;}        return keys;}public static String encrypt() throws Exception {try {String data = "CzcsQoDpC/CK0lbZcD/sXW4A+iwSHzXm7nb6fUYT8YuxfOnNFExha0DsSpYUT91bqBxMkl4JicH81piGjtgMWEG9+4Ex6VR883fXJ4pVunxDuDd85dmmXRjn0vkcsiYfa3nzHUz6Ck7JUms1IOcNLVB5Wn5njDLSAFrTjGDWnIE=";String key = "IMgzwYRjA3sZgiXl";String md5key=MD5Encode(key,"utf-8",false); //'ef9f7dcef777e174fe5b6482ff90cf46'//String finalKey = dealKeyAndIV(md5key);//System.out.println(finalKey.length());//System.out.println("c3afc29f7dc38ec3b777c3a174c3be5b64c282c3bfc290c38f46".length());//String ss=bytesToHexString(finalKey.getBytes());//b'c3afc29f7dc38ec3b777c3a174c3be5b64c282c3bfc290c38f46'
            Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");int blockSize = cipher.getBlockSize();byte[] plaintext=pading(data);
/*            byte[] dataBytes = data.getBytes();int plaintextLength = dataBytes.length;if (plaintextLength % blockSize != 0) {plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));}byte[] plaintext = new byte[plaintextLength];System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);*/byte[] keys=dealKeyAndIV(md5key);// byte[] keys=new byte[]{(byte)239,(byte)159,125,(byte)206,(byte)247,119,(byte)225,116,(byte)254,91,100,(byte)130,(byte)255,(byte)144,(byte)207,70};SecretKeySpec keyspec = new SecretKeySpec(keys, "AES");cipher.init(Cipher.ENCRYPT_MODE, keyspec);//byte[] bb=new byte[]{67, 122, 99, 115, 81, 111, 68, 112, 67, 47, 67, 75, 48, 108, 98, 90, 99, 68, 47, 115, 88, 87, 52, 65, 43, 105, 119, 83, 72, 122, 88, 109, 55, 110, 98, 54, 102, 85, 89, 84, 56, 89, 117, 120, 102, 79, 110, 78, 70, 69, 120, 104, 97, 48, 68, 115, 83, 112, 89, 85, 84, 57, 49, 98, 113, 66, 120, 77, 107, 108, 52, 74, 105, 99, 72, 56, 49, 112, 105, 71, 106, 116, 103, 77, 87, 69, 71, 57, 43, 52, 69, 120, 54, 86, 82, 56, 56, 51, 102, 88, 74, 52, 112, 86, 117, 110, 120, 68, 117, 68, 100, 56, 53, 100, 109, 109, 88, 82, 106, 110, 48, 118, 107, 99, 115, 105, 89, 102, 97, 51, 110, 122, 72, 85, 122, 54, 67, 107, 55, 74, 85, 109, 115, 49, 73, 79, 99, 78, 76, 86, 66, 53, 87, 110, 53, 110, 106, 68, 76, 83, 65, 70, 114, 84, 106, 71, 68, 87, 110, 73, 69, 61, 4, 4, 4, 4};byte[] encrypted = cipher.doFinal(plaintext);return bytesToHexString(encrypted);//return new sun.misc.BASE64Encoder().encode(encrypted);
} catch (Exception e) {e.printStackTrace();return null;}}

注意点

1. 是模式ECB,BCB等

2.填充方式

自定义填充

转载于:https://www.cnblogs.com/davidwang456/p/7569825.html

java代码实现python2中aes加密经历相关推荐

  1. 教你如何使用Java代码从网页中爬取数据到数据库中——网络爬虫精华篇

    文章目录 1:网络爬虫介绍 2:HttpClients类介绍 2.1 HttpGet参数问题 2.2 HttpPost参数问题 2.3 连接池技术问题 3:Jsoup介绍 4:动手实践如何抓取网页上数 ...

  2. java代码在jsp中怎么写_在jsp中写java代码

    该服务器上的所有的访问者的所有 jsp 页面 D.该服务器上的所有的访问者的所有 jsp 页面和 Java 程序 6.在 JSP 中调用 JavaBean 时不会用到的标记是( )...... jav ...

  3. Java代码---求数组中的平均值

    Java代码-求数组中的平均值 /*** 求数组中的平均值*/ class Demo5 {public static void main(String[] args) {int[] array = { ...

  4. jquery java aes_[代码全屏查看]-java、js之间使用AES加密通信数据

    [1].[代码] java AES加密解密辅助类 package com.zoki.security; import ch.qos.logback.classic.Logger; import jav ...

  5. php7.1 aes 加密解密,PHP7.1中AES加密解密方法 mcrypt_module_open()替换方案

    mcrypt 扩展已经过时了大约10年,并且用起来很复杂.因此它被废弃并且被 OpenSSL 所取代. 从PHP 7.2起它将被从核心代码中移除并且移到PECL中. PHP手册在7.1迁移页面给出了替 ...

  6. JAVA与PHP之间进行aes加密解密

    aes加密解密过程 用户数据应经过加密再传输,此文档为aes128加密(cbc模式)的说明 摘要算法为SHA-512 加密: 生成16位iv向量,使用该iv以及密钥加密原文 将加密后的真实密文与iv拼 ...

  7. Java代码判断数据库中某张表是否存在

    最近在开发一个同步数据的统计任务的时候遇到一个问题:要在Java代码中判断数据库中某张表是否存在,查资料后,总结了以下两种方法: 1.使用JdbcTemplate bean public boolea ...

  8. java 代码冲突检测_Java中常见的代码冲突

    java 代码冲突检测 在工作中,最近我对现有Java项目进行了代码清理. 完成该练习后,我可以看到在代码中一次又一次地发生了一组常见的代码冲突. 因此,我想出了此类常见违规的清单,并与同行共享,以提 ...

  9. java 代码锁_Java中的Lock锁

    Lock锁介绍: 在java中可以使用 synchronized 来实现多线程下对象的同步访问,为了获得更加灵活使用场景.高效的性能,java还提供了Lock接口及其实现类ReentrantLock和 ...

最新文章

  1. 手把手从零开始搭建k8s集群超详细教程
  2. 写扩展性好的代码:函数
  3. 赠书 | 2021年中国数字政府发展指数排名出炉!你的家乡名列第几?
  4. mysql主从库配置方法
  5. 轻松学,Java 中的代理模式(proxy)及动态代理
  6. Python实现九九乘法表
  7. ansible--- tags
  8. C#学习笔记——委托机制
  9. centos7安装kubernetes 1.1
  10. Linux系统多网卡环境下的路由配置
  11. 2019版PHP自动发卡平台源码
  12. SQL 配置管理器找不到了
  13. 《秘密》-- 东野圭吾
  14. 2021年4月程序员工资统计排行
  15. 如何在比赛和项目中培养一个好的探索性分析(EDA)思维 —— 翻译自kaggle一位有趣的分享者
  16. Java13都要来了,你还不了解Java8的新(旧)特性?
  17. 视频网站存储在服务器,网络视频存储服务器
  18. 008.UG_NX自由曲面
  19. 这里也有计算机房英语,这里也有风景_800字
  20. 国土规划之双评价的主要数据类型与来源(甲B)

热门文章

  1. android+命令行编译,打包生成apk文件,Android 使用Android Studio + Gradle 或 命令行 进行apk签名打包...
  2. 小而美的个人博客——前端——types and archives
  3. spring boot第七讲
  4. php的cookie的函数,php setcookie()函数的使用简介
  5. java sleep方法_百战程序员:java线程的休眠和回复
  6. u盘排序软件_总有一款U盘适合你
  7. Java中divide用法_java的BIgInteger类中divideAndRemainder方法怎么用?
  8. eclipse配置mysql教程_在Eclipse连接mysql-----配置jbdc_MySQL
  9. php图文消息带代码详细注释,微信发送图文消息代码整理
  10. gcc a.c 究竟经历了什么