龙空技术网

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

翎野君 195

前言:

现在咱们对“java结合python项目”大概比较看重,姐妹们都需要分析一些“java结合python项目”的相关内容。那么小编在网络上收集了一些对于“java结合python项目””的相关文章,希望各位老铁们能喜欢,各位老铁们快快来学习一下吧!

前情

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

Python实现

Python为3.6版本

# -*- coding: utf-8 -*-import base64from Crypto.Cipher import AESfrom urllib import parseAES_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的互转。

我是「翎野君」,感谢各位朋友的:点赞收藏评论,我们下期见。

标签: #java结合python项目 #java和python对接 #pythoncipher #python aes 加密文件