Scripts
SuperCrypt
Encrypt een string op een manier die zonder goede kennis van het algoritme vrijwel onmogelijk te kraken is. (En geloof me ik kan et weten) Je kan ook de string weer decrypten. De geencrypte string is vrijwel nooit hetzelfde als de vorige keer dat je dezelfde string encrypte maar is tog goed te decrypten. Om de string te encrypten gebruik je simpelweg de super_encrypt() functie, en om te decrypten de super_decrypt() functie. Simpeler kan haast niet. Er komt hopelijk binnenkort een v2.0 die een key genereerd die naast de geencrypte string nodig is om de string fatsoenlijk te decrypten. Geedit om de code alsnog te plaatsen.
supercrypt
[code]<?php
function super_encrypt( $input )
{
$input = str_rot13( $input ); // Verschuif alle letters 13 plaatsen naar rechts.
$input_bits = '';
for( $i = 0; $i < strlen( $input ); $i++ )
{
$input_bits[] = zero_pad( base_convert( ord( $input{$i} ), 10, 2 ) , 8 );
}
$input_bits = implode( '', $input_bits );
$bit_total_length = strlen( $input_bits );
// Genereer de data voor de Bit Shift Group.
$shift_bits = rand( 0, floor( $bit_total_length / 2 ) ) + 1;
$shift_direction = rand( 0, 1 );
// Compile de Bit Shift Group data tot binaire data.
$string_to_compile = 's:' . $shift_bits . '|d:' . $shift_direction;
$bit_shift_group = '';
for( $i = 0; $i < strlen( $string_to_compile ); $i++ )
{
$bit_shift_group .= zero_pad( ord( $string_to_compile{ $i } ), 3 );
}
$bit_shift_group = new_base_convert( $bit_shift_group, 10, 2 );
// Sla de lengte van de Bit Shift Group op.
$bit_shift_group_l = strlen( $bit_shift_group );
// Voer een ingewikkelde berekening uit om de grootte van elke bitlocator te bepalen en om de hoeveel bits het moet komen.
$bsg_group_size = 2;
$bsg_bits_between = 8;
$bsg_pos_found = false;
do
{
$total_num_of_blocks = ceil( $bit_shift_group_l / $bsg_group_size ); // Aantal nodige blocks met deze specs.
$max_num_of_blocks = floor( $bit_total_length / ( $bsg_group_size + $bsg_bits_between ) ) - 1;
if( $max_num_of_blocks > ( $total_num_of_blocks * 2 ) )
{
if( $bsg_group_size > 1 )
{
$bsg_group_size--;
}
else
{
$bsg_bits_between++;
$max_num_of_blocks = floor( $bit_total_length / ( $bsg_group_size + $bsg_bits_between ) ) - 1;
if( $max_num_of_blocks > $total_num_of_blocks )
{
$bsg_pos_found = true;
}
else
{
$bsg_bits_between--;
$bsg_pos_found = true;
}
}
}
elseif( $max_num_of_blocks >= $total_num_of_blocks )
{
$bsg_bits_between--;
$max_num_of_blocks = floor( $bit_total_length / ( $bsg_group_size + $bsg_bits_between ) ) - 1;
if( $max_num_of_blocks > $total_num_of_blocks )
{
$bsg_pos_found = true;
}
else
{
$bsg_bits_between++;
$bsg_pos_found = true;
}
}
elseif( $max_num_of_blocks < $total_num_of_blocks )
{
$bsg_group_size++;
}
else
{
$bsg_bits_between--;
}
}
while( $bsg_pos_found != true );
// We hebben nu voldoende data om de header te gaan opbouwen.
$header_first_group = rand( 0, 1 ); // Dit bevat welke bitgroep eerst komt.
$header_bits_between = zero_pad( base_convert( $bsg_bits_between, 10, 2 ), 8 );
$header_block_size = zero_pad( base_convert( $bsg_group_size, 10, 2 ), 7 );
$header = '1' . $header_first_group;
if( $header_first_group === 1 )
{
$header .= $header_bits_between . $header_block_size;
}
else
{
$header .= $header_block_size . $header_bits_between;
}
// Shift de bits in de goede richting.
if( $shift_direction === 1 )
{
$input_bits = shift_right( $input_bits, $shift_bits );
}
else
{
$input_bits = shift_left( $input_bits, $shift_bits );
}
$input_bit_blocks = explode( '||', wordwrap( $input_bits, $bsg_bits_between, '||', 1 ) );
$tot_num_bsg_blocks = count( $input_bit_blocks ) - 1;
$bit_shift_group = zero_pad( $bit_shift_group, ( $tot_num_bsg_blocks * ( $bsg_group_size ) ) );
$input_bsg_blocks = explode( '||', wordwrap( $bit_shift_group, $bsg_group_size, '||', 1 ) );
$output_string = '';
for( $i = 0; $i < count( $input_bit_blocks ); $i++ )
{
$output_string .= $input_bit_blocks[ $i ] . $input_bsg_blocks[ $i ];
}
$output_string = new_base_convert( $header . $output_string, 2, 36 );
return $output_string;
}
function super_decrypt( $input )
{
// Converteer de string naar bits.
$input_bits = new_base_convert( $input, 36, 2 );
// Decode de header.
$header_block_first = substr( $input_bits, 1, 1 );
if( $header_block_first === '0' )
{
$header_block_size = intval( base_convert( substr( $input_bits, 2, 7 ), 2, 10 ) );
$header_bits_between = intval( base_convert( substr( $input_bits, 9, 8 ), 2, 10 ) );
}
else
{
$header_bits_between = intval( base_convert( substr( $input_bits, 2, 8 ), 2, 10 ) );
$header_block_size = intval( base_convert( substr( $input_bits, 10, 7 ), 2, 10 ) );
}
$input_bits = substr( $input_bits, 17, strlen( $input_bits ) - 17 );
$input_bit_blocks = explode( '||', wordwrap( $input_bits, intval( $header_bits_between + $header_block_size ), '||', 1 ) );
$bsg_string = '';
$output_bits = '';
for( $i = 0; $i < count( $input_bit_blocks ); $i++ )
{
//echo substr( $input_bit_blocks[ $i ], 0, $header_bits_between ) . '<br />';
$bsg_string .= substr( $input_bit_blocks[ $i ], $header_bits_between, $header_block_size );
$output_bits .= substr( $input_bit_blocks[ $i ], 0, $header_bits_between );
}
$bsg_string = new_base_convert( $bsg_string, 2, 10 );
$bsg_string_ltrs = explode( '||', wordwrap( $bsg_string, 3, '||', 1 ) );
$bsg_string = '';
for( $i = 0; $i < count( $bsg_string_ltrs ); $i++ )
{
$bsg_string .= chr( intval( $bsg_string_ltrs[ $i ] ) );
}
$bsg_str_parts = explode( '|', $bsg_string );
for( $i = 0; $i < count( $bsg_str_parts ); $i++ )
{
$parts = explode( ':', $bsg_str_parts[$i] );
switch( $parts[0] )
{
case 's':
$shift_bits = intval( $parts[1] );
break;
case 'd':
if( intval( $parts[1] ) === 1 )
{
$output_bits = shift_left( $output_bits, $shift_bits );
}
else
{
$output_bits = shift_right( $output_bits, $shift_bits );
}
break;
}
}
$output_bits_parts = explode( '||', wordwrap( $output_bits, 8, '||', 1 ) );
$output_bits = '';
for( $i = 0; $i < count( $output_bits_parts ); $i++ )
{
$output_bits .= chr( new_base_convert( $output_bits_parts[ $i ], 2, 10 ) );
}
return str_rot13( $output_bits );
}
function new_base_convert( $numstring, $frombase, $tobase )
{
$chars = "0123456789abcdefghijklmnopqrstuvwxyz";
$tostring = substr($chars, 0, $tobase);
$length = strlen( $numstring );
$result = '';
for ( $i = 0; $i < $length; $i++ )
{
$number[ $i ] = strpos( $chars, $numstring{$i} );
}
do
{
$divide = 0;
$newlen = 0;
for ( $i = 0; $i < $length; $i++ )
{
$divide = $divide * $frombase + $number[$i];
if ( $divide >= $tobase )
{
$number[ $newlen++ ] = (int)( $divide / $tobase );
$divide = $divide % $tobase;
}
elseif ( $newlen > 0 )
{
$number[ $newlen++ ] = 0;
}
}
$length = $newlen;
$result = $tostring{ $divide } . $result;
}
while ( $newlen != 0 );
return $result;
}
function shift_right( $str, $times = 1 )
{
if( $times < 1 ) return $str;
for( $i = 0; $i < $times; $i++ )
{
$right_bit = substr( $str, strlen( $str ) -1, 1 );
$str = substr( $str, 0, strlen( $str ) -1 );
$str = $right_bit . $str;
}
return $str;
}
function shift_left( $str, $times = 1 )
{
if( $times < 1 ) return $str;
for( $i = 0; $i < $times; $i++ )
{
$left_bit = substr( $str, 0, 1 );
$str = substr( $str, 1, strlen( $str ) -1 );
$str = $str . $left_bit;
}
return $str;
}
function zero_pad( $num, $limit )
{
return ( strlen( $num ) >= $limit ) ? $num : zero_pad( '0' . $num, $limit );
}
//Klein voorbeeldje hoe het gebruikt moet worden.
$string = 'abcdefghijklmnopqrstuvwxyz';
$encrypt = super_encrypt( $string );
$decrypt = super_decrypt( $encrypt );
echo 'Geencrypt: ' . $encrypt . '<br />';
echo 'Gedecrypt: ' . $decrypt;
?>[/code]
De credits voor de new_base_convert functie gaan naar PHP.net. (kijk bij de comments van base_convert, de oorspronkelijke functie heette "unfucked_base_convert").
Reacties
0