Python版本
import rsa
from Crypto.Cipher import AES
import base64
from binascii import a2b_hex
def get_transit_id():
"""
获取transit_id
:return: transit_id
"""
# vendors.js PUBLICKEY
pubkey = rsa.PublicKey.load_pkcs1_openssl_pem("-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJ50kaClQ5XTQfzkHAW9Ehi+iXQKUwVWg1R0SC3uYIlVmneu6AfVPEj6ovMmHa2ucq0qCUlMK+ACUPejzMZbcRAMtDAM+o0XYujcGxJpcc6jHhZGO0QSRK37+i47RbCxcdsUZUB5AS0BAIQOTfRW8XUrrGzmZWtiypu/97lKVpeQIDAQAB\n-----END PUBLIC KEY-----\n")
crypto = rsa.encrypt(b"w28Cz694s63kBYk4", pubkey)
transit_id = base64.b64encode(crypto).decode("utf-8")
return transit_id
def data_decrypt(text):
"""
对数据解密并处理
:return: 解密处理后的店铺信息列表
"""
password = "w28Cz694s63kBYk4"
key = password.encode("utf-8")
mode = AES.MODE_CBC
b_data = bytes(text, encoding="utf-8")
cryptor = AES.new(key, mode, b"4kYBk36s496zC82w") # 偏移量
plain_text = cryptor.decrypt(a2b_hex(b_data))
result_data = bytes.decode(plain_text).rstrip("\0")
return result_data
代码由壁洪提供,具体出处未拿到。使用data_decrypt可正常解密市场排行加密数据。
在安装Crypto模块的时候,直接使用pip install Crypto安装后,依然会提示Crypto包不存在,后网上查到需要按这样安装:
pip install pycryptodome
但是这样一直安装失败,后再查到,如果是Linux才这样安装,如果是Windows需要按下面的洛来安装:
pip install crypto pycryptodome
pip uninstall crypto pycryptodome
pip install pycryptodome
C#版本
由于我使用的工具是C#的,将上面的Python转成了C#代码,如下:
public class SycmDecrypt
{
public static string Decrypt(string data)
{
string password = "w28Cz694s63kBYk4";
//加密初始化向量
string iv = "4kYBk36s496zC82w";
return AESDecrypt(data, password, iv);
}
/// <summary>
/// AES解密
/// </summary>
/// <param name="text"></param>
/// <param name="password"></param>
/// <param name="iv"></param>
/// <returns></returns>
public static string AESDecrypt(string text, string password, string iv)
{
byte[] byteKEY = Encoding.UTF8.GetBytes(password);
byte[] byteIV = Encoding.UTF8.GetBytes(iv);
byte[] byteDecrypt = HexStringToBytes(text);
var _aes = new RijndaelManaged();
_aes.Padding = PaddingMode.Zeros;
_aes.Mode = CipherMode.CBC;
_aes.Key = byteKEY;
_aes.IV = byteIV;
var _crypto = _aes.CreateDecryptor(byteKEY, byteIV);
byte[] decrypted = _crypto.TransformFinalBlock(byteDecrypt, 0, byteDecrypt.Length);
_crypto.Dispose();
return Encoding.UTF8.GetString(decrypted);
}
/// <summary>
/// 将16进制字符串转成Bytes数组
/// </summary>
/// <param name="hs"></param>
/// <returns></returns>
private static byte[] HexStringToBytes(string hs)
{
var length = hs.Length / 2;
byte[] b = new byte[length];
for (int i = 0; i < length; i++)
{
b[i] = Convert.ToByte(hs.Substring(i * 2, 2), 16);
}
return b;
}
}