Rechtsklick in Flash oder “a real custom context menu”

März 7th, 2010

RightClickHeader

Welcher Flashentwickler hatte noch nicht den Wunsch auch mal das Kontextmenü völlig verschwinden zu lassen oder es wenigstens durch eine besser zur Applikation passendes Design aufzuwerten.

FlashPlayerRechtsklickDialog

Reine ActionScript basierende Lösungen gibt es keine, jedoch lässt sich der graue Klotz auch anders beseitigen. Das Stichwort heißt Javascript. Über die dort enthaltenen “Event handling” Mechanismen lässt sich in so machen Bereichen Funktionalität nachrüsten bei der Adobe gepatzt hat. So auch hier, es ist nämlich möglich das Rechtsklick Event der Maus für ein HTML Element wie z.B. einen <div> abzufangen.

Die Vorgehensweise ist nun folgende:

  1. Es wird Javascript (RightClick.js) eingebunden um in der HTML Seite das Rechtsklick Ereignis abzufangen.
  2. Das abgefangene Ereignis wird über External Interface an Flash weitergereicht.
  3. Flash führt als Reaktion auf das Ereignis die gewünschten Aktionen aus.

Als basis für das Javascript wurde folgendes Google Code Projekt benutzt:
http://code.google.com/p/custom-context-menu/

Leider ist es so dass in der ursprünglichen RightClick.js nur das “onMouseUp” Ereignis unterstützt wurde, d.h. es war in Flash keine Unterscheidung möglich ob nun die rechte Maustaste gedrückt ist oder nicht. Daher habe ich die RightClick.js kurzerhand so erweitert dass sie nun zwei Ereignisse in Flash auslöst, nämlich “rightMouseDown” und “rightMouseUp”.

März 2nd, 2010

Kaffee Chaosradio Podcast
Ein netter Podcast für alle die sich für die Geschichte und die Zubereitung von Kaffee interessieren und endlich mal wissen wollen was z.B. der Unterschied zwischen “Arabica” und “Robusta” ist, wie Kaffee richtig zubereitet wird oder was jetzt den Cappuccino zum Cappuccino macht.

Im “Chaosradio Express” des CCC (ChaosComputerClub) Informiert sich Tim Pritlove bei Yumi Choi in angenehmer Wohnzimmermanier über alles Wissenswerte rund um Kaffee.

Webcam Performance in Flash

Februar 22nd, 2010

Da ich mich im Rahmen meiner Diplomarbeit sehr viel mit Webcams beschäftige ist mir aufgefallen dass es mehrere wichtige Faktoren gibt von welchen die Performanceleistung (Bilder pro Sekunde) abhängt.

Grundsätzlich kann man sich von einer handelsüblichen Webcam um ca. 30€ auch bei idealen Lichtbedingungen kaum mehr als 20 Bilder pro Sekunde erwarten. Trotzdem gibt es Umstände welche dazu führen dass man auch bei sehr guten Bedingungen nicht mehr als 6 fps erhält.

WebcamFlashplayer

Folgende vier Kiriterien sind nach meiner Erfahrung kritisch für die Leistung einer Webcam:

  1. Die Qualität der Webcam (Linse, Auflösung, Sensor, Software)
  2. Vorbearbeitung der Webcam Software (z.B.: Restlichtverstärkung)
  3. Die Beleuchtungsverhältnisse (Tageslicht, Kunstlicht, Unterbelichtung, Überbelichtung)
  4. Auf welche Art wird ein Bild von der Webcam angefordert (Timer oder EnterFrame)

Wenig überraschend ist die Performance der Webcam abhängigt von der Bauweise und der Beleuchtungsumgebung. Zusätzlich kommt noch hinzu dass unterschiedlichste Einstellungen bei Webcams die Ergebnisse stark beeinflussen. Viele Webcams bearbeiten das Bild breits mehrmals bevor es an andere Programme weitergereicht wird. Einige dieser Bearbeitungsschritte, welche großen Einfluss auf das Bild haben können, sind zum Beispiel die Restlichtverstärkung oder der Weißabgleich.

Für Flasher interessant ist der Punkt 4. Die Performance der Webcam hängt nämlich auch zu einem Gutteil davon ab wie und wie oft ein Bild von der Webcam abgefragt wird. Viele Flashfilme werden mit 31 oder 60 fps ausgeführt und oft wird auch mit dieser Framerate die Webcam nach neuen Bildern gefragt bzw. das Bild der Webcam in ein Bitmap Objekt gespeichert.

Da aber Webcams kaum mehr als 20-25 Bilder pro Sekunde schaffen ist ein solch hoher Anfragerythmus nicht notwendig und führt dazu dass die Webcam bzw. der Flashplayer sich “verschluckt” und dann weniger Bilder liefert als eigentlich möglich wären (z.B. statt 22 fps nur 12 fps). Besonders bei der Nutzung von Pixel Bender Filtern (Version 1.5.1) ist dieser Effekt auffällig.

Die Lösung ist relativ einfach, es genügt die Abfragen an die Webcam von der globalen Framerate des FlashPlayers mittels eines Timers zu lösen. Allgemein bewirkt dieser “Trick” auch dass die gesamte Performance des Flash Players etwas nach oben geht (5-10% mehr fps).

Warum sich Webcams im Flashplayer so verhalten ist (mir) noch nicht klar, der Effekt ist jedoch deutlich sichtbar.

Open Muffin – Collaborative 3D Animation Shorts

Februar 18th, 2010

Jeder der Freude an OpenSource und “Collaborative 3D Animation” hat sollte sich diese Möglichkeit bei einem entstehenden Projekt mitzuarbeiten nicht entgehen lassen!

Hi!

Ich möchte euch kurz unser Projekt vorstellen: Muffin Animation Shorts

Dabei geht es um das gemeinschaftliche Erstellen eines 3D Animation Shorts. Die grundlegende Idee ist, dass jeder der Lust hat einen kleinen Teil der Produktion übernehmen kann und somit einen Teil zum ganzen beiträgt. Am Ende soll sich die Zusammenarbeit bezahlt machen und eine klasse Animation dabei entstehen.

Die Gemeinschaft wird dabei von Beginn an bestimmen, in welche Richtung es geht. Die erste Aufgabe ist es eine passende Story für die Animation zu entwickeln (vorläufige deadline: 27. jänner), also startet schonmal eure Schreibmaschinen :)

Es würde mich sehr freuen Beiträge und Feedback von euch zu erhalten. Ihr findet die Homepage und das Forum hier:
http://openmuffin.net
http://forum.openmuffin.net

Danke für eure Aufmerksamkeit!

P.S.: Erzählt auch euren Freunden vom Muffin und bleibt informiert per Twitter, RSS und der Facebook gruppe.

.htaccess und .htpasswd Generator mit Flex3

Dezember 6th, 2009

Da es lästig ist immer wieder .htaccess und .htpasswd Dateien zu erstellen hab ich heute einen htaccess Generator in Flex3 erstellt. Eigentlich keine schwere Aufgabe hatte ich gedacht, bis ich festellen musste dass die nötige crypt(3) Funktionalität in der adobe corelib nicht enthalten ist und sich die as3crypto Bibliothek in meiner Entwicklungsumgebung (FlashDevelop 3.0.5) nicht kompilieren lässt.

Nach einigem Probieren klappte dann zwar das Kompilieren der as3crypto, jedoch war das Ergebnis der Code-Erstellung nicht so wie erhofft.  Hier übrigends der Fehler der beim Kompilieren der as3crypto aufgetreten ist:

Warning: flex2.compiler.as3.SignatureExtension.SignatureGenerationFailed[node='ForStatement', level='warning', cause='flex2.compiler.as3.SignatureAssertionRuntimeException: Unreachable Codepath

Die Lösung für das Problem war schließlich die Nachimplementierung eines crypt(3) Javascripts in AS3.

Der Generator benötigt drei Eingabe-Daten:

  • den Benutzernamen
  • das gewünschte Passwort
  • den Pfad zu dem Ordner in dem später die .htpasswd abgelegt wird

Und so sieht sieht das fertige "Produkt" aus

htaccess generator mit flex3

Live Demo

Der Code der mxml Datei:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" backgroundColor="#ffffff">

    <mx:Script>
        <![CDATA[
            import flash.events.MouseEvent;
			import at.geoathome.crypt.Crypt3
			import mx.controls.TextArea;
			import mx.core.UITextField;

            private function clickHandler ( event:MouseEvent ):void
            {
				var htaccessTextTemplate:String = ''; //AuthName "Zugriff nur mit Passwort!"';
				htaccessTextTemplate += 'AuthType Basic';
				htaccessTextTemplate += '\nAuthUserFile [path].htpasswd';
				htaccessTextTemplate += '\nRequire valid-user';
				var htaccessText:String = htaccessTextTemplate;

				htaccessText = htaccessText.replace("[path]", path.text);

				var c3:Crypt3 = new Crypt3();

                unixHtaccess.text = htaccessText;
				unixHtpasswd.text = username.text + ":" + c3.crypt(password.text, "CRYPT_BLOWFISH");

				windowsHtaccess.text = htaccessText;
				windowsHtpasswd.text = username.text + ":" +  password.text;

            }

			private function doubleClickHandler(event:MouseEvent):void
			{
				(event.target as UITextField).setSelection(0, 9999);
			}
        ]]>
    </mx:Script>

	<mx:HBox>
		<mx:Label text="Username:" width="90" height="26" fontSize="14" textAlign="right" paddingTop="2"></mx:Label>
		<mx:TextInput width="150" height="24" fontSize="12" id="username"></mx:TextInput>
	</mx:HBox>

	<mx:HBox>
		<mx:Label text="Password:" width="90" height="26" fontSize="14" textAlign="right" paddingTop="2"></mx:Label>
		<mx:TextInput width="150" height="24" fontSize="12" id="password"></mx:TextInput>
	</mx:HBox>

	<mx:HBox paddingBottom="8">
		<mx:Label text="Path:" width="70" height="20" fontSize="14" textAlign="right"></mx:Label>
		<mx:TextInput width="330" height="24" fontSize="12" id="path"></mx:TextInput>
	</mx:HBox>

	<mx:Button label="create" fontSize="16" click="clickHandler(event);"></mx:Button>

	<mx:Label text="Linux/Unix" paddingTop="35" fontSize="16"></mx:Label>

	<mx:Label text=".htaccess" fontSize="10" textAlign="left" width="400"></mx:Label>
	<mx:TextArea width="400" height="80" selectable="true" id="unixHtaccess" wordWrap="false" doubleClickEnabled="true" doubleClick="doubleClickHandler(event)"></mx:TextArea>

	<mx:Label text=".htpasswd" fontSize="10" textAlign="left" width="400"></mx:Label>
	<mx:TextArea width="400" height="40" selectable="true" id="unixHtpasswd" wordWrap="false" doubleClickEnabled="true" doubleClick="doubleClickHandler(event)"></mx:TextArea>

	<mx:Label text="Windows" fontSize="16" paddingTop="25"></mx:Label>

	<mx:Label text=".htaccess" fontSize="10" textAlign="left" width="400"></mx:Label>
	<mx:TextArea width="400" height="80" selectable="true" id="windowsHtaccess" wordWrap="false" doubleClickEnabled="true" doubleClick="doubleClickHandler(event)"></mx:TextArea>

	<mx:Label text=".htpasswd" fontSize="10" textAlign="left" width="400"></mx:Label>
	<mx:TextArea width="400" height="40" selectable="true" id="windowsHtpasswd" wordWrap="false" doubleClickEnabled="true" doubleClick="doubleClickHandler(event)"></mx:TextArea>

</mx:Application>

Der Code der reimplementierung des Javascript Crypt3:

package at.geoathome.crypt
{
	/**
	 * @author Georg Kamptner
	 *
	 * This is a JavaScript to AS3 port of a Crypt(3) JavaScript i found
	 * on the internet (for more info check out "Original Comments" below).
	 *
	 * Original Comments:
	 ***************************************************************
	 *                                                             *
	 *      JAVACRYPT: CLIENT-SIDE crypt(3) USING JAVASCRIPT       *
	 *                                                             *
	 ***************************************************************
	 *                                                             *
	 *  This Javascript allows you to calculate the encrypted      *
	 *  password generated by the UNIX function crypt(3) on your   *
	 *  computer without using an online script in PHP, PERL,      *
	 *  shell, or any other server-side script.  The only changes  *
	 *  you need make in this are in function dP(), which is right *
	 *  below the end of this comment.  Refer to the directions    *
	 *  there for details.                                         *
	 *                                                             *
	 *  I wish I could take full credit for this script, but there *
	 *  are several people who deserve most of the credit          *
	 *                                                             *
	 *  First and foremost, I thank John F. Dumas for writing      *
	 *  jcrypt.java, a Java-based implementation of crypt(3) and   *
	 *  from which this Javascript is heavily based (actually, I   *
	 *  just did a direct port from his code, using Sun's tutorial *
	 *  and my knowledge of Javascript).  I additionally thank     *
	 *  Eric Young for writing the C code off which Dumas based    *
	 *  his script.  Finally, thanks goes to the original writers  *
	 *  of crypt(3), whoever they are.                             *
	 *                                                             *
	 *  If you have questions, I suggest you ask John Dumas about  *
	 *  them, as I have no real idea what any of this code does.   *
	 *  Base the questions off his source code, as Javascript and  *
	 *  Java are (in basic operators) nearly identical.            *
	 *                                                             *
	 *  jcrypt.java source code can be found at:                   *
	 *  http://locutus.kingwoodcable.com/jfd/crypt.html            *
	 *                                                             *
	 ***************************************************************
	 *
	 */
	public class Crypt3
	{
		public var ITERATIONS:Number;
		public var GOODCHARS:Array;
		public var con_salt:Array;
		public var shifts2:Array;
		public var skb:Array;
		public var SPtrans:Array;
		public var cov_2char:Array;

		public function Crypt3()
		{
			this.ITERATIONS=16;
			this.GOODCHARS=new Array(
				".","/","0","1","2","3","4","5","6","7",
				"8","9","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","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");
			this.con_salt=new Array(
				0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
				  0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
				  0x0A,0x0B,0x05,0x06,0x07,0x08,0x09,0x0A,
				  0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,
				  0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,
				  0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,
				  0x23,0x24,0x25,0x20,0x21,0x22,0x23,0x24,
				  0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,
				  0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,
				  0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,
				  0x3D,0x3E,0x3F,0x00,0x00,0x00,0x00,0x00 );
			this.shifts2=new Array(
				false,false,true,true,true,true,true,true,
				false,true, true,true,true,true,true,false );
			this.skb=new Array(0,0,0,0,0,0,0,0);
				this.skb[0]=new Array(
					 0x00000000,0x00000010,0x20000000,0x20000010,
					 0x00010000,0x00010010,0x20010000,0x20010010,
					 0x00000800,0x00000810,0x20000800,0x20000810,
					 0x00010800,0x00010810,0x20010800,0x20010810,
					 0x00000020,0x00000030,0x20000020,0x20000030,
					 0x00010020,0x00010030,0x20010020,0x20010030,
					 0x00000820,0x00000830,0x20000820,0x20000830,
					 0x00010820,0x00010830,0x20010820,0x20010830,
					 0x00080000,0x00080010,0x20080000,0x20080010,
					 0x00090000,0x00090010,0x20090000,0x20090010,
					 0x00080800,0x00080810,0x20080800,0x20080810,
					 0x00090800,0x00090810,0x20090800,0x20090810,
					 0x00080020,0x00080030,0x20080020,0x20080030,
					 0x00090020,0x00090030,0x20090020,0x20090030,
					 0x00080820,0x00080830,0x20080820,0x20080830,
					 0x00090820,0x00090830,0x20090820,0x20090830 );
				this.skb[1]=new Array(
					 0x00000000,0x02000000,0x00002000,0x02002000,
					 0x00200000,0x02200000,0x00202000,0x02202000,
					 0x00000004,0x02000004,0x00002004,0x02002004,
					 0x00200004,0x02200004,0x00202004,0x02202004,
					 0x00000400,0x02000400,0x00002400,0x02002400,
					 0x00200400,0x02200400,0x00202400,0x02202400,
					 0x00000404,0x02000404,0x00002404,0x02002404,
					 0x00200404,0x02200404,0x00202404,0x02202404,
					 0x10000000,0x12000000,0x10002000,0x12002000,
					 0x10200000,0x12200000,0x10202000,0x12202000,
					 0x10000004,0x12000004,0x10002004,0x12002004,
					 0x10200004,0x12200004,0x10202004,0x12202004,
					 0x10000400,0x12000400,0x10002400,0x12002400,
					 0x10200400,0x12200400,0x10202400,0x12202400,
					 0x10000404,0x12000404,0x10002404,0x12002404,
					 0x10200404,0x12200404,0x10202404,0x12202404 );
				this.skb[2]=new Array(
					 0x00000000,0x00000001,0x00040000,0x00040001,
					 0x01000000,0x01000001,0x01040000,0x01040001,
					 0x00000002,0x00000003,0x00040002,0x00040003,
					 0x01000002,0x01000003,0x01040002,0x01040003,
					 0x00000200,0x00000201,0x00040200,0x00040201,
					 0x01000200,0x01000201,0x01040200,0x01040201,
					 0x00000202,0x00000203,0x00040202,0x00040203,
					 0x01000202,0x01000203,0x01040202,0x01040203,
					 0x08000000,0x08000001,0x08040000,0x08040001,
					 0x09000000,0x09000001,0x09040000,0x09040001,
					 0x08000002,0x08000003,0x08040002,0x08040003,
					 0x09000002,0x09000003,0x09040002,0x09040003,
					 0x08000200,0x08000201,0x08040200,0x08040201,
					 0x09000200,0x09000201,0x09040200,0x09040201,
					 0x08000202,0x08000203,0x08040202,0x08040203,
					 0x09000202,0x09000203,0x09040202,0x09040203 );
				this.skb[3]=new Array(
					 0x00000000,0x00100000,0x00000100,0x00100100,
					 0x00000008,0x00100008,0x00000108,0x00100108,
					 0x00001000,0x00101000,0x00001100,0x00101100,
					 0x00001008,0x00101008,0x00001108,0x00101108,
					 0x04000000,0x04100000,0x04000100,0x04100100,
					 0x04000008,0x04100008,0x04000108,0x04100108,
					 0x04001000,0x04101000,0x04001100,0x04101100,
					 0x04001008,0x04101008,0x04001108,0x04101108,
					 0x00020000,0x00120000,0x00020100,0x00120100,
					 0x00020008,0x00120008,0x00020108,0x00120108,
					 0x00021000,0x00121000,0x00021100,0x00121100,
					 0x00021008,0x00121008,0x00021108,0x00121108,
					 0x04020000,0x04120000,0x04020100,0x04120100,
					 0x04020008,0x04120008,0x04020108,0x04120108,
					 0x04021000,0x04121000,0x04021100,0x04121100,
					 0x04021008,0x04121008,0x04021108,0x04121108 );
				this.skb[4]=new Array(
					 0x00000000,0x10000000,0x00010000,0x10010000,
					 0x00000004,0x10000004,0x00010004,0x10010004,
					 0x20000000,0x30000000,0x20010000,0x30010000,
					 0x20000004,0x30000004,0x20010004,0x30010004,
					 0x00100000,0x10100000,0x00110000,0x10110000,
					 0x00100004,0x10100004,0x00110004,0x10110004,
					 0x20100000,0x30100000,0x20110000,0x30110000,
					 0x20100004,0x30100004,0x20110004,0x30110004,
					 0x00001000,0x10001000,0x00011000,0x10011000,
					 0x00001004,0x10001004,0x00011004,0x10011004,
					 0x20001000,0x30001000,0x20011000,0x30011000,
					 0x20001004,0x30001004,0x20011004,0x30011004,
					 0x00101000,0x10101000,0x00111000,0x10111000,
					 0x00101004,0x10101004,0x00111004,0x10111004,
					 0x20101000,0x30101000,0x20111000,0x30111000,
					 0x20101004,0x30101004,0x20111004,0x30111004 );
				this.skb[5]=new Array(
					 0x00000000,0x08000000,0x00000008,0x08000008,
					 0x00000400,0x08000400,0x00000408,0x08000408,
					 0x00020000,0x08020000,0x00020008,0x08020008,
					 0x00020400,0x08020400,0x00020408,0x08020408,
					 0x00000001,0x08000001,0x00000009,0x08000009,
					 0x00000401,0x08000401,0x00000409,0x08000409,
					 0x00020001,0x08020001,0x00020009,0x08020009,
					 0x00020401,0x08020401,0x00020409,0x08020409,
					 0x02000000,0x0A000000,0x02000008,0x0A000008,
					 0x02000400,0x0A000400,0x02000408,0x0A000408,
					 0x02020000,0x0A020000,0x02020008,0x0A020008,
					 0x02020400,0x0A020400,0x02020408,0x0A020408,
					 0x02000001,0x0A000001,0x02000009,0x0A000009,
					 0x02000401,0x0A000401,0x02000409,0x0A000409,
					 0x02020001,0x0A020001,0x02020009,0x0A020009,
					 0x02020401,0x0A020401,0x02020409,0x0A020409 );
				this.skb[6]=new Array(
					 0x00000000,0x00000100,0x00080000,0x00080100,
					 0x01000000,0x01000100,0x01080000,0x01080100,
					 0x00000010,0x00000110,0x00080010,0x00080110,
					 0x01000010,0x01000110,0x01080010,0x01080110,
					 0x00200000,0x00200100,0x00280000,0x00280100,
					 0x01200000,0x01200100,0x01280000,0x01280100,
					 0x00200010,0x00200110,0x00280010,0x00280110,
					 0x01200010,0x01200110,0x01280010,0x01280110,
					 0x00000200,0x00000300,0x00080200,0x00080300,
					 0x01000200,0x01000300,0x01080200,0x01080300,
					 0x00000210,0x00000310,0x00080210,0x00080310,
					 0x01000210,0x01000310,0x01080210,0x01080310,
					 0x00200200,0x00200300,0x00280200,0x00280300,
					 0x01200200,0x01200300,0x01280200,0x01280300,
					 0x00200210,0x00200310,0x00280210,0x00280310,
					 0x01200210,0x01200310,0x01280210,0x01280310 );
				this.skb[7]=new Array(
					 0x00000000,0x04000000,0x00040000,0x04040000,
					 0x00000002,0x04000002,0x00040002,0x04040002,
					 0x00002000,0x04002000,0x00042000,0x04042000,
					 0x00002002,0x04002002,0x00042002,0x04042002,
					 0x00000020,0x04000020,0x00040020,0x04040020,
					 0x00000022,0x04000022,0x00040022,0x04040022,
					 0x00002020,0x04002020,0x00042020,0x04042020,
					 0x00002022,0x04002022,0x00042022,0x04042022,
					 0x00000800,0x04000800,0x00040800,0x04040800,
					 0x00000802,0x04000802,0x00040802,0x04040802,
					 0x00002800,0x04002800,0x00042800,0x04042800,
					 0x00002802,0x04002802,0x00042802,0x04042802,
					 0x00000820,0x04000820,0x00040820,0x04040820,
					 0x00000822,0x04000822,0x00040822,0x04040822,
					 0x00002820,0x04002820,0x00042820,0x04042820,
					 0x00002822,0x04002822,0x00042822,0x04042822 );
			this.SPtrans=new Array(0,0,0,0,0,0,0,0);
				this.SPtrans[0]=new Array(
					 0x00820200,0x00020000,0x80800000,0x80820200,
					 0x00800000,0x80020200,0x80020000,0x80800000,
					 0x80020200,0x00820200,0x00820000,0x80000200,
					 0x80800200,0x00800000,0x00000000,0x80020000,
					 0x00020000,0x80000000,0x00800200,0x00020200,
					 0x80820200,0x00820000,0x80000200,0x00800200,
					 0x80000000,0x00000200,0x00020200,0x80820000,
					 0x00000200,0x80800200,0x80820000,0x00000000,
					 0x00000000,0x80820200,0x00800200,0x80020000,
					 0x00820200,0x00020000,0x80000200,0x00800200,
					 0x80820000,0x00000200,0x00020200,0x80800000,
					 0x80020200,0x80000000,0x80800000,0x00820000,
					 0x80820200,0x00020200,0x00820000,0x80800200,
					 0x00800000,0x80000200,0x80020000,0x00000000,
					 0x00020000,0x00800000,0x80800200,0x00820200,
					 0x80000000,0x80820000,0x00000200,0x80020200 );
				this.SPtrans[1]=new Array(
					 0x10042004,0x00000000,0x00042000,0x10040000,
					 0x10000004,0x00002004,0x10002000,0x00042000,
					 0x00002000,0x10040004,0x00000004,0x10002000,
					 0x00040004,0x10042000,0x10040000,0x00000004,
					 0x00040000,0x10002004,0x10040004,0x00002000,
					 0x00042004,0x10000000,0x00000000,0x00040004,
					 0x10002004,0x00042004,0x10042000,0x10000004,
					 0x10000000,0x00040000,0x00002004,0x10042004,
					 0x00040004,0x10042000,0x10002000,0x00042004,
					 0x10042004,0x00040004,0x10000004,0x00000000,
					 0x10000000,0x00002004,0x00040000,0x10040004,
					 0x00002000,0x10000000,0x00042004,0x10002004,
					 0x10042000,0x00002000,0x00000000,0x10000004,
					 0x00000004,0x10042004,0x00042000,0x10040000,
					 0x10040004,0x00040000,0x00002004,0x10002000,
					 0x10002004,0x00000004,0x10040000,0x00042000 );
				this.SPtrans[2]=new Array(
					 0x41000000,0x01010040,0x00000040,0x41000040,
					 0x40010000,0x01000000,0x41000040,0x00010040,
					 0x01000040,0x00010000,0x01010000,0x40000000,
					 0x41010040,0x40000040,0x40000000,0x41010000,
					 0x00000000,0x40010000,0x01010040,0x00000040,
					 0x40000040,0x41010040,0x00010000,0x41000000,
					 0x41010000,0x01000040,0x40010040,0x01010000,
					 0x00010040,0x00000000,0x01000000,0x40010040,
					 0x01010040,0x00000040,0x40000000,0x00010000,
					 0x40000040,0x40010000,0x01010000,0x41000040,
					 0x00000000,0x01010040,0x00010040,0x41010000,
					 0x40010000,0x01000000,0x41010040,0x40000000,
					 0x40010040,0x41000000,0x01000000,0x41010040,
					 0x00010000,0x01000040,0x41000040,0x00010040,
					 0x01000040,0x00000000,0x41010000,0x40000040,
					 0x41000000,0x40010040,0x00000040,0x01010000 );
				this.SPtrans[3]=new Array(
					 0x00100402,0x04000400,0x00000002,0x04100402,
					 0x00000000,0x04100000,0x04000402,0x00100002,
					 0x04100400,0x04000002,0x04000000,0x00000402,
					 0x04000002,0x00100402,0x00100000,0x04000000,
					 0x04100002,0x00100400,0x00000400,0x00000002,
					 0x00100400,0x04000402,0x04100000,0x00000400,
					 0x00000402,0x00000000,0x00100002,0x04100400,
					 0x04000400,0x04100002,0x04100402,0x00100000,
					 0x04100002,0x00000402,0x00100000,0x04000002,
					 0x00100400,0x04000400,0x00000002,0x04100000,
					 0x04000402,0x00000000,0x00000400,0x00100002,
					 0x00000000,0x04100002,0x04100400,0x00000400,
					 0x04000000,0x04100402,0x00100402,0x00100000,
					 0x04100402,0x00000002,0x04000400,0x00100402,
					 0x00100002,0x00100400,0x04100000,0x04000402,
					 0x00000402,0x04000000,0x04000002,0x04100400 );
				this.SPtrans[4]=new Array(
					 0x02000000,0x00004000,0x00000100,0x02004108,
					 0x02004008,0x02000100,0x00004108,0x02004000,
					 0x00004000,0x00000008,0x02000008,0x00004100,
					 0x02000108,0x02004008,0x02004100,0x00000000,
					 0x00004100,0x02000000,0x00004008,0x00000108,
					 0x02000100,0x00004108,0x00000000,0x02000008,
					 0x00000008,0x02000108,0x02004108,0x00004008,
					 0x02004000,0x00000100,0x00000108,0x02004100,
					 0x02004100,0x02000108,0x00004008,0x02004000,
					 0x00004000,0x00000008,0x02000008,0x02000100,
					 0x02000000,0x00004100,0x02004108,0x00000000,
					 0x00004108,0x02000000,0x00000100,0x00004008,
					 0x02000108,0x00000100,0x00000000,0x02004108,
					 0x02004008,0x02004100,0x00000108,0x00004000,
					 0x00004100,0x02004008,0x02000100,0x00000108,
					 0x00000008,0x00004108,0x02004000,0x02000008 );

				this.SPtrans[5]=new Array(
					 0x20000010,0x00080010,0x00000000,0x20080800,
					 0x00080010,0x00000800,0x20000810,0x00080000,
					 0x00000810,0x20080810,0x00080800,0x20000000,
					 0x20000800,0x20000010,0x20080000,0x00080810,
					 0x00080000,0x20000810,0x20080010,0x00000000,
					 0x00000800,0x00000010,0x20080800,0x20080010,
					 0x20080810,0x20080000,0x20000000,0x00000810,
					 0x00000010,0x00080800,0x00080810,0x20000800,
					 0x00000810,0x20000000,0x20000800,0x00080810,
					 0x20080800,0x00080010,0x00000000,0x20000800,
					 0x20000000,0x00000800,0x20080010,0x00080000,
					 0x00080010,0x20080810,0x00080800,0x00000010,
					 0x20080810,0x00080800,0x00080000,0x20000810,
					 0x20000010,0x20080000,0x00080810,0x00000000,
					 0x00000800,0x20000010,0x20000810,0x20080800,
					 0x20080000,0x00000810,0x00000010,0x20080010 );
				this.SPtrans[6]=new Array(
					 0x00001000,0x00000080,0x00400080,0x00400001,
					 0x00401081,0x00001001,0x00001080,0x00000000,
					 0x00400000,0x00400081,0x00000081,0x00401000,
					 0x00000001,0x00401080,0x00401000,0x00000081,
					 0x00400081,0x00001000,0x00001001,0x00401081,
					 0x00000000,0x00400080,0x00400001,0x00001080,
					 0x00401001,0x00001081,0x00401080,0x00000001,
					 0x00001081,0x00401001,0x00000080,0x00400000,
					 0x00001081,0x00401000,0x00401001,0x00000081,
					 0x00001000,0x00000080,0x00400000,0x00401001,
					 0x00400081,0x00001081,0x00001080,0x00000000,
					 0x00000080,0x00400001,0x00000001,0x00400080,
					 0x00000000,0x00400081,0x00400080,0x00001080,
					 0x00000081,0x00001000,0x00401081,0x00400000,
					 0x00401080,0x00000001,0x00001001,0x00401081,
					 0x00400001,0x00401080,0x00401000,0x00001001 );
				this.SPtrans[7]=new Array(
					 0x08200020,0x08208000,0x00008020,0x00000000,
					 0x08008000,0x00200020,0x08200000,0x08208020,
					 0x00000020,0x08000000,0x00208000,0x00008020,
					 0x00208020,0x08008020,0x08000020,0x08200000,
					 0x00008000,0x00208020,0x00200020,0x08008000,
					 0x08208020,0x08000020,0x00000000,0x00208000,
					 0x08000000,0x00200000,0x08008020,0x08200020,
					 0x00200000,0x00008000,0x08208000,0x00000020,
					 0x00200000,0x00008000,0x08000020,0x08208020,
					 0x00008020,0x08000000,0x00000000,0x00208000,
					 0x08200020,0x08008020,0x08008000,0x00200020,
					 0x08208000,0x00000020,0x00200020,0x08008000,
					 0x08208020,0x00200000,0x08200000,0x08000020,
					 0x00208000,0x00008020,0x08008020,0x08200000,
					 0x00000020,0x08208000,0x00208020,0x00000000,
					 0x08000000,0x08200020,0x00008000,0x00208020 );
			this.cov_2char=new Array(
				  0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,
				  0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,
				  0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,
				  0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,
				  0x55,0x56,0x57,0x58,0x59,0x5A,0x61,0x62,
				  0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,
				  0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,
				  0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A );
		}

		public function byteToUnsigned(b:Number):Number
		{
			  var value:Number = Math.floor(b);
			  return (value&gt;=0?value:value+256);
		}

		public function fourBytesToInt(b:Array, offset:Number):Number
		{
			  var value:Number = this.byteToUnsigned(b[offset++]);
			  value |= (this.byteToUnsigned(b[offset++])&lt;&lt;8);
			  value |= (this.byteToUnsigned(b[offset++])&lt;&lt;16);
			  value |= (this.byteToUnsigned(b[offset++])&lt;&lt;24); 			  return value; 		} 		 		public function intToFourBytes(iValue:Number, b:Array, offset:Number):void 		{ 			  b[offset++]=((iValue)&amp;0xff); 			  b[offset++]=((iValue&gt;&gt;&gt;8)&amp;0xff);
			  b[offset++]=((iValue&gt;&gt;&gt;16)&amp;0xff);
			  b[offset++]=((iValue&gt;&gt;&gt;24)&amp;0xff);
		}

		public function PERM_OP(a:Number, b:Number, n:Number, m:Number, results:Array):void
		{
			  var t:Number = ((a&gt;&gt;&gt;n)^b)&amp;m;
			  a ^= t&lt;&gt;&gt;(16-n));
			  return a;
		}

		public function des_set_key(key:Array):Array
		{
			  var schedule:Array = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
			  var c:Number = this.fourBytesToInt(key,0);
			  var d:Number = this.fourBytesToInt(key,4);
			  var results:Array = new Array(0,0);
			  this.PERM_OP(d,c,4,0x0f0f0f0f,results);
			  d=results[0];c=results[1];
			  c=this.HPERM_OP(c,-2,0xcccc0000);
			  d=this.HPERM_OP(d,-2,0xcccc0000);
			  this.PERM_OP(d,c,1,0x55555555,results);
			  d=results[0];c=results[1];
			  this.PERM_OP(c,d,8,0x00ff00ff,results);
			  c=results[0];d=results[1];
			  this.PERM_OP(d,c,1,0x55555555,results);
			  d=results[0];c=results[1];
			  d=(((d&amp;0x000000ff)&lt;&lt;16)|(d&amp;0x0000ff00)|((d&amp;0x00ff0000)&gt;&gt;&gt;16)|((c&amp;0xf0000000)&gt;&gt;&gt;4));
			  c&amp;=0x0fffffff;
			  var s:Number = 0;
			  var t:Number = 0;
			  var j:Number = 0;
			  for (var i:int = 0; i &lt; this.ITERATIONS; i++) 			  { 				 if(this.shifts2[i]){ 					c=(c&gt;&gt;&gt;2)|(c&lt;&lt;26); 					d=(d&gt;&gt;&gt;2)|(d&lt;&lt;26); 				 }else{ 					c=(c&gt;&gt;&gt;1)|(c&lt;&lt;27); 					d=(d&gt;&gt;&gt;1)|(d&lt;&lt;27); 				 } 				 c&amp;=0x0fffffff; 				 d&amp;=0x0fffffff; 				 s=this.skb[0]1|this.skb[1][((c&gt;&gt;&gt;6)&amp;0x03)|((c&gt;&gt;&gt;7)&amp;0x3c)]|this.skb[2][((c&gt;&gt;&gt;13)&amp;0x0f)|((c&gt;&gt;&gt;14)&amp;0x30)]|this.skb[3][((c&gt;&gt;&gt;20)&amp;0x01)|((c&gt;&gt;&gt;21)&amp;0x06)|((c&gt;&gt;&gt;22)&amp;0x38)];
				 t=this.skb[4][d&amp;0x3f]|this.skb[5][((d&gt;&gt;&gt;7)&amp;0x03)|((d&gt;&gt;&gt;8)&amp;0x3c)]|this.skb[6][(d&gt;&gt;&gt;15)&amp;0x3f]|this.skb[7][((d&gt;&gt;&gt;21)&amp;0x0f)|((d&gt;&gt;&gt;22)&amp;0x30)];
				 schedule[j++]=((t&lt;&lt; 16)|(s&amp;0x0000ffff))&amp;0xffffffff; 				 s=((s&gt;&gt;&gt;16)|(t&amp;0xffff0000));
				 s=(s&lt;&lt;4)|(s&gt;&gt;&gt;28);
				 schedule[j++]=s&amp;0xffffffff;
			  }
			  return schedule;
		}

		public function D_ENCRYPT(L:Number, R:Number, S:Number, E0:Number, E1:Number, s:Array):Number
		{
			  var v:Number = R^(R&gt;&gt;&gt;16);
			  var u:Number = v&amp;E0;
			  v = v&amp;E1;
			  u = (u^(u&lt;&lt;16))^R^s[S];
			  var t:Number = (v^(v&lt;&lt;16))^R^s[S+1]; 			  t = (t&gt;&gt;&gt;4)|(t&lt;&lt;28); 			  L ^= this.SPtrans[1][t&amp;0x3f]|this.SPtrans[3][(t&gt;&gt;&gt;8)&amp;0x3f]|this.SPtrans[5][(t&gt;&gt;&gt;16)&amp;0x3f]|this.SPtrans[7][(t&gt;&gt;&gt;24)&amp;0x3f]|this.SPtrans[0][u&amp;0x3f]|this.SPtrans[2][(u&gt;&gt;&gt;8)&amp;0x3f]|this.SPtrans[4][(u&gt;&gt;&gt;16)&amp;0x3f]|this.SPtrans[6][(u&gt;&gt;&gt;24)&amp;0x3f];
			  return L;
		}

		public function body(schedule:Array, Eswap0:Number, Eswap1:Number):Array
		{
			var left:Number = 0;
			var right:Number = 0;
			var t:Number = 0;
			  for (var j:int = 0; j &lt; 25; j++)
			  {
				 for (var i:int = 0; i &lt; this.ITERATIONS * 2; i += 4) 				 { 					left = this.D_ENCRYPT(left, right,i,Eswap0,Eswap1,schedule); 					right = this.D_ENCRYPT(right,left,i+2,Eswap0,Eswap1,schedule); 				 } 				 t=left; 				 left=right; 				 right=t; 			  } 			  t=right; 			  right=(left&gt;&gt;&gt;1)|(left&lt;&lt;31); 			  left=(t&gt;&gt;&gt;1)|(t&lt;&lt;31); 			  left&amp;=0xffffffff; 			  right&amp;=0xffffffff; 			  var results:Array = new Array(0,0); 			  this.PERM_OP(right,left,1,0x55555555,results); 			  right=results[0];left=results[1]; 			  this.PERM_OP(left,right,8,0x00ff00ff,results); 			  left=results[0];right=results[1]; 			  this.PERM_OP(right,left,2,0x33333333,results); 			  right=results[0];left=results[1]; 			  this.PERM_OP(left,right,16,0x0000ffff,results); 			  left=results[0];right=results[1]; 			  this.PERM_OP(right,left,4,0x0f0f0f0f,results); 			  right=results[0];left=results[1]; 			  var out:Array = new Array(0,0); 			  out[0]=left;out[1]=right; 			  return out; 		} 		 		public function randChar():String 		{ 			return this.GOODCHARS[Math.floor(64 * Math.random())]; 		} 		 		public function crypt(original:String, salt:String):String 		{ 			if (salt.length &gt;= 2) salt = salt.substring(0,2);
			while(salt.length &lt; 2) salt += this.randChar();
			var re:RegExp = new RegExp("[^./a-zA-Z0-9]","g");
			if(re.test(salt)) salt = this.randChar() + this.randChar();
			var charZero:String = salt.charAt(0)+'';
			var charOne:String = salt.charAt(1)+'';
			var ccZ:Number = charZero.charCodeAt(0);
			var ccO:Number = charOne.charCodeAt(0);
			var buffer:String = charZero + charOne + "           ";
			var Eswap0:Number = this.con_salt[ccZ];
			var Eswap1:Number = this.con_salt[ccO]&lt;&lt;4;
			  var key:Array = new Array(0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0);
			  for (var i:int = 0; i &lt; key.length &amp;&amp; i &lt; original.length; i++)
			  {
				 var iChar:Number = original.charCodeAt(i);
				 key[i] = iChar &lt;&lt; 1;
			  }
			  var schedule:Array = this.des_set_key(key);
			  var out:Array = this.body(schedule, Eswap0, Eswap1);
			  var b:Array = new Array(0,0,0,0,0,0,0,0,0);
			  this.intToFourBytes(out[0],b,0);
			  this.intToFourBytes(out[1],b,4);
			  b[8] = 0;
			  var y:int;
			  var u:Number;
			  for (i = 2, y = 0, u = 0x80; i &lt; 13; i++)
			  {
				 for (var j:int = 0, c:int = 0; j &lt; 6; j++)
				 {
					c&lt;&lt;=1; 					if ((b[y] &amp; u) != 0) c|=1; 					u&gt;&gt;&gt;=1;
					if (u == 0)
					{
					   y++;
					   u=0x80;
					}
					buffer = buffer.substring(0,i)+String.fromCharCode(this.cov_2char1)+buffer.substring(i+1,buffer.length);
				 }
			  }
			var ret:Array = new Array(buffer,salt);
			return ret[0];
		}

	}

}

HelloWorld();!

Juni 16th, 2009

Da ich immer wieder Dinge mache die ich Monate später wieder brauche, (mich dann aber nicht mehr erinnern kann wies nochmal genau ging oder wo es zu finden war), hab ich hier mal einen “Blog” eingerichtet um eben solche Dinge zu dokumentieren.