PHP expert |
|
Dit script heeft maar 256 verschillende sleutels... niet echt tactisch.
Wellicht kan je iets verzinnen wat meer sleutels heeft.
EDIT:
Dit werkt met een 3-bytes sleutel.
<?php
function encryptIt($sString,$iKey) {
$iKey = $iKey % pow(256,3); // 3-bytes encryptie, bij 4 bytes is de kans op integer overflow erg groot.
if($iKey < pow(256,2)) {
trigger_error('encryptIt:: Gekozen key is niet groot genoeg!<br>Hierdoor kan de gecodeerde tekst overeenkomsten vertonen met de originele tekst.',E_USER_WARNING);
}
$sNextPart = substr($sString,0,3);
if(strlen($sNextPart) < 3) {
$sPaddingChar = chr($iKey);
$sNextPart = str_pad($sNextPart,3,$sPaddingChar,STR_PAD_RIGHT);
}
$iNextPartValue = ord(substr($sNextPart,0,1))*pow(256,2)+ // iNextPart is een getal in [0,(256^3-1)]
ord(substr($sNextPart,1,1))*pow(256,1)+
ord(substr($sNextPart,2,1));
$iCrypt = $iNextPartValue+$iKey; // iCrypt is een getal in [0,2*(256^3-1)]
$iCrypt = $iCrypt%pow(256,3); // iCrypt is een getal in [0, (256^3-1)]
$iACrypt = $iCrypt % 256; // Eerste karakter
$iBCrypt = ($iCrypt - $iACrypt) % 65536/256;
$iCCrypt = ($iCrypt - $iACrypt - $iBCrypt) % 16777216/65536;
$sCrypt = chr($iCCrypt).chr($iBCrypt).chr($iACrypt);
if(strlen($sString)>3) {
$sReturn = $sCrypt.encryptIt(substr($sString,3),$iKey);
} else {
$sReturn = $sCrypt;
}
return $sReturn;
}
function decryptIt($sCrypt,$iKey) {
$iKey = (int) $iKey % pow(256,3); // 3-bytes encryptie, bij 4 bytes is de kans op integer overflow erg groot.
$sNextPart = substr($sCrypt,0,3);
if(strlen($sNextPart) < 3) {
trigger_error('decryptIt:: Encrypted message might be damaged.',E_USER_ERROR);
}
$iNextPartValue = ord(substr($sNextPart,0,1))*pow(256,2)+
ord(substr($sNextPart,1,1))*pow(256,1)+
ord(substr($sNextPart,2,1));
$iTrue = ($iNextPartValue-$iKey+pow(256,3))%pow(256,3);
$iATrue = $iTrue % 256;
$iBTrue = ($iTrue - $iATrue) % 65536 / 256 ;
$iCTrue = ($iTrue - $iATrue - $iBTrue ) % 16777216 / 65536;
$sTrue = chr($iCTrue).chr($iBTrue).chr($iATrue);
if(strlen($sCrypt)>3) {
$sReturn = $sTrue.decryptIt(substr($sCrypt,3),$iKey);
} else {
$sReturn = $sTrue;
while(substr($sReturn,-1) == chr($iKey)) {
$sReturn = substr($sReturn,0,-1);
}
}
return $sReturn;
}
$sTestString = '!!!AAAAABABBA';
?>
<pre>
EcryptIt: Encrypting "<?php echo $sTestString ?>"
Met sleutel: 146*256^2+234*256+23 = 9628183
Versleuteld:<?php
$sCrypt = encryptIt($sTestString,9628183);
echo $sCrypt;
echo ' ('.ord(substr($sCrypt,0,1)).', '.ord(substr($sCrypt,1,1)).', '.ord(substr($sCrypt,2,1)).')';
?>
DecryptIt: Decrypting <?php echo $sCrypt?>
Met sleutel: 9628183
Originele boodschap:
<?php
echo decryptIt($sCrypt,9628183);
?>
Decryptit: Decrypting <?php echo $sCrypt?>
Met sleutel: 9628126 (Foute sleute);
Boodschap:<?php
echo decryptIt($sCrypt,9628126);
?>
<?php function encryptIt($sString,$iKey) { $iKey = $iKey % pow(256,3); // 3-bytes encryptie, bij 4 bytes is de kans op integer overflow erg groot. trigger_error('encryptIt:: Gekozen key is niet groot genoeg!<br>Hierdoor kan de gecodeerde tekst overeenkomsten vertonen met de originele tekst.',E_USER_WARNING); } $sNextPart = substr($sString,0,3); $sPaddingChar = chr($iKey); $sNextPart = str_pad($sNextPart,3,$sPaddingChar,STR_PAD_RIGHT ); } $iNextPartValue = ord(substr($sNextPart,0,1))*pow(256,2)+ // iNextPart is een getal in [0,(256^3-1)] $iCrypt = $iNextPartValue+$iKey; // iCrypt is een getal in [0,2*(256^3-1)] $iCrypt = $iCrypt%pow(256,3); // iCrypt is een getal in [0, (256^3-1)] $iACrypt = $iCrypt % 256; // Eerste karakter $iBCrypt = ($iCrypt - $iACrypt) % 65536/256; $iCCrypt = ($iCrypt - $iACrypt - $iBCrypt) % 16777216/65536; $sCrypt = chr($iCCrypt).chr($iBCrypt).chr($iACrypt); $sReturn = $sCrypt.encryptIt (substr($sString,3),$iKey); } else { $sReturn = $sCrypt; } return $sReturn; } function decryptIt($sCrypt,$iKey) { $iKey = (int ) $iKey % pow(256,3); // 3-bytes encryptie, bij 4 bytes is de kans op integer overflow erg groot. $sNextPart = substr($sCrypt,0,3); trigger_error('decryptIt:: Encrypted message might be damaged.',E_USER_ERROR); } $iTrue = ($iNextPartValue-$iKey+pow(256,3))%pow(256,3); $iATrue = $iTrue % 256; $iBTrue = ($iTrue - $iATrue) % 65536 / 256 ; $iCTrue = ($iTrue - $iATrue - $iBTrue ) % 16777216 / 65536; $sTrue = chr($iCTrue).chr($iBTrue).chr($iATrue); $sReturn = $sTrue.decryptIt (substr($sCrypt,3),$iKey); } else { $sReturn = $sTrue; $sReturn = substr($sReturn,0,-1); } } return $sReturn; } $sTestString = '!!!AAAAABABBA'; ?> <pre> EcryptIt: Encrypting " <?php echo $sTestString ?>" Met sleutel: 146*256^2+234*256+23 = 9628183 Versleuteld:<?php $sCrypt = encryptIt($sTestString,9628183); ?> DecryptIt: Decrypting <?php echo $sCrypt? > Met sleutel: 9628183 Originele boodschap: <?php echo decryptIt ($sCrypt,9628183); ?> Decryptit: Decrypting <?php echo $sCrypt? > Met sleutel: 9628126 (Foute sleute); Boodschap:<?php echo decryptIt ($sCrypt,9628126); ?>
|