Работа над расшифровкой TLS
This commit is contained in:
@@ -18,8 +18,11 @@ import ru.serega6531.packmate.utils.PRF;
|
|||||||
import ru.serega6531.packmate.utils.TlsUtils;
|
import ru.serega6531.packmate.utils.TlsUtils;
|
||||||
|
|
||||||
import javax.crypto.Cipher;
|
import javax.crypto.Cipher;
|
||||||
|
import javax.crypto.spec.IvParameterSpec;
|
||||||
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
import javax.net.ssl.X509KeyManager;
|
import javax.net.ssl.X509KeyManager;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
import java.security.cert.X509Certificate;
|
import java.security.cert.X509Certificate;
|
||||||
import java.security.interfaces.RSAPrivateKey;
|
import java.security.interfaces.RSAPrivateKey;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@@ -67,14 +70,48 @@ public class TlsDecryptor {
|
|||||||
|
|
||||||
byte[] encryptedPreMaster = TlsKeyUtils.getClientRsaPreMaster(clientKeyExchange.getContent(), 0);
|
byte[] encryptedPreMaster = TlsKeyUtils.getClientRsaPreMaster(clientKeyExchange.getContent(), 0);
|
||||||
|
|
||||||
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
|
Cipher rsa = Cipher.getInstance("RSA/ECB/PKCS1Padding");
|
||||||
cipher.init(Cipher.DECRYPT_MODE, privateKey);
|
rsa.init(Cipher.DECRYPT_MODE, privateKey);
|
||||||
byte[] preMaster = cipher.doFinal(encryptedPreMaster);
|
byte[] preMaster = rsa.doFinal(encryptedPreMaster);
|
||||||
byte[] seed1 = ArrayUtils.addAll(clientRandom, serverRandom);
|
byte[] randomCS = ArrayUtils.addAll(clientRandom, serverRandom);
|
||||||
byte[] seed2 = ArrayUtils.addAll(serverRandom, clientRandom);
|
byte[] randomSC = ArrayUtils.addAll(serverRandom, clientRandom);
|
||||||
|
|
||||||
byte[] masterSecret = PRF.getBytes(preMaster, "master secret", seed1, 48);
|
byte[] masterSecret = PRF.getBytes(preMaster, "master secret", randomCS, 48);
|
||||||
byte[] expanded = PRF.getBytes(masterSecret, "key expansion", seed2, 136);
|
byte[] expanded = PRF.getBytes(masterSecret, "key expansion", randomSC, 136);
|
||||||
|
|
||||||
|
byte[] clientMacKey = new byte[20];
|
||||||
|
byte[] serverMacKey = new byte[20];
|
||||||
|
byte[] clientEncryptionKey = new byte[32];
|
||||||
|
byte[] serverEncryptionKey = new byte[32];
|
||||||
|
byte[] clientIV = new byte[16];
|
||||||
|
byte[] serverIV = new byte[16];
|
||||||
|
|
||||||
|
ByteBuffer bb = ByteBuffer.wrap(expanded);
|
||||||
|
bb.get(clientMacKey);
|
||||||
|
bb.get(serverMacKey);
|
||||||
|
bb.get(clientEncryptionKey);
|
||||||
|
bb.get(serverEncryptionKey);
|
||||||
|
bb.get(clientIV);
|
||||||
|
bb.get(serverIV);
|
||||||
|
|
||||||
|
Cipher aes = Cipher.getInstance("AES/CBC/NoPadding"); // TLS_RSA_WITH_AES_256_CBC_SHA
|
||||||
|
SecretKeySpec skeySpec = new SecretKeySpec(clientEncryptionKey, "AES");
|
||||||
|
IvParameterSpec ivParameterSpec = new IvParameterSpec(clientIV);
|
||||||
|
aes.init(Cipher.DECRYPT_MODE, skeySpec, ivParameterSpec);
|
||||||
|
|
||||||
|
byte[] data = tlsPackets.entrySet().stream()
|
||||||
|
.filter(ent -> ent.getKey().isIncoming())
|
||||||
|
.map(Map.Entry::getValue)
|
||||||
|
.flatMap(Collection::stream)
|
||||||
|
.filter(p -> p.getContentType() == ContentType.HANDSHAKE)
|
||||||
|
.map(p -> ((HandshakeRecord) p.getRecord()))
|
||||||
|
.filter(r -> r.getHandshakeType() == HandshakeType.ENCRYPTED_HANDSHAKE_MESSAGE)
|
||||||
|
.map(r -> ((BasicRecordContent) r.getContent()))
|
||||||
|
.findFirst()
|
||||||
|
.orElseThrow()
|
||||||
|
.getContent();
|
||||||
|
|
||||||
|
byte[] decrypt = aes.doFinal(data);
|
||||||
System.out.println();
|
System.out.println();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,10 @@ public class ApplicationDataRecord implements TlsRecord {
|
|||||||
System.arraycopy(rawData, offset, data, 0, length);
|
System.arraycopy(rawData, offset, data, 0, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public byte[] getData() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return " Encrypted data: [" + data.length + " bytes]";
|
return " Encrypted data: [" + data.length + " bytes]";
|
||||||
|
|||||||
Reference in New Issue
Block a user