Source for file ssh_demo.php
Documentation is available at ssh_demo.php
// $Id: ssh_demo.php,v 1.4 2006/11/16 15:42:08 terrafrost Exp $
// Example of Math_BigInteger's speed. The numbers are obtained by partially negotiating an SSHv1 session with
// shell.sourceforge.net.
// On a 1.6GHz Intel Pentium-M running PHP5, the modular exponentiation took less than a fifth of a second, whereas
// with the BCMath functions, it took a hundreths of a second. That BCMath is faster, however, should come as no
// surprise, given that BCMath has been pre-compiled into assembly and in all likelyhood uses 64-bit integers - something
// that PHP, quite simply, does not support, as yet.
// bcpowmod is included with Math_BigInteger.php via PHP_Compat.
include('../Math_BigInteger.php');
define('SSH_SMSG_PUBLIC_KEY',2 );
//define('MATH_BIGINTEGER_MODE',MATH_BIGINTEGER_MODE_INTERNAL);
// if shell.sourceforge.net doesn't work for you, try another domain name.
//ssh1_connect('black.cs.utexas.edu',22);
$identifier = 'SSH-1.5-'. basename(__FILE__ );
$fsock = fsockopen($host,$port,$errno,$errstr,10 );
die (" Error $errno: $errstr" );
$init_line = fgets($fsock,255 );
if (!preg_match('#SSH-([0-9\.]+)-(.+)#',$init_line,$parts)) {
die ('Not an SSH server on the other side.');
die (" SSH version {$parts[1]} is not supported!" );
echo " Connecting to $init_line\r\n";
fputs($fsock," $identifier\n" );
die ('Expected SSH_SMSG_PUBLIC_KEY!');
$session_id = pack('H*',md5($host_key_public_modulus. $server_key_public_modulus. $anti_spoofing_cookie));
// ought to use a cryptographically secure random number generator (which mt_srand is not)
mt_srand((float) $sec + ((float) $usec * 100000 ));
for ($i=0; $i<32; $i++ ) {
$double_encrypted_session_key = $session_key ^ str_pad($session_id,32 ,chr(0 ));
if ($server_key_public_modulus->compare ($host_key_public_modulus) < 0 ) {
$prepped_key = prep_session_key($double_encrypted_session_key,$server_key_public_modulus);
$server_key_public_exponent,
$server_key_public_modulus
$server_key_public_exponent,
$server_key_public_modulus
$prepped_key = prep_session_key($double_encrypted_session_key,$host_key_public_modulus);
$host_key_public_exponent,
$host_key_public_exponent,
// see 'The Binary Packet Protocol' section of ssh1-draft.txt for more info.
// also, this function could be improved upon by adding detection for the following exploit:
// http://www.securiteam.com/securitynews/5LP042K3FY.html
$padding_length = 8 - ($temp['len'] & 7 );
$raw = fread($fsock, $temp['len'] + $padding_length);
$padding = substr($raw,0 ,$padding_length);
$type = $raw{$padding_length};
$data = substr($raw,$padding_length+1 ,-4 );
if ( $temp['crc'] != crc($padding. $type. $data) ) {
die ('Bad CRC in packet from server');
$substr = substr($string,0 ,$index);
$string = substr($string,$index);
// PHP's crc32 function is implemented slightly differently than the one that SSH v1 uses, so
// we've reimplemented it. A more detailed discussion of the differences can be found after
// $crc_lookup_table's initialization.
static $crc_lookup_table = array (
0x00000000 , 0x77073096 , 0xEE0E612C , 0x990951BA ,
0x076DC419 , 0x706AF48F , 0xE963A535 , 0x9E6495A3 ,
0x0EDB8832 , 0x79DCB8A4 , 0xE0D5E91E , 0x97D2D988 ,
0x09B64C2B , 0x7EB17CBD , 0xE7B82D07 , 0x90BF1D91 ,
0x1DB71064 , 0x6AB020F2 , 0xF3B97148 , 0x84BE41DE ,
0x1ADAD47D , 0x6DDDE4EB , 0xF4D4B551 , 0x83D385C7 ,
0x136C9856 , 0x646BA8C0 , 0xFD62F97A , 0x8A65C9EC ,
0x14015C4F , 0x63066CD9 , 0xFA0F3D63 , 0x8D080DF5 ,
0x3B6E20C8 , 0x4C69105E , 0xD56041E4 , 0xA2677172 ,
0x3C03E4D1 , 0x4B04D447 , 0xD20D85FD , 0xA50AB56B ,
0x35B5A8FA , 0x42B2986C , 0xDBBBC9D6 , 0xACBCF940 ,
0x32D86CE3 , 0x45DF5C75 , 0xDCD60DCF , 0xABD13D59 ,
0x26D930AC , 0x51DE003A , 0xC8D75180 , 0xBFD06116 ,
0x21B4F4B5 , 0x56B3C423 , 0xCFBA9599 , 0xB8BDA50F ,
0x2802B89E , 0x5F058808 , 0xC60CD9B2 , 0xB10BE924 ,
0x2F6F7C87 , 0x58684C11 , 0xC1611DAB , 0xB6662D3D ,
0x76DC4190 , 0x01DB7106 , 0x98D220BC , 0xEFD5102A ,
0x71B18589 , 0x06B6B51F , 0x9FBFE4A5 , 0xE8B8D433 ,
0x7807C9A2 , 0x0F00F934 , 0x9609A88E , 0xE10E9818 ,
0x7F6A0DBB , 0x086D3D2D , 0x91646C97 , 0xE6635C01 ,
0x6B6B51F4 , 0x1C6C6162 , 0x856530D8 , 0xF262004E ,
0x6C0695ED , 0x1B01A57B , 0x8208F4C1 , 0xF50FC457 ,
0x65B0D9C6 , 0x12B7E950 , 0x8BBEB8EA , 0xFCB9887C ,
0x62DD1DDF , 0x15DA2D49 , 0x8CD37CF3 , 0xFBD44C65 ,
0x4DB26158 , 0x3AB551CE , 0xA3BC0074 , 0xD4BB30E2 ,
0x4ADFA541 , 0x3DD895D7 , 0xA4D1C46D , 0xD3D6F4FB ,
0x4369E96A , 0x346ED9FC , 0xAD678846 , 0xDA60B8D0 ,
0x44042D73 , 0x33031DE5 , 0xAA0A4C5F , 0xDD0D7CC9 ,
0x5005713C , 0x270241AA , 0xBE0B1010 , 0xC90C2086 ,
0x5768B525 , 0x206F85B3 , 0xB966D409 , 0xCE61E49F ,
0x5EDEF90E , 0x29D9C998 , 0xB0D09822 , 0xC7D7A8B4 ,
0x59B33D17 , 0x2EB40D81 , 0xB7BD5C3B , 0xC0BA6CAD ,
0xEDB88320 , 0x9ABFB3B6 , 0x03B6E20C , 0x74B1D29A ,
0xEAD54739 , 0x9DD277AF , 0x04DB2615 , 0x73DC1683 ,
0xE3630B12 , 0x94643B84 , 0x0D6D6A3E , 0x7A6A5AA8 ,
0xE40ECF0B , 0x9309FF9D , 0x0A00AE27 , 0x7D079EB1 ,
0xF00F9344 , 0x8708A3D2 , 0x1E01F268 , 0x6906C2FE ,
0xF762575D , 0x806567CB , 0x196C3671 , 0x6E6B06E7 ,
0xFED41B76 , 0x89D32BE0 , 0x10DA7A5A , 0x67DD4ACC ,
0xF9B9DF6F , 0x8EBEEFF9 , 0x17B7BE43 , 0x60B08ED5 ,
0xD6D6A3E8 , 0xA1D1937E , 0x38D8C2C4 , 0x4FDFF252 ,
0xD1BB67F1 , 0xA6BC5767 , 0x3FB506DD , 0x48B2364B ,
0xD80D2BDA , 0xAF0A1B4C , 0x36034AF6 , 0x41047A60 ,
0xDF60EFC3 , 0xA867DF55 , 0x316E8EEF , 0x4669BE79 ,
0xCB61B38C , 0xBC66831A , 0x256FD2A0 , 0x5268E236 ,
0xCC0C7795 , 0xBB0B4703 , 0x220216B9 , 0x5505262F ,
0xC5BA3BBE , 0xB2BD0B28 , 0x2BB45A92 , 0x5CB36A04 ,
0xC2D7FFA7 , 0xB5D0CF31 , 0x2CD99E8B , 0x5BDEAE1D ,
0x9B64C2B0 , 0xEC63F226 , 0x756AA39C , 0x026D930A ,
0x9C0906A9 , 0xEB0E363F , 0x72076785 , 0x05005713 ,
0x95BF4A82 , 0xE2B87A14 , 0x7BB12BAE , 0x0CB61B38 ,
0x92D28E9B , 0xE5D5BE0D , 0x7CDCEFB7 , 0x0BDBDF21 ,
0x86D3D2D4 , 0xF1D4E242 , 0x68DDB3F8 , 0x1FDA836E ,
0x81BE16CD , 0xF6B9265B , 0x6FB077E1 , 0x18B74777 ,
0x88085AE6 , 0xFF0F6A70 , 0x66063BCA , 0x11010B5C ,
0x8F659EFF , 0xF862AE69 , 0x616BFFD3 , 0x166CCF45 ,
0xA00AE278 , 0xD70DD2EE , 0x4E048354 , 0x3903B3C2 ,
0xA7672661 , 0xD06016F7 , 0x4969474D , 0x3E6E77DB ,
0xAED16A4A , 0xD9D65ADC , 0x40DF0B66 , 0x37D83BF0 ,
0xA9BCAE53 , 0xDEBB9EC5 , 0x47B2CF7F , 0x30B5FFE9 ,
0xBDBDF21C , 0xCABAC28A , 0x53B39330 , 0x24B4A3A6 ,
0xBAD03605 , 0xCDD70693 , 0x54DE5729 , 0x23D967BF ,
0xB3667A2E , 0xC4614AB8 , 0x5D681B02 , 0x2A6F2B94 ,
0xB40BBE37 , 0xC30C8EA1 , 0x5A05DF1B , 0x2D02EF8D
// For this function to yield the same output as PHP's crc32 function, $crc would have to be
// set to 0xFFFFFFFF, initially - not 0x00000000 as it currently is.
for ($i=0; $i< $length; $i++ ) {
// We AND $crc >> 8 with 0x00FFFFFF because we want the eight newly added bits to all
// be zero. PHP, unfortunately, doesn't always do this. 0x80000000 >> 8, as an example,
// yields 0xFF800000 - not 0x00800000. The following link elaborates:
// http://www.php.net/manual/en/language.operators.bitwise.php#57281
$crc = (($crc >> 8 ) & 0x00FFFFFF ) ^ $crc_lookup_table[($crc & 0xFF ) ^ ord($text{$i})];
// In addition to having to set $crc to 0xFFFFFFFF, initially, the return value must be XOR'd with
// 0xFFFFFFFF for this function to return the same thing that PHP's crc32 function would.
$modulus = $modulus->toBytes ();
for ($i=0; $i< $length; $i++ ) {
$result .= chr(0 ). $session_key;
// returns mod(pow($m,$e),$n), where $n should be the product of two (large) primes $p and $q and where $e
// should be a number with the property that gcd($e,($p-1)*($q-1)) == 1. could just make anything that
// calls this call modexp, instead, but I think this makes things clearer, maybe...
echo "\r\nRSA with Math_BigInteger\r\n\r\n(". $m->toString (). ' ^ '. $key[0 ]->toString (). ') % '. $key[1 ]->toString (). "\r\n\r\n";
$temp = $m->modPow ($key[0 ],$key[1 ]);
echo " \r\n\r\nElapsed Time == $end\r\n";
echo " \r\nRSA with BCMath\r\n\r\n($m ^ {$key[0]}) % {$key[1]}\r\n\r\n";
$temp = bcpowmod ($m,$key[0 ],$key[1 ],0 );
echo " \r\n\r\nElapsed Time == $end\r\n";
$len+= (3* $len)%4; // rounds $len to the nearest 4.
for ($i=0; $i< $len; $i+=4 ) {
$value = bcmul ($value,4294967296 ); // 4294967296 == 2**32
$value = bcadd ($value,0x1000000* ord($x{$i}) + ((ord($x{$i+1 })<<16 ) | (ord($x{$i+2 })<<8 ) | ord($x{$i+3 })));
while (bccomp ($x,0 ) > 0 ) {
$temp = bcmod ($x,4294967296 );
$value = chr(floor($temp/0x1000000 )). chr($temp >> 16 ). chr($temp >> 8 ). chr($temp). $value;
$x = bcdiv ($x,4294967296 );
return ((float) $usec + (float) $sec);
Documentation generated on Thu, 16 Nov 2006 21:00:10 -0500 by phpDocumentor 1.3.0. PEAR Logo Copyright © PHP Group 2004.
|