The only "cheat" you can do is make the client use a fixed random seed, but you would still have to understand the entire client security process.
Try browsing through the

version instead of the C++ version if it doesn't make much sense.
Basically, there are 3 main functions you need to look through:
1. SecurityAPI::Recv
Breaks up the TCP stream into logical packets first. Once you have logical packets, you can then process them.
So for you, first you need to understand how to break down the stream into packets. That's pretty simple, as you read two bytes and check the size. If the size is > 0x8000, then the packet is encrypted, if it's not, then it isn't. If the packet is encrypted, the payload size has to be % 8 (since that is what Blowfish requires) so you have to add 0 - 7 bytes to make the size % 8 (NOTE: The payload includes the 4 byte header for encrypted packets). If the packet is not encrypted, then the payload size is 4 (rest of the header) + the packet size. Once you know how many bytes of data you need, you just recv until you have them.
Now, you have raw 'packets' ready for processing.
2. SecurityAPI::Handshake
The logic that handles the entire security system. If the packet has an opcode of 0x5000 or 0x9000, it is part of the security system, so the Handshake function will process it. The packet format is dynamic depending on the mode. To see how the packet is generated, take a look at the SecurityAPI::GenerateSecurity function to understand the values. The client processes the packet the same way it is built, except that it reads rather than wrties.
3. SecurityAPI::FormatPacket
The logic for sending packets. For Client to Server packets, what goes on here simply depends on the security mode.
There's not much to understand about the encryption itself; it's just little-endian

. What you are having trouble with is understanding the actual Handshake process.
To understand the handshake process better, read up on the
Diffie–Hellman key exchange.
Once you understand the DH-KE algorithm, they just use a few custom functions (KeyTransformValue in the C# code) to scramble the data a little to prevent it from being 'trivial' to reimplement without digging through the client.
So basically it works like this:
1. Client connects to the server; server sends the initial security packet.
2. Client processes the security packet based on the mode (1st byte, look at my SecurityFlags structure) If:
blowfish - The initial blowfish key is read from the packet.
security_bytes - The base security bytes are read from the packet
handshake - The handshake values are read from the packet; a new blowfish key is used (read up on the DH-KE to understand why)
3. Client will send a response based on the security mode. Upon security acceptance, 0x9000 is finally sent and then regular packets begin (identify, 0x2001)
The logic isn't as complex as it might look at first. The reason there is so much code is because the security API handles
literally everything for you, so all you have to do is use the API and not worry about anything else. Also, the server processing code is included so that adds quite a bit of extra code, but it is a complete solution. The Silkroad security supports multiple modes so additional processing has to be done to ensure all modes are supported. SRO is the only game I've ever seen that does this, so it is quite unique.
You can grab a more recent, but currently outdated C++ version

. I'd still recommend going through the C# code as well if you are familiar with that language as it is the most recent version I have. If you look through say a really old copy like

, it works but there is noticeably more work and complications you have to deal with. My latest versions are designed around hiding all of that from the user.
Hope that helps!