Ich will den Blowfish Verschlüsselungsalgorithmus von PHP umschreiben in VB, so als kleines privates Projekt.
Hab den Source hier gefunden im Netz.
<?php
$key = $_POST['key'];
?>
<form action="" method="post" target="">
Key: <br>
<input type="Text" name="key" value="<?php echo $key; ?>" size="" maxlength="12"><br><br>
Text: <br>
<textarea name="text" cols="50" rows="6"></textarea><br>
<input type="Submit" name="crypt" value="Verschlüsseln">
<input type="Submit" name="decrypt" value="Entschlüsseln">
</form>
<?php
include("blowfish.box.php" //P-Box and S-Box
$text = trim($_POST['text']);
if(isset($_POST['key'])) keys($_POST['key']);
//Verschlüsselungsmodus / Encryptionmode:
//EBC: 0
//CBC: 1
define("CBC",1);
//Einen Text in Longzahlen umwandeln
//Covert a string into longinteger
function _str2long($data)
{
$n = strlen($data);
$tmp = unpack('N*', $data);
$data_long = array();
$j = 0;
foreach ($tmp as $value) $data_long[$j++] = $value;
return $data_long;
}
//Longzahlen in Text umwandeln
//Convert a longinteger into a string
function _long2str($l)
{
return pack('N', $l);
}
//Key-Algorithmen
function keys($key)
{
global $pbox,$sbox0,$sbox1,$sbox2,$sbox3;
$key_md5 = md5($key);
//Füllt den $key auf 16 Stellen auf
//Convert the $key into a 16Byte key
$key = _str2long(substr(str_pad($key, 16, $key_md5),0,16));
# XOR Pbox1 with the first 32 bits of the key, XOR P2 with the second 32-bits of the key,
for($i=0;$i<count($pbox);$i++)
{
$pbox[$i] ^= $key[$i%4];
}
$v[0] = 0x00000000;
$v[1] = 0x00000000;
//P-Box durch verschlüsselte Nullbit Blöcke ersetzen. In der nächsten Runde das Resultat erneut verschlüsseln
//Encrypt Nullbit Blocks and replace the Pbox with the Chiffre. Next round, encrypt the result
for($i=0;$i<count($pbox);$i+=2)
{
$v = block_encrypt(array($v[0],$v[1]));
$pbox[$i] = $v[0];
$pbox[$i+1] = $v[1];
}
//S-Box [0 bis 3] durch verschlüsselte Blöcke ersetzen
//Replace S-Box [0 to 3] entries with encrypted blocks
for($i=0;$i<count($sbox0);$i+=2)
{
$v = block_encrypt(array($v[0],$v[1]));
$sbox0[$i] = $v[0];
$sbox0[$i+1] = $v[1];
}
//S-Box1
for($i=0;$i<count($sbox1);$i+=2)
{
$v = block_encrypt(array($v[0],$v[1]));
$sbox1[$i] = $v[0];
$sbox1[$i+1] = $v[1];
}
//S-Box2
for($i=0;$i<count($sbox2);$i+=2)
{
$v = block_encrypt(array($v[0],$v[1]));
$sbox2[$i] = $v[0];
$sbox2[$i+1] = $v[1];
}
//S-Box3
for($i=0;$i<count($sbox3);$i+=2)
{
$v = block_encrypt(array($v[0],$v[1]));
$sbox3[$i] = $v[0];
$sbox3[$i+1] = $v[1];
}
return $key;
}
//Verschlüsselung ($text = text/string)
//Encrytion
function blowfish_crypt($text)
{
$n = strlen($text);
if($n%8 != 0) $lng = ($n+(8-($n%8)));
else $lng = 0;
$text = str_pad($text, $lng, ' ';
$text = _str2long($text);
//Initialization vector: IV
if(CBC == 1)
{
$cipher[0][0] = time();
$cipher[0][1] = (double)microtime()*1000000;
}
$a = 1;
for($i = 0; $i<count($text); $i+=2)
{
if(CBC == 1)
{
//$text mit letztem Geheimtext XOR Verknüpfen
//$text is XORed with the previous ciphertext
$text[$i] ^= $cipher[$a-1][0];
$text[$i+1] ^= $cipher[$a-1][1];
}
$cipher[] = block_encrypt(array($text[$i],$text[$i+1]));
$a++;
}
$output = "";
for($i = 0; $i<count($cipher); $i++)
{
$output .= _long2str($cipher[$i][0]);
$output .= _long2str($cipher[$i][1]);
}
return base64_encode($output);
}
//Entschlüsseln
//Decryption
function blowfish_decrypt($text)
{
$plain = array();
$cipher = _str2long(base64_decode($text));
if(CBC == 1) $i = 2; //Message start at second block
else $i = 0; //Message start at first block
for($i; $i<count($cipher); $i+=2)
{
$return = block_decrypt(array($cipher[$i],$cipher[$i+1]));
if(CBC == 1)
{
//Xor Verknüpfung von $return und Geheimtext aus von den letzten beiden Blöcken
//XORed $return with the previous ciphertext
$plain[] = array($return[0]^$cipher[$i-2],$return[1]^$cipher[$i-1]);
}
else //EBC Mode
{
$plain[] = $return;
}
}
for($i = 0; $i<count($plain); $i++)
{
$output .= _long2str($plain[$i][0]);
$output .= _long2str($plain[$i][1]);
}
return $output;
}
if(isset($_POST["crypt"]))
{
$output = blowfish_crypt($text);
echo "<br><b>Verschlüsselt</b> sieht der Text so aus:<br>
<textarea name=\"ausgabe\" cols=\"45\" rows=\"9\">".
$output."</textarea>";
}
else if(isset($_POST["decrypt"]))
{
$output = blowfish_decrypt($text);
echo "<b>Entschlüsselt</b> sieht der Text so aus:<br>".
nl2br(htmlentities(stripslashes($output)));
}
function block_encrypt($text)
{
global $pbox;
$vl = $text[0];
$vr = $text[1];
for($i=0;$i<16;$i++)
{
$vl ^= $pbox[$i];
$vr ^= sbox_round($vl);
$v_tmp = $vl;
$vl = $vr;
$vr = $v_tmp;
}
$v_tmp = $vl;
$vl = $vr;
$vr = $v_tmp;
$vr ^= $pbox[16];
$vl ^= $pbox[17];
return array($vl,$vr);
}
function block_decrypt($text)
{
global $pbox;
$vl = $text[0];
$vr = $text[1];
for($i=17;$i>1;$i--)
{
$vl ^= $pbox[$i];
$vr ^= sbox_round($vl);
$v_tmp = $vl;
$vl = $vr;
$vr = $v_tmp;
}
$v_tmp = $vl;
$vl = $vr;
$vr = $v_tmp;
$vr ^= $pbox[1];
$vl ^= $pbox[0];
return array($vl,$vr);
}
function sbox_round($integer)
{
global $sbox0,$sbox1,$sbox2,$sbox3;
//$integer in vier 8 Bit Blöcke unterteilen
//Split $integer into four 8 Bit blocks
$b0 = $integer<<24 & 0xFF;
$b1 = $integer<<16 & 0xFF;
$b2 = $integer<<8 & 0xFF;
$b3 = $integer & 0xFF;
$return = ($sbox0[$b0] + $sbox1[$b1] % pow(2,32)) ;
$return = ($return ^ $sbox2[$b2]) + $sbox3[$b3] % pow(2,32);
return $return;
}
?>
Original von user-124
mau? sowas?
Dim bla As Long
Dim bla2 As String
bla2 = "324234"
bla = Val(bla2)
MsgBox bla
bla2 = bla & "Dies ist ein String"
MsgBox bla2
Funzt ja so, aber bist du sicher, das es auch dann im zusammenhang so funktioniert wie gewünscht?
Wenn du dir nicht sicher bist, probiere ich es nachher einfach mal.