1.首先来个整体的解析
- params:经过两次AES加密后的数据(128位,CBC,pkcs5padding)
第一加密:要加密的是真正要发送的明文数据(数据的具体格式,下面会讲),密钥固定为0CoJUm6Qyw8W8jud,iv为固定为0102030405060708
第二加密:先把第一次加密结果转base64格式后,再进行加密。密钥是在前端随机生成的(长度为16个字节),iv为也是固定为0102030405060708
- encSecKey:经过RSA加密后的数据(1024位,ECB,nopadding)
上面提到的第二次AES加密的密钥是在前端随机生成的,服务器想要解密数据,必须知道这个密钥,但服务器是怎么知道这个随机密钥的呢?
这时encSecKey就派上用场了。用RSA加密AES密钥后,再发给服务器。没错,encSecKey就是RSA加密后的AES密钥
注意,在加密前,需要对明文反转处理,例如:如果加密的明文是aaaabbbbccccdddd,那你要把它转成ddddccccbbbbaaaa后再进行RSA加密
用到了RSA加密,那这个RSA的公钥是多少?很幸运,这个公钥是固定的。modulus和publicExponent如下(都是十进制):
modulus=157794750267131502212476817800345498121872783333389747424011531025366277535262539913701806290766479189477533597854989606803194253978660329941980786072432806427833685472618792592200595694346872951301770580765135349259590167490536138082469680638514416594216629258349130257685001248172188325316586707301643237607
publicExponent=65537
2.简化爬虫
上面提到过,params的第二次AES加密的密钥是在前端随机生成的,假如进行干预,让每次生成的密钥都一样,这样的话encSecKey每次也就一样了。
为了方便爬虫,让每次encSecKey都固定,我就让第二次AES加密密钥每次都是aaaabbbbccccdddd
然后进行按上面提到的规则进行RSA加密,生成encSecKey代码如下
import javax.crypto.Cipher;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.RSAPublicKeySpec;
public class Test {
public static void main(String[] args) throws Exception{
String modulus ="15779475026713150221247681780034549812187278333338974742401153102536627753526253991370180629076647918947753359785498960680319425397866032994198078607243280642783368547261879259220059