摘要:前情需要使用和實現同一個加解密算法,使版本加密的密文能夠由代碼解密,反之亦然。加密使用模式,需要一個向量,可增加加密算法的強度此處使用做轉碼。解密先用解密再將代碼加密出來的密鑰放到中進行解密大功告成,實現了在和的互轉。
前情
需要使用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的互轉。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/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...
閱讀 1998·2021-11-22 19:20
閱讀 2643·2021-11-22 13:54
閱讀 1976·2021-09-04 16:40
閱讀 1830·2021-08-13 11:54
閱讀 2676·2019-08-30 15:55
閱讀 3470·2019-08-29 13:51
閱讀 532·2019-08-29 11:09
閱讀 3013·2019-08-26 14:06