资讯专栏INFORMATION COLUMN

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

fox_soyoung / 3302人阅读

摘要:前情需要使用和实现同一个加解密算法,使版本加密的密文能够由代码解密,反之亦然。加密使用模式,需要一个向量,可增加加密算法的强度此处使用做转码。解密先用解密再将代码加密出来的密钥放到中进行解密大功告成,实现了在和的互转。

前情

需要使用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/43931.html

相关文章

  • 新版-PythonJava实现Aes相互解密

    摘要:前情需要使用和实现同一个加解密算法,使版本加密的密文能够由代码解密,反之亦然。加密使用模式,需要一个向量,可增加加密算法的强度此处使用做转码。解密先用解密再将代码加密出来的密钥放到中进行解密大功告成,实现了在和的互转。 前情 需要使用Python和Java实现同一个AES加解密算法,使Python版本加密的密文能够由Java代码解密,反之亦然。 Python实现 Python为3.6版...

    孙淑建 评论0 收藏0
  • JAVAAES密 简单实现 AES-128/ECB/PKCS5Padding

    摘要:加密是一种可逆加密算法,对用户的敏感信息加密处理。加密错误返回获取加密密文字节数组对密文字节数组进行转换为输出密文返回输出密文加密错误返回解密密文,带解密的内容密码,解密的密码返回明文,解密后得到的内容。 AES加密 AES 是一种可逆加密算法,对用户的敏感信息加密处理。 本文暂不深入AES原理,仅关注JAVA代码实现AES加解密。 JAVA代码实现 在用JAVA实现AES加密前,先浏...

    sourcenode 评论0 收藏0
  • python(3.x) 实现AES 解密

    摘要:首先安装确认安装的是版本版本的是不一样的文件头部的声明为我们可以生成一个随机的密钥注意要使用密码学安全的随机方法这里生成的是而不是为了可读性采用加密内容加密前需要到的整数倍长度才可有对应方法初始向量为长度返回初始向量加密数据解密方法为 首先 安装cryptography sudo pip3 install cryptography 确认安装的是2.1.x版本 (1.x版本的api是不一...

    harryhappy 评论0 收藏0
  • java解密实例

    摘要:序本文主要小结一下里头的以及加解密。属于块加密,块加密中有等几种工作模式。与一样在加密前需要对数据进行填充,不是很适合对流数据进行加密。 序 本文主要小结一下java里头的AES以及RSA加解密。 AES showImg(https://segmentfault.com/img/remote/1460000011156406);使用AES加密时需要几个参数: 密钥长度(Key Size...

    mengera88 评论0 收藏0
  • 慕课网_《Java实现对称密》学习总结

    时间:2017年4月11日星期二说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:https://github.com/zccodere/s...个人学习源码:https://github.com/zccodere/s... 第一章:对称加密算法DES 1-1 JAVA对称加密算法DES 加密密钥=解密密钥 对称加密算法 初等 DES --3D...

    tomlingtm 评论0 收藏0

发表评论

0条评论

fox_soyoung

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<