摘要:前情需要使用和實(shí)現(xiàn)同一個(gè)加解密算法,使版本加密的密文能夠由代碼解密,反之亦然。加密使用模式,需要一個(gè)向量,可增加加密算法的強(qiáng)度此處使用做轉(zhuǎn)碼。解密先用解密再將代碼加密出來(lái)的密鑰放到中進(jìn)行解密大功告成,實(shí)現(xiàn)了在和的互轉(zhuǎn)。
前情
需要使用Python和Java實(shí)現(xiàn)同一個(gè)AES加解密算法,使Python版本加密的密文能夠由Java代碼解密,反之亦然。
Python實(shí)現(xiàn)Python為3.6版本
# -*- coding: utf-8 -*- import base64 from Crypto.Cipher import AES from urllib import parse AES_SECRET_KEY = "lingyejunAesTest" #此處16|24|32個(gè)字符 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 #加密函數(shù) 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加密時(shí)候得到的字符串不一定是ascii字符集的,輸出到終端或者保存時(shí)候可能存在問(wèn)題,使用base64編碼 return base64.b64encode(self.ciphertext) #解密函數(shù) 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實(shí)現(xiàn)
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個(gè)字母和數(shù)字組成 * 此處使用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模式,需要一個(gè)向量iv,可增加加密算法的強(qiáng)度 cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8")); return new BASE64Encoder().encode(encrypted);//此處使用BASE64做轉(zhuǎn)碼。 } // 解密 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代碼加密出來(lái)的密鑰放到Python中進(jìn)行解密
大功告成,實(shí)現(xiàn)了AES在Java和Python的互轉(zhuǎn)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/74802.html
摘要:前情需要使用和實(shí)現(xiàn)同一個(gè)加解密算法,使版本加密的密文能夠由代碼解密,反之亦然。加密使用模式,需要一個(gè)向量,可增加加密算法的強(qiáng)度此處使用做轉(zhuǎn)碼。解密先用解密再將代碼加密出來(lái)的密鑰放到中進(jìn)行解密大功告成,實(shí)現(xiàn)了在和的互轉(zhuǎn)。 前情 需要使用Python和Java實(shí)現(xiàn)同一個(gè)AES加解密算法,使Python版本加密的密文能夠由Java代碼解密,反之亦然。 Python實(shí)現(xiàn) Python為3.6版...
摘要:加密是一種可逆加密算法,對(duì)用戶的敏感信息加密處理。加密錯(cuò)誤返回獲取加密密文字節(jié)數(shù)組對(duì)密文字節(jié)數(shù)組進(jìn)行轉(zhuǎn)換為輸出密文返回輸出密文加密錯(cuò)誤返回解密密文,帶解密的內(nèi)容密碼,解密的密碼返回明文,解密后得到的內(nèi)容。 AES加密 AES 是一種可逆加密算法,對(duì)用戶的敏感信息加密處理。 本文暫不深入AES原理,僅關(guān)注JAVA代碼實(shí)現(xiàn)AES加解密。 JAVA代碼實(shí)現(xiàn) 在用JAVA實(shí)現(xiàn)AES加密前,先瀏...
摘要:首先安裝確認(rèn)安裝的是版本版本的是不一樣的文件頭部的聲明為我們可以生成一個(gè)隨機(jī)的密鑰注意要使用密碼學(xué)安全的隨機(jī)方法這里生成的是而不是為了可讀性采用加密內(nèi)容加密前需要到的整數(shù)倍長(zhǎng)度才可有對(duì)應(yīng)方法初始向量為長(zhǎng)度返回初始向量加密數(shù)據(jù)解密方法為 首先 安裝cryptography sudo pip3 install cryptography 確認(rèn)安裝的是2.1.x版本 (1.x版本的api是不一...
摘要:序本文主要小結(jié)一下里頭的以及加解密。屬于塊加密,塊加密中有等幾種工作模式。與一樣在加密前需要對(duì)數(shù)據(jù)進(jìn)行填充,不是很適合對(duì)流數(shù)據(jù)進(jìn)行加密。 序 本文主要小結(jié)一下java里頭的AES以及RSA加解密。 AES showImg(https://segmentfault.com/img/remote/1460000011156406);使用AES加密時(shí)需要幾個(gè)參數(shù): 密鑰長(zhǎng)度(Key Size...
時(shí)間:2017年4月11日星期二說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/zccodere/s...個(gè)人學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:對(duì)稱(chēng)加密算法DES 1-1 JAVA對(duì)稱(chēng)加密算法DES 加密密鑰=解密密鑰 對(duì)稱(chēng)加密算法 初等 DES --3D...
閱讀 1974·2021-11-22 19:20
閱讀 2618·2021-11-22 13:54
閱讀 1932·2021-09-04 16:40
閱讀 1814·2021-08-13 11:54
閱讀 2628·2019-08-30 15:55
閱讀 3456·2019-08-29 13:51
閱讀 519·2019-08-29 11:09
閱讀 2997·2019-08-26 14:06