我打算在LOL中进行游戏数据挖掘,但停留在解析重播文件上。我发现最受欢迎的重放记录器是LOL Replay,它以.lrf文件记录游戏。它们被保存为二进制文件。我尝试打印lrf文件以在其中找到一些模式。据我所知,该文件分为两部分:
?S4GI____GET /observer-mode/rest/consumer/getGameDataChunk/EUW1/1390319411/1/token
?S4GH____?¥?G??,\??1?q??"Lq}?n??&??????l??(?^P???¥I?v??k>x??Z?£??3Gug
......
??6GI____GET /observer-mode/rest/consumer/getGameDataChunk/EUW1/1390319411/2/token
有些甚至是不可读的字符。3
我遵循了这个link和这个wiki。在使用GZIP压缩内容后,似乎他们使用BlowFish ECB算法和PKCS5Padding进行加密。但是我无法使用元数据中的32个字节的加密密钥解密内容。而且我不确定应该从哪里开始阅读以及从哪里停止,因为JVM不断警告我,给定的最终代码块未正确填充。
所以我的问题是:
任何帮助,将不胜感激。感谢你们。
编辑@ 6.17:
按照Divis和avbor的回答,我尝试了以下Java代码片段来解码块:
// Decode EncryptKey with GameId
byte[] gameIdBytes = ("502719605").getBytes();
SecretKeySpec gameIdKeySpec = new SecretKeySpec(gameIdBytes, "Blowfish");
Cipher gameIdCipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
gameIdCipher.init(Cipher.DECRYPT_MODE, gameIdKeySpec);
byte[] encryptKeyBytes = Base64.decode("Sf9c+zGDyyST9DtcHn2zToscfeuN4u3/");
byte[] encryptkeyDecryptedByGameId = gameIdCipher.doFinal(encryptKeyBytes);
// Initialize the chunk cipher
SecretKeySpec chunkSpec = new SecretKeySpec(encryptkeyDecryptedByGameId, "Blowfish");
Cipher chunkCipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
chunkCipher.init(Cipher.DECRYPT_MODE, chunkSpec);
byte[] chunkContent = getChunkContent();
byte[] chunkDecryptedBytes = chunkCipher.doFinal(chunkContent);
使用gameid解码加密密钥时,它没有任何错误。但是,它在后两行中不起作用。目前,我只是硬编码getChunkContent()以返回一个字节数组,其中包含两个RESTful URL之间的字节。但是Java要么返回“线程“main”中的异常”,否则javax.crypto.IllegalBlockSizeException:使用填充密码解密时,输入长度必须是8的倍数”
要么
返回“线程“主”中的异常javax.crypto.BadPaddingException:给定的最终块未正确填充”。
我注意到两个RESTful URL之间的十六进制模式如下:
(第一个URL的十六进制,例如/ observer-mode / rest / consumer / getKeyFrame / EUW1 / 502719605/2 / token)+ 0a +(大块内容)+ 000000 +(下一个URL的十六进制)
我的问题是:
我的测试lrf文件可以下载到:https://www.dropbox.com/s/yl1havphnb3z86d/game1.lrf
编辑@ 6.18
感谢Divis!使用上面的代码片段,我成功地解密了一些块信息,而没有错误。编写自己的getChunkContent()时需要注意两点:
但是我还有两个问题要问:
39117e0cc2f7e4bb1f8b080000000000000bed7d0b5c15d5 ... 7f23a90000
我知道根据这个RFC doc,Gzip压缩数据以“1f8b08 ...”开头。我可以只丢弃“39117e0cc2f7e4bb”并启动gzip解压缩后续内容吗? (实际上,我已经尝试从“1f8b08 ..”开始解码,至少可以将其解压缩而不会出现错误)
数百万的感谢!
最佳答案
根据Wiki,此处的存储库开发提供者,密钥是base64 Blowfish ECB“encryption_key”(游戏ID为河豚的密钥)。
然后,使用此解密的密钥对内容进行解码(也可以吹鱼ECB)。然后,gzip解码。
base64decode encryptionkey = decodedKey
blowfishECBdecode decodedKey with (string) gameId as key = decodedKey
blowfishECBdecode content with decodedKey as key = decodedContent
gzipdecode decodedContent = binary
我制作了一个库以下载和解码重播文件:https://github.com/EloGank/lol-replay-downloader,并且还提供了 CLI命令:https://github.com/EloGank/lol-replay-downloader-cli
希望对您有所帮助:)
关于java - 英雄联盟通过其RESTful API阅读 block /关键帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22827221/