Aus zwei Binär-Werten einen machen

Alles, was PHP betrifft, kann hier besprochen werden.

Aus zwei Binär-Werten einen machen

Postby Knight1 » 26. October 2007 12:12

Hallo AF-Com,
mein Problem ist folgendes.

Ich habe zwei Binär-Werte erstellt. Nun möchte ich aus diesen beiden Werten einen erzeugen.
Im Manual finde ich nichts in der Richtung.


Kann mir vielleicht jemand einen Tipp geben?



Kai aka Knight1
Image
User avatar
Knight1
 
Posts: 310
Joined: 18. October 2003 10:03
Location: Trier
Operating System: Windows 7 Ultimate x64

Postby glitzi85 » 26. October 2007 21:52

Hallo,

wie erstellt man in PHP einen Binärwert?

Ansonsten gilt: http://de.wikipedia.org/wiki/Dualsystem#Grundrechenarten_im_Dualsystem

mfg glitzi
User avatar
glitzi85
 
Posts: 1920
Joined: 05. March 2004 23:26
Location: Dahoim

Postby Knight1 » 28. October 2007 15:13

glitzi85 wrote:Hallo,

wie erstellt man in PHP einen Binärwert?

Ansonsten gilt: http://de.wikipedia.org/wiki/Dualsystem#Grundrechenarten_im_Dualsystem

mfg glitzi


Also erstmal generell. Ich möchte in meinen PHP-Scripten zukünftig eine eigene Passwort-Verschlüsselung nutzen und nicht nur die Funktionen md5() und sha1().

Daher bin ich etwas am herumexperimentieren was eine "sichere" Verschlüsselung angeht.

Momentan habe ich folgenden Code (Nicht weiter erzählen :wink: ):

Code: Select all
$password = "Test";
$chars   =   array   (
                  'clear'         =>   array   (
                                          'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
                                          '0','1','2','3','4','5','6','7','8','9'
                                       ),
                  'transformed'   =>   array   (
                                          decbin(97),decbin(98),decbin(99),decbin(100),decbin(101),decbin(102),decbin(103),decbin(104),decbin(105),decbin(106),decbin(107),decbin(108),decbin(109),decbin(110),decbin(111),decbin(112),decbin(113),decbin(114),decbin(115),decbin(116),decbin(117),decbin(118),decbin(119),decbin(120),decbin(121),decbin(122),
                                          decbin(0),decbin(1),decbin(2),decbin(3),decbin(4),decbin(5),decbin(6),decbin(7),decbin(8),decbin(9)
                                       )
               );
$encrypted_passwords   =   array   (
                              'md5'   =>   str_split(md5($password)),
                              'sha1'   =>   str_split(sha1($password))
                           );
$transformed_passwords   =   array   (
                              'md5'   =>   str_replace($chars['clear'],$chars['transformed'],$encrypted_passwords['md5']),
                              'sha1'   =>   str_replace($chars['clear'],$chars['transformed'],$encrypted_passwords['sha1'])
                           );
/*Hier beginnt eine Kontrollausgabe*/
echo "Klartext-Passwort: <b>".$password."</b><br>";
echo "MD5-Hash des Passworts: <b>".implode($encrypted_passwords['md5'])."</b><br>";
echo "SHA1-Hash des Passworts: <b>".implode($encrypted_passwords['sha1'])."</b><br>";
echo "Binär-Wert des MD5-Hashs: <b>".implode($transformed_passwords['md5'])."</b><br>";
echo "Binär-Wert des SHA1-Hashs: <b>".implode($transformed_passwords['sha1'])."</b>";


Nun zu Deiner Bemerkung was das Rechnen im Dualen Zahlensystem angeht. Ich weiß schon wie ich zwei oder mehrere Binärwerte (logisch) addiere.

Nur habe ich momentan keine Idee wie ich das in PHP lösen kann.


Kai aka Knight1
Image
User avatar
Knight1
 
Posts: 310
Joined: 18. October 2003 10:03
Location: Trier
Operating System: Windows 7 Ultimate x64

Postby Wiedmann » 28. October 2007 15:36

Ich habe zwei Binär-Werte erstellt.

Das ist nur die binäre Darstellung eines Integerwertes als String. PHP kennt keinen binären Datentyp/wert.

Nun zu Deiner Bemerkung was das Rechnen im Dualen Zahlensystem angeht. Ich weiß schon wie ich zwei oder mehrere Binärwerte (logisch) addiere.

Indem man aus den 2 Strings, die jeweils eine binäre Darstellung eines Integerwertes enthalten, wieder Integerwerte macht und mit diesen rechnet.
Den resultierenden Integerwert kann man dann wieder in einen String mit der binäre Darstellung dieses Integerwertes wandeln.
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby Scory » 06. November 2007 16:38

Wiedmann wrote:
Ich habe zwei Binär-Werte erstellt.

Das ist nur die binäre Darstellung eines Integerwertes als String. PHP kennt keinen binären Datentyp/wert.


Das stimmt nicht ganz - jeder Integer ist ein Binärwert (mit allerdings nur 32 bit unsigned).

Allerdings verstehe ich die Frage immer noch nicht richtig - was soll heißen "aus zwei Werten einen Wert machen"?

Grüße
Scory
Scory
 

Postby Wiedmann » 06. November 2007 16:45

Das stimmt nicht ganz - jeder Integer ist ein Binärwert (mit allerdings nur 32 bit unsigned).

Das hat ja keiner bestritten... ;-) (Eben deswegen hab ich ja geschrieben, dass man die Integerwerte einer binären Darstellung addieren muss.

Aber einen Datentyp "binär" kennt PHP trotzdem nicht. Also z.B.:
| $bin = 0001 + 0010;
| echo $bin; // 0011

oder
| $bin = (bin) 3;
| echo $bin; // 0011
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby Knight1 » 06. November 2007 17:42

Dass PHP keinen Datentyp "Binär" kennt ist hier mein Problem.

@Scroy: Mit der Fragestellung meinte ich den Komplemetär-Wert, so wie Wiedmann es beschrieben hat.

Habe es nun, fürs erste folgendermaßen gelöst:

Code: Select all
<?
$password = "Test";
$chars               =   array   (
                              'clear'         =>   array   (
                                                      'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
                                                      '0','1','2','3','4','5','6','7','8','9'
                                                   ),
                              'transformed'   =>   array   (
                                                      decbin(97),decbin(98),decbin(99),decbin(100),decbin(101),decbin(102),decbin(103),decbin(104),decbin(105),decbin(106),decbin(107),decbin(108),decbin(109),decbin(110),decbin(111),decbin(112),decbin(113),decbin(114),decbin(115),decbin(116),decbin(117),decbin(118),decbin(119),decbin(120),decbin(121),decbin(122),
                                                      decbin(0),decbin(1),decbin(2),decbin(3),decbin(4),decbin(5),decbin(6),decbin(7),decbin(8),decbin(9)
                                                   )
                           );
$encrypted_passwords   =   array   (
                              'md5'   =>   str_split(md5($password)),
                              'sha1'   =>   str_split(sha1($password))
                           );
$transformed_passwords   =   array   (
                              'md5'   =>   str_replace($chars['clear'],$chars['transformed'],$encrypted_passwords['md5']),
                              'sha1'   =>   str_replace($chars['clear'],$chars['transformed'],$encrypted_passwords['sha1'])
                           );
$added               =   array   (
                              'md5'   =>   '0',
                              'sha1'   =>   '0'
                           );
for ($x=0;$x<count($transformed_passwords['md5']);$x++)
{
$added['md5'] = bcadd($added['md5'],bindec($transformed_passwords['md5'][$x]),0);
}
for ($x=0;$x<count($transformed_passwords['sha1']);$x++)
{
$added['sha1'] = bcadd($added['sha1'],bindec($transformed_passwords['sha1'][$x]),0);
}
$new_pw = str_replace($chars['transformed'],$chars['clear'],decbin(bcadd($added['md5'],$added['sha1'],0)));
?>


Das ganze wird gerade auf Sicherheit geprüft. Ich habe allerdings den Verdacht dass es nicht ganz so sicher sein dürfte.


Kai aka Knight1
Image
User avatar
Knight1
 
Posts: 310
Joined: 18. October 2003 10:03
Location: Trier
Operating System: Windows 7 Ultimate x64

Postby Scory » 06. November 2007 18:05

Wiedmann wrote:Aber einen Datentyp "binär" kennt PHP trotzdem nicht. Also z.B.:
| $bin = 0001 + 0010;
| echo $bin; // 0011

oder
| $bin = (bin) 3;
| echo $bin; // 0011


unglückliches Beispiel - das erste Script würde 9 als Ausgabe haben.

Vielleicht hilft ja dieses Beispielscript weiter:

Code: Select all
<?php
   $bin = bindec('0001') + bindec('0010');
   echo decbin($bin);
?>


Grüße
Scory
Scory
 

Postby Wiedmann » 06. November 2007 18:20

unglückliches Beispiel - das erste Script würde 9 als Ausgabe haben.

Eben weil PHP keinen binären Datentyp kennt (sind so nur 2 Oktalwerte). Und das war meine Aussage oben:
Wiedmann wrote:PHP kennt keinen binären Datentyp/wert.

bei
| $bin = '0001' + '0010';
wäre es dann halt 11. (ist immer noch kein binären Datentyp/wert. Jetzt halt 2 Strings, die jeweils einen Intergerwert enthalten (PHP's autokonvert machts möglich...).

Vielleicht hilft ja dieses Beispielscript weiter:

Was dann die Umetzung als Script dieser Aussage ist:
Wiedmann wrote:Indem man aus den 2 Strings, die jeweils eine binäre Darstellung eines Integerwertes enthalten, wieder Integerwerte macht und mit diesen rechnet.
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby Scory » 07. November 2007 11:44

Wiedmann wrote:
unglückliches Beispiel - das erste Script würde 9 als Ausgabe haben.

Eben weil PHP keinen binären Datentyp kennt (sind so nur 2 Oktalwerte)....


Ich stolpere ja auch nur immer über dieses "binärer Datentyp". Integer ist binär.

Was es eben nicht gibt, würde ich vielleich besser "duale Skalardarstellung" nennen. Wie beispielsweise 0061 ein oktale Darstellung eines Skalars (eine Konstante) ist, oder 0x2f eine hexadezimale Darstellung, so fehlt eine duale Darstellung a la x00100101 oder wie auch immer.

Das Wort "binär" ist einfach zu überladen, daher mein Problem.

Das andere Problem ist, dass es Knight1 immer noch nicht geschafft hat, EXAKT zu formulieren, was er tun will. Ein Zitat von Dir (Wiedmann) über irgendeinen Komplimentärwert finde ich hier nicht.

Falls die "Dual-Strings" maximal 32 Stellen lang sind, kann man wie im Beispiel mit decbin() und bindec() in Integers umwandeln und dann stehen alle Bitoperatoren zur Verfügung. Ist das nicht der Fall, würde ich persönlich eine Klasse schreiben, die die Bitoperatoren als Methoden auf Dual-Strings nachbildet. Ist nicht sooo schwer. Aber das Beispiel von Knight1 ist mir zur kryptisch, vielleicht sollte er mal ein einfacheres zeigen.

Grüße
Scory
Scory
 


Return to PHP

Who is online

Users browsing this forum: No registered users and 6 guests