首页 > 编程语言 >携程ASE加密解密 java python

携程ASE加密解密 java python

时间:2023-09-21 18:26:25浏览次数:34  
标签:body java String python bytes return str ASE import

java 代码

package com.example.trip_vip;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

import cn.hutool.core.codec.Base64;

public class MakeSign {

    private static String encodeName = "utf-8";

    public static void main(String[] args) {
        try {
            String accountId = "4965E5E2530767C1";
            String signKey = "E0A73F3A5D78D198BF2FB57879CF9A79";
            String aesKey = "D2DN340LGYSsBrP6";
            String aesIv = "5693259981590433";
            String requestJson = "{\"body\":\"ndgoebijlofhjbbghfldcjmdlbhfkbehoofoeafhljpjnceacdjnnahfhkjibplmclafjgdkpknpfpfammfcbcnoabjigcoglbdgddiljnaecfehccnhedpombockfajjihkkjmlnkabjegaklljfodpbiaammiemioajpehdlnlipflhnijkngbilhfghbcimejcnnkmdmbcfndblhcbmncighpnolnlkgncmbjbfpphehoocdkchgfbbafjickhhfellheekdjofbjfedglbiidjmmebfffkpbjindepidcjbmoebpeoeekcjhcmcgadcalchhnbcnkdbockljkbfejfiddpekebhnbkajmjihjhdfdnakohpgeejijlfbjciakjdcfeclbiellgjalajphblkoleiimcjkmajankcldmnnhofgopkefpdplbjabghbiapgomfpnkphdlobcojapaappchbacljconafemcdiplahdkgogidnkkkpdchmlfhlkemccdennbfkandhhlhalhflfhodcmfjcnjkaelnoainmaakckekmjonbmmbhbdaiicljpibjjdcddggepaibniibifipehjllgpajilagikmgnnopaiekbbhjcbhcologopheelcbjfhondfllknbfhpbipjccdpeemjciphdcdpghhmimogilfcbfgogaohpdanoileghhmpmglnelfpafenpdcepbeimncjlolgahhljhgodjabcologlfgmikgdhmmgcinpeebaifgjpmemdmojhfhikhgjjjnnhokaniagmjohgmpfepgekllajalldgfagoijlihklbhcihdbgdnaomikfkcjgjpohdcjdlfpiaccpfapcooalnmoeeddoifafhjdpoibpehdfckpmkblbgbhdejfemljbmhgdeeembdimobcahfpahefkfodmlgefedelecolfgbmcfghcpleallolkdabdjjnjmmlbfdbdlmhgpkechggkpinimepnhegnbdippliaeokaollmafiogldjkahihglmgohcfpmgdelfkolcdiicfjngoijopfjgcbehamflfcaibdgfdggnhmpcedepfhcpngfehgdoledhednombjnehgjlnbgakhcnlpadmchodgehhckkclbjamjadalphjhkbfnnblemognepjoejldllnjdihiojlagndkdefdalbjpmloechinhpdckcaoplckhhockbckngpfbcpgcieobmidkbcjgbpohbcepnahjlmijakoeoleeipdnooimceplefdeflbopcjbpgebomgaagglanfebicfhknbmkolldmoacheeffcjfebjaakgkhicpkbmmidgfohfiolagohlhleofiihfmjpgffafnlgfenninjjelnffkhjifefkkiekhfklljkjeanocpjdkhdflhdfbfjmfnfcojfpjjgdlomdncnhdebnkgjjcndbmogdngfekhgpbkaiaojlpkbngkignfmegiikmbcdlcjgdjikfcpcidomgacaeonbjacgbmhmhhmemppefmjmkhfnphladoimkiaikffkknckmojobpllhbkpnoggeijfonmggfhdpacddlklbonlbpphpppklmilbggkeddekbokadeeeikcalcljhpadnakpoikikdaignicnlblmglncbgeabeamdccimkcginijjhibaochcbhlaonifahopigeojongafpeancophigfmeppadkjcneokgmahinflmoehhipkjdjimeaflfdfangeiblihdopllcapgcfknfgafdnkhnhchmbdiidoebjlocbfjlkmegloadgcokemdadbaedjjlkfkicmhbgldjcopgpneoljeckpljlhklilmhelcbapgbbmbgbkmojeaephjamlkhkggkniglealmfkpoebmpjggajjajeognlkmlelcjkpbfigmipmnhlfnanahjjpeecpbkklkioaafadikelcaleneilfnneaippdiokiccmpnpkpclmaalgfhllbfajlcnblmojacbjbnglljgbkdhcifhjoljgblkdiklddgieejnkojjkljnokpiphbcapglknfjfaphmfbbalbcnnajkmhiihbmkgmefjenppddbnpabmdpaipieijcpjbfhdekafgnfkcgkcboeabejijniojkmllkkkihefhembibgmgfggjojgnphdpheneogomddooffbmfnlhcgfmkclmjnbboihcfhjofbdhmflpmbagdedeimlpeamohgchdnhfgnadeonihhgbghfgmmgegofhkhidigjaadodbjeddblflbhdjcbjbldidinkfeefmbcefniacjhcegjmkdcbemdeokjlpafdhklppnkddehdlcgphhjlmgflilmklecapiknmbffghcmjibgnkicnkncieooiojnioggifkjkhliigbikmanjlcfmpjclbngefehgpdfknpfpjjpiochcaapdaigmdkbpilgabjgphiaghdnhiifmbagkbjfpcjchieonalghogndcfplhbmdofndlclcmigiehgibkgdapdcfbdmocfggilfngobjndokkpkobonmnpdgnnbkfimdgkmejgmicgeimhcpecmhnecobmaddoleocepngjdndcoikfaoiaifegofkjciopichldlfifljlkmekhngpmimmfjnmlcpngmgnfaifmchmjjnhiolflandjeallbhijddcemfkjchcemdimcgdbkeipeaocfcplhhipgdlclfpdaeliahdkfmooikhaakkmalnggifndfefkjadclhaakigmcllacmhfefmepcbbjnafnljalfccffchmbkbnmpahhgkdlmdfkgpapjbfpgbgphmcjmffalljjpgnifmnphncookpgckacbpmehfeceeeebphgkoijikcoeiodefnocpbgijphdfalopkjcnbalhmdddkfdocblmgbfoplcoakcojjhofbdejmoimmpbclcbfkmmmblnhlabldjcenlbblohljgigmfpagpdncphminmemcnlhnbgfbjkbhdnhhcodccmbapjaaidjocaomkadedgpdocjngagjhgjiicipbfkhkelllapdjcngjodnaefclihahfinkccmigdhdjhlnglbmgiehddhgfbbhbicpofmmemkbebnpmmbalfknkfkhmfagafmopifclkleholjagkfemimflppjjgmlomeohokjoklghklpkhcplkkcbknmemajnpdlinpdjkpifoekbfoeiemfiipioofnckeompfbccdobapkbdjkibleobiaocpamipncidmbdlecddhhgadcknpaolapkifdeabfcdakbilmodkelmbbbgkcpmcemgldkgackeoojcfgdpodcibkbehgnnaglkmnlgliahcihlgcgb\",\"header\":{\"sign\":\"0c0cd6ee28a453cb754e0dee4d3fd4ec\",\"accountId\":\"4965E5E2530767C1\",\"requestTime\":\"2017-11-30 14:43:20\",\"version\":\"1.0\",\"serviceName\":\"CreateOrder\"}}";
            JSONObject jsonObject = JSON.parseObject(requestJson);
            String body = jsonObject.getString("body");
            String reqTimeStr = jsonObject.getJSONObject("header").getString("requestTime");
            String version = jsonObject.getJSONObject("header").getString("version");
            String serviceName = jsonObject.getJSONObject("header").getString("serviceName");
            String signSource = jsonObject.getJSONObject("header").getString("sign");
            String bodyJsonStr = decryptAES(body, aesKey, aesIv);
            String signParam = String.format("%s%s%s%s%s%s", accountId, serviceName, reqTimeStr, body, version, signKey);


            String signTarget = md5(signParam).toLowerCase();
            System.out.println(signSource);

            System.out.println(signParam);
            if (signTarget.equals(signSource) == true) {
                System.out.println("ok");
            } else {
                System.out.println("验签失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param encData
     * @param secretKey
     * @param vector
     * @return
     * @throws Exception
     */
    public static String encryptAES(String encData, String secretKey, String vector) {
        try {
            byte[] raw = secretKey.getBytes(encodeName);
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            IvParameterSpec iv = new IvParameterSpec(vector.getBytes(encodeName));
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
            byte[] encrypted = cipher.doFinal(encData.getBytes(encodeName));
            return encodeBytes(encrypted);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * @param decData
     * @param secretKey
     * @param vector
     * @return
     * @throws Exception
     */
    public static String decryptAES(String decData, String secretKey, String vector) {
        try {
            byte[] raw = secretKey.getBytes(encodeName);
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            IvParameterSpec iv = new IvParameterSpec(vector.getBytes(encodeName));
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
            byte[] encrypted1 = decodeBytes(decData);
            byte[] original = cipher.doFinal(encrypted1);
            return new String(original, encodeName);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * @param bytes
     * @return
     */
    public static String encodeBytes(byte[] bytes) {
        StringBuffer strBuf = new StringBuffer();
        for (int i = 0; i < bytes.length; i++) {
            strBuf.append((char) (((bytes[i] >> 4) & 0xF) + ((int) 'a')));
            strBuf.append((char) (((bytes[i]) & 0xF) + ((int) 'a')));
        }
        return strBuf.toString();
    }

    /**
     * @param str
     * @return
     */
    public static byte[] decodeBytes(String str) {
        byte[] bytes = new byte[str.length() / 2];
        for (int i = 0; i < str.length(); i += 2) {
            char c = str.charAt(i);
            bytes[i / 2] = (byte) ((c - 'a') << 4);
            c = str.charAt(i + 1);
            bytes[i / 2] += (c - 'a');
        }
        return bytes;
    }

    public static String encryptBase64(String source) {
        try {
            return Base64.encode(source);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static byte[] decryptBase64(String source) {

        try {
            return Base64.decode(source);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static String md5(String str) {
        if (str == null) {
            return null;
        }
        MessageDigest messageDigest = null;
        try {
            messageDigest = java.security.MessageDigest.getInstance("MD5");
            messageDigest.reset();
            messageDigest.update(str.getBytes(encodeName));
        } catch (NoSuchAlgorithmException e) {
            return str;
        } catch (UnsupportedEncodingException e) {
            return str;
        }
        byte[] byteArray = messageDigest.digest();
        StringBuilder md5StrBuff = new StringBuilder();
        for (int i = 0; i < byteArray.length; i++) {
            if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)
                md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
            else md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
        }
        return md5StrBuff.toString();
    }
}

python

import hashlib
import json

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad


def decode_bytes(string: str) -> bytes:
    length = len(string) // 2
    bytes_array = bytearray(length)
    for i in range(0, len(string), 2):
        c = string[i]
        bytes_array[i // 2] = (ord(c) - ord('a')) << 4
        c = string[i + 1]
        bytes_array[i // 2] += ord(c) - ord('a')
    return bytes(bytes_array)


def encrypted(body: dict, secret_key_raw: str, vector: str) -> str:
    cipher = AES.new(bytes(secret_key_raw, 'utf-8'), AES.MODE_CBC, bytes(vector, 'utf-8'))
    body_json = json.dumps(body, separators=(',', ':'))
    body_bytes = bytes(body_json, 'utf-8')
    body_pad = pad(body_bytes, AES.block_size, style='pkcs7')
    encrypted_data = cipher.encrypt(body_pad)
    data_body = encode_bytes(encrypted_data)
    return data_body


def encode_bytes(bytes: bytes) -> str:
    str_buf = []
    for b in bytes:
        str_buf.append(chr(((b >> 4) & 0xF) + ord('a')))
        str_buf.append(chr((b & 0xF) + ord('a')))
    return ''.join(str_buf)


def decrypted(body: str, secret_key_raw: str, vector: str) -> dict:
    cipher = AES.new(bytes(secret_key_raw, 'utf-8'), AES.MODE_CBC, bytes(vector, 'utf-8'))
    body_bytes = decode_bytes(body)
    body_decrypt = cipher.decrypt(body_bytes)
    decrypt_str = unpad(body_decrypt, 16).decode('utf-8')

    decrypt_dict = json.loads(decrypt_str)
    return decrypt_dict


def sign(data: object, trip_secret: str) -> str:
    data = data['header']['accountId'] + data['header']['serviceName'] + data['header']['requestTime'] + data['body'] + \
           data['header']['version'] + trip_secret
    md5 = hashlib.md5()
    md5.update(data.encode('utf-8'))
    sign = md5.hexdigest()
    return sign

标签:body,java,String,python,bytes,return,str,ASE,import
From: https://www.cnblogs.com/guanchaoguo/p/17720615.html

相关文章

  • JavaScript Library – Svelte
    前言上一回我介绍了 Alpine.js。作为我开发企业网站draft版本的renderengine。用了一阵子后,我觉得它真的非常不好用。所以打算换一个。前端有好几个framework/library/compiler都可以用来做MVVMrenderengine。比如Angular、React、Vue、LIt、Solid、Qwik、Svelt......
  • 携程 3DES加密解密 java python
    javapackagecom.example;importorg.springblade.core.tool.utils.*;importjavax.annotation.Nullable;importjavax.crypto.Cipher;importjavax.crypto.SecretKeyFactory;importjavax.crypto.spec.DESKeySpec;importjava.util.Objects;publicclassDES3{......
  • java循环
    publicclassTestWhile1{publicstaticvoidmain(String[]args){/*intnum=1;//条件初始化intresult=1;while(num<=13){//条件判断result*=num;//循环体num+=2;//num++//迭代}System.out.println(result);*//*intnu......
  • java抽象类和抽象方法
    1.抽象的概念 2.抽象类和抽象方法的使用1//抽象方法和抽象类的格式:2/*抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束;3抽象类:抽象方法所在的类,必须是抽象类才行,在class之前的写上abstract即可。45如何使用抽象类和抽象方法61.不能直接创建(new)抽象类对......
  • java开发之个人微信的二次开发
    简要描述:设置个人头像请求URL:http://域名地址/sendHeadImage请求方式:POST请求头Headers:Content-Type:application/jsonAuthorization:Authorization值(登录获取码信息接口中返回的认证信息值)参数:参数名必选类型说明wId是string登录实例标识path是string图片url链接返回数据:参数名类型......
  • org/springframework/boot/maven/RepackageMojo has been compiled by a more recent
    项目场景:项目中执行clean,再执行install时报错,错误如下org/springframework/boot/maven/RepackageMojohasbeencompiledbyamorerecentversionoftheJavaRuntime(classfileversion61.0),thisversionoftheJavaRuntimeonlyrecognizesclassfileversionsupt......
  • 转~~Python:ModuleNotFoundError: No module named 模块名 错误及解决方案
    IDE中语法检查,运行都正常,Linux命令行远程运行就报错:参考文档:https://blog.csdn.net/SeaSky_Steven/article/details/106426985 1print(os.pardir)2sys.path.append(os.pardir)34'''5os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;6sys模块负责程......
  • java日期时间类现在(java8及以后版本)推荐使用java.time 包中的类
    以下信息由AI模型"文心一言"提供,仅供参考:在Java8之后,推荐使用新的日期和时间API,即java.time包中的类。主要有以下原因:更好的设计和功能:新的日期和时间API在设计和功能上都更优。它包括时间、日期、时间间隔等更全面的表示,并支持更准确的计算和格式化。更全面的时间......
  • JavaScript实现数组对象去重
    有多种实现方式:一、使用 Set 对象:1Array.from(new Set(array))该方法会先创建一个 Set 对象,然后再使用 Array.from 方法将 Set 对象转换为数组,因为 Set 对象不允许有重复的元素,所以这样可以实现去重的效果。但是,如果数组中的元素是对象,Set 对......
  • java定时器
    好多朋友用过Windows的任务计划,也有不少程序迷自己曾写过时钟报警、系统自动关机等趣味程序,可却很少有朋友在Web工程中实现过类似功能。  有人说Timer只能规定从现在开始的多长时间后,每隔多久做一次事或在什么时间做一次事,那我想在每月1号或每天12点做一项工作如何做呢?你只要......