Posts Tagged ‘flash’

Flash Player Molehill, Flash 3D API (openGL, DirectX), PixelBender3D

Donnerstag, März 3rd, 2011

Am 27. Februar verkündete Adobe im Rahmen des “Flash Gaming Summit” in San Francisco, dass nun die Beta Version des neuen Flash Players (+Molehill) zum Download bereitsteht (siehe Links weiter unten).

Flash + Molehill – A Whole New Dimension for Games (Video)

(Molehill ab Minute 33:25)

Interessante Punkte aus der Präsentation:

  • ~ PixelBender 3D (verfügbar ab 4ten März) für Shader Code
  • ~ keine Fixed Function Pipeline in Molehill
  • ~ aktuelle Flash 3D Engines mit welchen Adobe zusammenarbeitet (wieder mal keine Spur von Papervision) und Demos
  • ~ ein ganzes Code Beispiel wie man ein Dreieck zeichnet und Shader erstellt
  • ~ Molehill APIs Dokus, Beta Player und 3D Engines kommen bald (bzw. sind schon da)
  • ~ Adobe Flash Incubator soll zur stärkeren Zusammenarbeit von Adobe mit Entwicklern führen
  • ~ trotz intensiver Suche konnte ich die im Video angesprochene Dokumentation der Molehill API leider nirgends finden :-/ Danke an “jo” für den Hinweis zur Dokumentation (hab den Link zur Dokumentation unten hinzugefügt).

Links:

Flash iPhone Entwicklung mit FlashDevelop und dem Adobe “Packager for iPhone”

Freitag, September 17th, 2010

Da Apple seine Richtlinien für Code von Drittanbietern in Form von LLVMs gelockert hat, darf man nun wieder offiziell Adobe Flash-Applikationen für das iPhone und iPad erstellen.

Aus diesem Grund hab ich mich mal hingesetzt und eine FlashDevelop Project Vorlage gemacht, die es ähnlich der Air-Pojekte erlaubt mittels Batch-Dateien ein fertiges .ipa Paket zu erstellen.

Anlaufstellen für Probleme und Fragen bezüglich der Flash Entwicklung für iPhone sind die offizielle Adobe Labs Seite zum iPhone Packager, der dazugehörende Entwicklerleitfaden (pdf), oder das iPhone Packager Forum.

So genug der langen Vorreden, hier nun eine Schritt für Schritt Anleitung zum Erstellen von iPhone Applikationen mit FlashDevelop.

Voraussetzungen

Bevor man anfangen kann müssen erst eine Dinge erledigt werden. Selbst wenn man nicht mit den Apple Werkezugen (Xcode, InterfaceBilder) arbeitet benötigt man trotzdem einen Apple Developer Account (kostet $99 pro Jahr) mit dessen Hilfe man die notwendigen Zertifikate erstellen kann.

  • Zertifikate (“.p12″ und “.mobileprovision”)

    Das Zertifikat mit der Dateiendung .p12 kann man leider nicht direkt bei Apple herunterladen, allerdings lässt es sich zumindest auf einem Mac leicht aus dem .cer Zertifikat exportieren.
    Die .mobileprovision Datei wird online über den Apple Developer Account erstellt. Man kann die .p12 auch in Windows mittels openSSL selbst herstellen, allerdings hat dies bei meinem Test weder in WinXP, noch Vista oder Win7 zuverlässig funktioniert.

    .p12 "Private Key" aus dem Schlüsselbund exportieren

    .p12 "Private Key" aus dem Schlüsselbund exportieren und als .p12-Datei abspeichern

    .mobileprovision Datei Download

    .mobileprovision Datei Download

    Eine genauere Erklärung des Apple Lizenzmodells möchte ich hier nicht geben. Wer noch keinen Apple Developer Account hat oder mehr über die Lizenzierung erfahren möchte, der kann sich z.B. die Aufzeichnung von Saban Ünlüs Vortrag auf der FFK2010 ansehen oder direkt in der Adobe Anleitung nachlesen.

    Wurden die beiden Dateien gespeichert sollten diese in  “iphone_dev.p12” und “iphone_dev.mobileprovision” umbenannt werden. Sie dienen später der Erstellung der .ipa-Datei.

  • Flex 4 SDK und der “Packager for iPhone” seit Air 2.5 ist dieser im Air SDK inkludiert

    Den Flex SDK gibt es im OpenSource Bereich von Adobe zum Download. Ich habe für meine Tests die Version 4.1.0.16076 benutzt (download). Wurde dieser heruntergeladen und entpackt so fehlt noch der iPhone Packager. Hier wurde beim Test die “Version” v1_win_060210 verwendet (download). Der iPhone Packager muss entpackt und dessen Inhalt in den Flex SDK Ordner verfrachtet werden (einfach kopieren und ersetzen). Update: der iPhone Packager ist seit der Air SDK Version 2.5 im Air SDK von Haus aus mit dabei. Also einfach den Air SDK (>= 2.5) in den Flex SDK (z.B. 4.5.1) “kopieren und ersetzen”. Damit ist der SDK, mit dem später die iPhone taugliche SWF-Datei erstellt wird, vollständig.

  • FlashDevelop Iphone Project Template

    Dieser Teil ist einfach zu erledigen. Das FlashDevelop 3.2.2 RTM Template gibt es hier zum Download (iPhone AIR AS3 Projector Template). Diese zip-Datei muss nur entpackt und in das C:\[pfad_zu_FlashDevelop]\FlashDevelop\Projects\ Verzeichnis kopiert werden.

    Update: Das Template funktioniert auch mit FlashDevelop 3.3.0 und 3.3.1, allerdings gibt es in diesen Versionen einen Bug mit dem Flex SDK Pfad (FlashDevelop Bug im Forum) welcher zu Problemen führen kann.

    Update: Möchte man die Grundinstallation vom FlashDevelop sauber halten so kann man das Template auch im Benutzerverzeichnis (“Tools > Application Files …“) speichern.

    FlashDevelop Project Template einfügen

    FlashDevelop Project Template im Ordner "Projects" einfügen.

    Ein Neustart von FlashDevelop ist nicht nötig, man kann das neue Projekt Template sofort im Menü auswählen.

    iPhone Air AS3 Projector

    iPhone Air AS3 Projector

Ein iPhone Projekt

Nach dem nun alle Voraussetzungen erfüllt sind kann man ein iPhone Projekt erstellen. Erfahrene FlashDevelop Benutzer können diesen Teil überspringen und die im Projekt enthaltene readme.txt als kurze Anleitung verwenden.

  • Flex SDK eintrichten

    Da für das iPhone der normale SDK nicht ausreicht muss der bereits vorbereitet “Flex SDK + iPhone Packager” für iPhone Projekte genutzt werden. Rechtsklick auf den Projektnamen -> Properties... -> “Compiler Options” -> “Custom Path to Flex SDK” und dort trägt man nun den Pfad des vorbereiteten Flex SDK Ordners ein.

    Flex SDK Pfad anpassen

    Flex SDK Pfad anpassen

    Den Pfad zum Flex SDK kann man gleich mit Strg + c in die Zwischenablage kopieren, denn er wir im nächsten Schritt auch gebraucht.

  • PackageApplication.bat” anpassen

    In der Datei “PackageApplication.bat” muss auch der Pfad zum Flex SDK angepasst werden. Hierzu einfach in Flashdevelop doppelklick auf die Datei “PackageAppliaction.bat” und den Pfad in Zeile 13 anpassen, indem man “C:\flex_sdk_4_with_iphone_packager\bin” durch den Pfad des bin (!) Ordners des Flex SDK ersetzt.

    Den Flex SDK Pfad in der Datei "PackageApplication.bat" anpassen.

    Den Flex SDK Pfad in der Datei "PackageApplication.bat" anpassen.

  • Das Flash Develop Projekt iPhone fitt machen

    Hat man ein fertiges Projekt erstellt sollte dieses ähnlich wie im Bild unten gezeigt aussehen. Im Vergleich zu einem normalen FladhDevelop Projekt fallen die Ordner “certificates” und “iphone“, sowie das bereits gut gefüllte “bin” Verzeichnis ins Auge.

    Um das Projekt später in eine .ipa packen zu können sollten zuerst die Zertifikat-Dateien in den “certificates” Ordner kopiert werden. Falls noch nicht passiert, müssen diese nun in “iphone_dev.p12” und “iphone_dev.mobileprovision” umbenannt werden.

    Zertifikate nach "certificates" kopieren und richtig benennen.

    Zertifikate nach "certificates" kopieren und richtig benennen.

  • Die SWF kompilieren

    Hat man den Flex SDK in Flashdevelop angepasst so kann man das Projekt wie gewohnt kompilieren und es startet über den “Air Debug Launcher” (adl). Das sollte bei dem mitgelieferten Projekt in etwa so wie im unteren Bild aussehen. Wie man sieht zeigt der adl einen “Device” Eintrag im Menü an über welchen sich die simulierte Umgebung drehen lässt.

    "Air Debug Launcher" mit einer iPhone Applikation

    "Air Debug Launcher" mit einer iPhone Applikation

  • Eine .ipa erstellen

    Um den Vorgang der IPA-Erstellung zu starten muss die “PackageApplication.bat” ausgeführt werden (Rechtsklick -> Execute). Danach wird erst einmal gefragt welche Art von ipa man erstellen möchte. Für die Entwicklungsphase reicht test (1) oder debug (2). Möchte man seine ipa für den AppStore erzeugen dann sollte man (3) wählen. Wird die Applikation nicht im AppStore sondern über das ad-hoc Verfahren verbreitet dann (4). Für weitere Erklärungen welcher Modus welche Bedeutung hat siehe [“Packager for iPhone Developer Guide“, Seite 26ff].

    IPA Erstellung - Typ der IPA auswhlen

    IPA Erstellung - Typ der IPA auswählen

    Als nächstes wird nach dem Passwort des Zertifikats gefragt. Das ist jenes Passwort welches beim Export aus dem Schlüsselbund am Mac zum Schutz des Zertifikates festgelegt wurde. Achtung: Das Passwort ist während der Eingabe sichtbar.

    IPA Erstellung Passwort Eingabe

    IPA Erstellung Passwort Eingabe

    Nun beginnt die Erstellung der IPA Datei, dies kann einige Zeit dauern.

    IPA wird erstellt

    IPA wird erstellt

    Schlussendlich gibt es eine Meldung ob der Vorgang erfolgreich war. Ist ein Fehler aufgetreten wird eine Meldung des Adobe “pfi” Packagers ausgegeben.

    IPA Erstellung war erfolgreich

    IPA Erstellung war erfolgreich

    Schlussendlich sollte im “iphone” Ordner die gerade erstellte ipa-Datei zu finden sein.

    Das fertige (ipa) iPhone Paket

    Das fertige (ipa) iPhone Paket

Da ich zurzeit kein iPhone zur Hand habe konnte ich noch nicht testen, ob die so erstellen Applikationen auch wirklich am iPhone laufen. Allerdings lässt die durchwegs fehlerlose Abarbeitung der Zertifizierung durch das Adobe “pfi” vermuten, dass es  wohl ziemlich sicher klappen wird.
Sobald ich es getest habe werd ich hier ein Update einfügen – Update: So nun ists “amtlich”, die erstellen Projekte laufen auf dem iPhone :)

Zur Übersicht alle Schritte in Kurzform aus der readme.txt:

Instructions for DISTRIBUTING* your application:

1. Download and Install Flex SDK 4.5.x and Air SDK >= 2.5.x
- Flex < 4.5.1 and Air SDK < 2.5 (beta program):
  - if you use Flex SDK < 4.5.1: download link: http://labs.adobe.com/technologies/packagerforiphone/
  - if you use Flex SDK < 4.5.1: merge your Flex SDK and the packagerforiphone (copy packager files into flex sdk folder)
- Flex 4.5.1 and Air SDK >= 2.5:
  - with Air SDK >= 2.5 (http://www.adobe.com/products/air/sdk/) use the Air SDK just like the "Packager for iPhone" (merge Flex SDK and Air SDK)
- set the Flex SDK Path of your project to the merged Flex SDK folder.

2. Creating certificates:
- download and create a ".mobileprovision" and a ".p12" certificate file
- instructions link: (http://download.macromedia.com/pub/labs/packagerforiphone/packagerforiphone_devguide.pdf)
- name the files "iphone_dev.p12" and "iphone_dev.mobileprovision" and copy them to the 'certificates' directory.

3. Packaging the application:
- edit PackageApplication.bat and change the path to Flex SDK,
- run PackageApplication.bat, you will be prompted for the certificate password.
- the packaged application should appear in your project in the 'iphone' directory.

* to test your application from FlashDevelop, just press F5 as usual, be aware that the available APIs on your desktop differ from the iPhone.

    Und hier nochmals das FlashDevelop iPhone Project Template zum Download.

Updated Download (29.07.2011): iPhone-AIR-AS3-Template (Air SDK > 2.5)

Update(1.10.2010): Hab soeben festgestellt, dass der SplashScreen nicht angezeigt wurde am iPhone. Hab den Fehler behoben und die .zip auf den neuesten Stand gebracht. Ursache war wohl, dass die Default.png wohl immer im “root” des Projekts sein muss und nicht im “bin/” Verzeichnis.

Update(8.10.2010): Die Batch kann nun auch den “GPU rendering diagnostics” Modus auf Wunsch aktivieren. Damit lässt sich das Hoch-und Runterladen von Texturen (Bitmaps) auf die GPU (also die Hardwarebeschleunigung) beobachten. Für alle die es genau wissen wollen, im Grunde wird damit nur der Parameter -renderingdiagnostics beim Aufruf der pfi hinzugefügt. Für mehr Details zur Debug Anzeige der Hardwarebeschleuningung sollte man sich den “iPhone developer guide” Seite 30ff ansehen.

Update(14.11.2010): Update in der Batch Datei: Diese hat immer Dateien mit der Einstellung “-target test-ipa” erstellt, auch wenn man z.B. debug ausgewählt hatte (die Dateinamen wurden aber korrekt geändert). Nun funktioniert es richtig ;)

Update(19.07.2011): Der iPhone Packager ist nun im offiziellen Air SDK (ab version 2.5) enthalten sein. Also man muss nun den Flex SDK 4.5.1 und Air SDK (>= 2.5) zusammenkopieren statt früher den Flex SDK und den “Packager of iPhone”.

Update(29.07.2011):
In den aktuellen Versionen des Flex SDK gibt es kein “pfi” mehr. Hier muss stattdessen “adt” verwenden. Dazu einfach in der Datei “PackageApplication.bat.template” in Zeile 64 “pfi” durch “adt” ersetzen.

Zum Fehler:

Error: Cannot find node: versionNumber

Ab Air 2.5 wird die Versionsnummer nicht mehr mit dem Tag “<version>1.0</version>” sondern mit zwei Tags “<versionNumber>1.0.0<versionNumber>” und “<versionLabel>100<versionLabel>” angegeben. Darum muss auch die Datei “application.xml.template” in Zeile 6 entsprechend angpasst werden.

Danke an Philipp N. für den Hinweis und James M. für die Anpassung des Templates für Flash Develop 4 und Air 2.7.

Playing pong with tomatoes and lemons.

Mittwoch, Mai 12th, 2010

Ein kleines Experiment um meine AS3 Farberkennung auch mal sinnvoll einzusetzen ;)
Vorerst nur als Video, aber das fertige Game kommt bald. Fertig: hier geht zum Spiel.

Webcam Performance in Flash

Montag, 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.

.htaccess und .htpasswd Generator mit Flex3

Sonntag, 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];
		}

	}

}