NAME

Net::BitTorrent::Protocol::MSE - Message Stream Encryption (MSE/PE)

SYNOPSIS

use Net::BitTorrent::Protocol::MSE;

my $mse = Net::BitTorrent::Protocol::MSE->new(
    infohash     => $bin_ih,
    is_initiator => 1
);

# Step 1: Send initial Public Key
my $out = $mse->write_buffer( );

# Step 2: Feed data from socket until state is 'PAYLOAD'
while ($mse->state ne PAYLOAD) {
    $mse->receive_data($raw_incoming);
    my $reply = $mse->write_buffer( );
    # send $reply to peer
}

# Step 3: Transparently encrypt/decrypt PWP messages
my $encrypted = $mse->encrypt_data( $pwp_payload );
my $plain     = $mse->decrypt_data( $raw_from_socket );

DESCRIPTION

Net::BitTorrent::Protocol::MSE implements the Message Stream Encryption (MSE) protocol, also known as Protocol Encryption (PE). This protocol provides a layer of obfuscation for BitTorrent traffic, helping to prevent passive traffic analysis and "throttling" by ISPs.

Security Disclaimer

MSE is not designed to provide strong cryptographic security or authentication. It is purely an obfuscation layer designed to make the BitTorrent protocol difficult to identify via simple pattern matching.

METHODS

receive_data( $data )

Feeds raw bytes from the transport layer. During the handshake, it advances the MSE state machine. Once the state is PAYLOAD, it returns the decrypted plaintext.

encrypt_data( $data ) / decrypt_data( $data )

High level methods for stream obfuscation. These should only be used once state( ) returns PAYLOAD.

write_buffer( )

Returns pending bytes that must be sent to the remote peer to advance the handshake or provide encryption responses.

state( )

Returns the current MSE handshake state:

  • A_WAIT_PUBKEY, B_WAIT_PUBKEY: Waiting for Diffie-Hellman exchange.

  • A_WAIT_SELECT, B_WAIT_REQS: Synchronizing on the infohash.

  • PAYLOAD: Handshake complete; stream is now obfuscated.

Architecture

MSE uses a 768-bit Diffie-Hellman key exchange to derive a shared secret, which is then used to seed two RC4 stream ciphers (one for each direction).

AUTHOR

Sanko Robinson <sanko@cpan.org>

COPYRIGHT

Copyright (C) 2008-2026 by Sanko Robinson.

This library is free software; you can redistribute it and/or modify it under the terms of the Artistic License 2.0.