Commit c429a7cf authored by Him188's avatar Him188

Fix decrypt

parent e2dd51e0
...@@ -68,10 +68,12 @@ internal val t163 = "2C 7A 7B 23 4E 24 3F 24 24 47 62 6B 69 2E 47 50".hexToBytes ...@@ -68,10 +68,12 @@ internal val t163 = "2C 7A 7B 23 4E 24 3F 24 24 47 62 6B 69 2E 47 50".hexToBytes
var ecdhPrivateKeyS = "97a52992cb7a2110413629af94a3c249c68a3b731510caa8" var ecdhPrivateKeyS = "97a52992cb7a2110413629af94a3c249c68a3b731510caa8"
internal val shareKeyCalculatedByConstPubKey internal val shareKeyCalculatedByConstPubKey
get() = ECDH.calculateShareKey( by lazy {
ECDH.calculateShareKey(
loadPrivateKey(ecdhPrivateKeyS), loadPrivateKey(ecdhPrivateKeyS),
initialPublicKey initialPublicKey
) )
}
var passwordMd5: ByteArray = byteArrayOf() var passwordMd5: ByteArray = byteArrayOf()
var uin: Long = 0L var uin: Long = 0L
...@@ -137,7 +139,14 @@ fun ByteReadPacket.analysisOneFullPacket(): ByteReadPacket = debugIfFail("Failed ...@@ -137,7 +139,14 @@ fun ByteReadPacket.analysisOneFullPacket(): ByteReadPacket = debugIfFail("Failed
println("uin=" + readString(readInt() - 4)) println("uin=" + readString(readInt() - 4))
println("// 解密 body") println("// 解密 body")
readRemainingBytes().tryDecrypt().toReadPacket().debugPrintThis("outer body decrypted").apply { val encrypted = readRemainingBytes()
val decrypted = encrypted.tryDecryptOrNull()
if (decrypted == null) {
println("cannot decrypt: ${encrypted.toUHexString()}")
error("cannot decrypt: ${encrypted.toUHexString()}")
} else {
decrypted.toReadPacket().debugPrintThis("outer body decrypted").apply {
when (flag1) { when (flag1) {
0x0A -> decodeSso() 0x0A -> decodeSso()
0x0B -> decodeUni() 0x0B -> decodeUni()
...@@ -263,6 +272,8 @@ fun ByteReadPacket.analysisOneFullPacket(): ByteReadPacket = debugIfFail("Failed ...@@ -263,6 +272,8 @@ fun ByteReadPacket.analysisOneFullPacket(): ByteReadPacket = debugIfFail("Failed
} }
} }
} }
}
} }
fun ByteReadPacket.decodeUni() { fun ByteReadPacket.decodeUni() {
...@@ -355,7 +366,7 @@ val keys: Map<String, ByteArray> ...@@ -355,7 +366,7 @@ val keys: Map<String, ByteArray>
"t108" to t108, "t108" to t108,
"t10c" to t10c, "t10c" to t10c,
"t163" to t163 "t163" to t163
) )
fun ByteArray.tryDecrypt(): ByteArray { fun ByteArray.tryDecrypt(): ByteArray {
return this.tryDecryptOrNull() ?: error("Cannot decrypt. Encrypted data=" + this.toUHexString()) return this.tryDecryptOrNull() ?: error("Cannot decrypt. Encrypted data=" + this.toUHexString())
......
package net.mamoe.mirai.utils.cryptor package net.mamoe.mirai.utils.cryptor
import net.mamoe.mirai.utils.io.chunkedHexToBytes import net.mamoe.mirai.utils.io.chunkedHexToBytes
import net.mamoe.mirai.utils.io.toUHexString
expect interface ECDHPrivateKey { expect interface ECDHPrivateKey {
fun getEncoded(): ByteArray fun getEncoded(): ByteArray
...@@ -65,8 +64,11 @@ private val commonHeadForNot02 = "3046301006072A8648CE3D020106052B8104001F033200 ...@@ -65,8 +64,11 @@ private val commonHeadForNot02 = "3046301006072A8648CE3D020106052B8104001F033200
private const val constantHead = "3046301006072A8648CE3D020106052B8104001F03320004" private const val constantHead = "3046301006072A8648CE3D020106052B8104001F03320004"
private val byteArray_04 = byteArrayOf(0x04) private val byteArray_04 = byteArrayOf(0x04)
private val head1 = "302E301006072A8648CE3D020106052B8104001F031A00".chunkedHexToBytes()
private val head2 = "3046301006072A8648CE3D020106052B8104001F03320004".chunkedHexToBytes()
fun ByteArray.adjustToPublicKey(): ECDHPublicKey { fun ByteArray.adjustToPublicKey(): ECDHPublicKey {
val head = if(this.size<30) "302E301006072A8648CE3D020106052B8104001F031A00" else "3046301006072A8648CE3D020106052B8104001F03320004" val head = if (this.size < 30) head1 else head2
return ECDH.constructPublicKey((head + this.toUHexString("")).chunkedHexToBytes()) return ECDH.constructPublicKey(head + this)
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment