zoukankan      html  css  js  c++  java
  • 最新版-Python和Java实现Aes相互加解密

    参考

    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();
            }
        }
    }
    
    
  • 相关阅读:
    6-Python爬虫-分布式爬虫/Redis
    ES 查询时 排序报错(fielddata is disabled on text fileds by default ... )解决方法
    Intellij Idea webstorm 激活
    Intellij Idea 配置jdk
    java 获取(格式化)日期格式
    js 跳转 XSS漏洞 预防
    CSS去掉背景颜色
    js对象无法当成参数传递 解决方法
    Elasticsearch java api
    java多条件查询SQL语句拼接的小技巧
  • 原文地址:https://www.cnblogs.com/wzbk/p/14811274.html
Copyright © 2011-2022 走看看