在企业微信会话存档解密中,腾讯官方文档是这样说明的:
encrypt_random_key内容解密说明:
encrypt_random_key是使用企业在管理端填写的公钥(使用模值为2048bit的秘钥),采用RSA加密算法进行加密处理后base64 encode的内容,加密内容为企业微信产生。RSA使用PKCS1。
企业得到消息内容后,需先进行base64 decode,使用消息指明版本的私钥,使用RSA PKCS1算法进行解密,得到解密内容,为下一步进行消息明文解析做准备。
对于解密不熟悉的人看了后 满脸问号??? 什么意思,我该怎么搞?sdk FinanceDemo 文件中也没有展示这里该怎么解密。然后无从下手,网上文档也很少!!! 稀碎
翻译一下上面的
需要对接收到的消息中encrypt_random_key进行base64 decode, 然后使用对应的私钥,使用rsa PKCS1算法进行解密。
具体该怎么弄,废话不多说了,直接干
为了方便先在http://tool.chacuo.net/cryptrsapubkey 这个网址上生成2048位 PKCS1秘钥对 方便验证
用此方法先获取秘钥
public static PrivateKey getPrivateKey(String privKeyPEM) throws Exception{
String privKeyPEMnew = privKeyPEM.replaceAll("\\n", "").replace("-----BEGIN RSA PRIVATE KEY-----", "").replace("-----END RSA PRIVATE KEY-----", "");
byte[] bytes = java.util.Base64.getDecoder().decode(privKeyPEMnew);
DerInputStream derReader = new DerInputStream(bytes);
DerValue[] seq = derReader.getSequence(0);
BigInteger modulus = seq[1].getBigInteger();
BigInteger publicExp = seq[2].getBigInteger();
BigInteger privateExp = seq[3].getBigInteger();
BigInteger prime1 = seq[4].getBigInteger();
BigInteger prime2 = seq[5].getBigInteger();
BigInteger exp1 = seq[6].getBigInteger();
BigInteger exp2 = seq[7].getBigInteger();
BigInteger crtCoef = seq[8].getBigInteger();
RSAPrivateCrtKeySpec keySpec = new RSAPrivateCrtKeySpec(modulus, publicExp, privateExp, prime1, prime2, exp1, exp2, crtCoef);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
return privateKey;
}
然后 对 encrypt_random_key 进行解密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);/getPrivateKey()返回的privateKey
byte[] randomkeybyte = Base64.getDecoder().decode(encrypt_random_key );
byte[] finalrandomkeybyte = cipher.doFinal(randomkeybyte);
String finalrandomkey = new String(finalrandomkeybyte);
最后调用微信接口解密就行
DecryptData(finalrandomkey,encrypt_chat_msg);