摘要:前情需要使用和实现同一个加解密算法,使版本加密的密文能够由代码解密,反之亦然。加密使用模式,需要一个向量,可增加加密算法的强度此处使用做转码。解密先用解密再将代码加密出来的密钥放到中进行解密大功告成,实现了在和的互转。
前情
需要使用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的互转。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/74802.html
摘要:前情需要使用和实现同一个加解密算法,使版本加密的密文能够由代码解密,反之亦然。加密使用模式,需要一个向量,可增加加密算法的强度此处使用做转码。解密先用解密再将代码加密出来的密钥放到中进行解密大功告成,实现了在和的互转。 前情 需要使用Python和Java实现同一个AES加解密算法,使Python版本加密的密文能够由Java代码解密,反之亦然。 Python实现 Python为3.6版...
摘要:加密是一种可逆加密算法,对用户的敏感信息加密处理。加密错误返回获取加密密文字节数组对密文字节数组进行转换为输出密文返回输出密文加密错误返回解密密文,带解密的内容密码,解密的密码返回明文,解密后得到的内容。 AES加密 AES 是一种可逆加密算法,对用户的敏感信息加密处理。 本文暂不深入AES原理,仅关注JAVA代码实现AES加解密。 JAVA代码实现 在用JAVA实现AES加密前,先浏...
摘要:首先安装确认安装的是版本版本的是不一样的文件头部的声明为我们可以生成一个随机的密钥注意要使用密码学安全的随机方法这里生成的是而不是为了可读性采用加密内容加密前需要到的整数倍长度才可有对应方法初始向量为长度返回初始向量加密数据解密方法为 首先 安装cryptography sudo pip3 install cryptography 确认安装的是2.1.x版本 (1.x版本的api是不一...
时间:2017年4月11日星期二说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:https://github.com/zccodere/s...个人学习源码:https://github.com/zccodere/s... 第一章:对称加密算法DES 1-1 JAVA对称加密算法DES 加密密钥=解密密钥 对称加密算法 初等 DES --3D...
阅读 1932·2021-11-22 19:20
阅读 2579·2021-11-22 13:54
阅读 1736·2021-09-04 16:40
阅读 1767·2021-08-13 11:54
阅读 2557·2019-08-30 15:55
阅读 3428·2019-08-29 13:51
阅读 499·2019-08-29 11:09
阅读 2963·2019-08-26 14:06