Go Back   kirupaForum > Flash > ActionScript 3

Reply
 
Thread Tools Display Modes
Old 04-23-2008, 12:44 PM   #1
wokawaka
Registered User
MD5 in AS3.0

Hey.
Searching for a fast and simple class to do md5 encryptions in flash AS3.0.

anyone have one laying around?

Thanks!
wokawaka is offline   Reply With Quote

Sponsored Links (Guests Only) - Register | Need Help?

Old 04-23-2008, 03:12 PM   #2
Voetsjoeba
Tu n'es pas un robot!
 
Voetsjoeba's Avatar
Location Belgium, Ghent

Posts 11,559
This literally took me 7 seconds to find: http://gsolo.com/temp/macromedia/fle...yption/MD5.zip

Consider using Google.

__________________
Wait, what?
Voetsjoeba is offline   Reply With Quote
Old 04-23-2008, 03:35 PM   #3
Krilnon
≈ ≠ =
 
Krilnon's Avatar
Location Rochester, NY

Posts 7,691
There is also a relevant project hosted by Google: http://code.google.com/p/as3corelib/
Krilnon is online now   Reply With Quote
Old 04-23-2008, 03:49 PM   #4
wokawaka
Registered User
Quote:
This literally took me 7 seconds to find: http://gsolo.com/temp/macromedia/fle...yption/MD5.zip
Consider using Google.
yeah thats great that you found something on google..
Before i posted here i probably spent 20 minutes or so trying to find a simple md5 class on google. And you know what i found the one you linked to aswell. Whats even better is that it says right on the page you download it from that it dosent work
(heres the original context http://gsolofp.blogspot.com/2006/01/...-and-sha1.html)
So before you make any pretentious claims of how only you can use google the file you linked gives the following errors.

3x times of this error on different lines:
Warning: 1112: Array(x) behaves the same as new Array(x). To cast a value to type Array use the expression x as Array instead of Array(x).

1x
Warning: 3596: Duplicate variable definition.

The original author says (on the same pages as the link):
Quote:
Ya, these scripts were created way back in early betas where a couple of things have since changed with AS3 and FlexBuilder. I may get around to updating them one of these days.
so please don't be so rude...

appreciate the 7 seconds of your day you took to try to help me though...

//Woka
wokawaka is offline   Reply With Quote
Old 04-23-2008, 03:50 PM   #5
movax
Registered User
 
movax's Avatar
A quick testimonial : I used the Gsolo MD5 port on a high profile project recently, and it worked flawlessly. I had to make a couple changes to the code to supress a few warnings, but other than that it was easy as pie.
movax is offline   Reply With Quote
Old 04-23-2008, 03:53 PM   #6
movax
Registered User
 
movax's Avatar
the fixed code, no longer throws warnings in AS3:

Code:
    public class MD5 {
        /* Notes:
         * A conversion of the JavaScript implementation of the RSA Data Security, Inc. MD5 Message
         * Digest Algorithm, as defined in RFC 1321.
         * 
         * Original javascript:
         * Version 2.2-alpha Copyright (C) Paul Johnston 1999 - 2005
         * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
         * Distributed under the BSD License
         * See http://pajhome.org.uk/crypt/md5 for more info.         
          *
          *
          * Flash:
         * Converted to AS3 By Geoffrey Williams
         */
        
    
        
        /*
         * Usage:  Create an MD5 Object, then run encrypt() method on your string.
         */
        
        public static const HEX_FORMAT_LOWERCASE:uint = 0;
        public static const HEX_FORMAT_UPPERCASE:uint = 1;
         
        public static const BASE64_PAD_CHARACTER_DEFAULT_COMPLIANCE:String = "";
        public static const BASE64_PAD_CHARACTER_RFC_COMPLIANCE:String = "=";
         
        public static var hexcase:uint = 0;   /* hex output format. 0 - lowercase; 1 - uppercase        */
        public static var b64pad:String  = ""; /* base-64 pad character. "=" for strict RFC compliance   */
        
        /*
         * This is the main function for MD5 encryption
         * 
         */
        
        public  function encrypt (string:String):String {
            return hex_md5 (string);
        }
        
        /*
         * 
         * Behind-the-scenes functions
         * 
         */

        public static function hex_md5 (string:String):String {
            return rstr2hex (rstr_md5 (str2rstr_utf8 (string)));
        }
        
        public static function b64_md5 (string:String):String {
            return rstr2b64 (rstr_md5 (str2rstr_utf8 (string)));
        }
        
        public static function any_md5 (string:String, encoding:String):String {
            return rstr2any (rstr_md5 (str2rstr_utf8 (string)), encoding);
        }
        public static function hex_hmac_md5 (key:String, data:String):String {
            return rstr2hex (rstr_hmac_md5 (str2rstr_utf8 (key), str2rstr_utf8 (data)));
        }
        public static function b64_hmac_md5 (key:String, data:String):String {
            return rstr2b64 (rstr_hmac_md5 (str2rstr_utf8 (key), str2rstr_utf8 (data)));
        }
        public static function any_hmac_md5 (key:String, data:String, encoding:String):String {
            return rstr2any(rstr_hmac_md5(str2rstr_utf8(key), str2rstr_utf8(data)), encoding);
        }
        
        /*
         * Perform a simple self-test to see if the VM is working
         */
        public static function md5_vm_test ():Boolean {
          return hex_md5 ("abc") == "900150983cd24fb0d6963f7d28e17f72";
        }
        
        /*
         * Calculate the MD5 of a raw string
         */
        public static function rstr_md5 (string:String):String {
          return binl2rstr (binl_md5 (rstr2binl (string), string.length * 8));
        }
        
        /*
         * Calculate the HMAC-MD5, of a key and some data (raw strings)
         */
        public static function rstr_hmac_md5 (key:String, data:String):String {
          var bkey:Array = rstr2binl (key);
          if (bkey.length > 16) bkey = binl_md5 (bkey, key.length * 8);
        
          var ipad:Array = new Array(16), opad:Array = new Array(16);
          for(var i:Number = 0; i < 16; i++) {
            ipad[i] = bkey[i] ^ 0x36363636;
            opad[i] = bkey[i] ^ 0x5C5C5C5C;
          }
        
          var hash:Array = binl_md5 (ipad.concat (rstr2binl (data)), 512 + data.length * 8);
          return binl2rstr (binl_md5 (opad.concat (hash), 512 + 128));
        }
        
        /*
         * Convert a raw string to a hex string
         */
        public static function rstr2hex (input:String):String {
          var hex_tab:String = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
          var output:String = "";
          var x:Number;
          for(var i:Number = 0; i < input.length; i++) {
              x = input.charCodeAt(i);
            output += hex_tab.charAt((x >>> 4) & 0x0F)
                   +  hex_tab.charAt( x        & 0x0F);
          }
          return output;
        }
        
        /*
         * Convert a raw string to a base-64 string
         */
        public static function rstr2b64 (input:String):String {
          var tab:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
          var output:String = "";
          var len:Number = input.length;
          for(var i:Number = 0; i < len; i += 3) {
            var triplet:Number = (input.charCodeAt(i) << 16)
                        | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
                        | (i + 2 < len ? input.charCodeAt(i+2)      : 0);
            for(var j:Number = 0; j < 4; j++) {
              if(i * 8 + j * 6 > input.length * 8) output += b64pad;
              else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);
            }
          }
          return output;
        }
        
        /*
         * Convert a raw string to an arbitrary string encoding
         */
        public static function rstr2any(input:String, encoding:String):String {
          var divisor:Number = encoding.length;
          var remainders:Array = [];
          var i:Number, q:Number, x:Number, quotient:Array;
        
          /* Convert to an array of 16-bit big-endian values, forming the dividend */
          var dividend:Array = new Array(input.length / 2);
          for(i = 0; i < dividend.length; i++) {
            dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
          }
        
          /*
           * Repeatedly perform a long division. The binary array forms the dividend,
           * the length of the encoding is the divisor. Once computed, the quotient
           * forms the dividend for the next step. We stop when the dividend is zero.
           * All remainders are stored for later use.
           */
          while(dividend.length > 0) {
            quotient = [];
            x = 0;
            for(i = 0; i < dividend.length; i++) {
              x = (x << 16) + dividend[i];
              q = Math.floor(x / divisor);
              x -= q * divisor;
              if(quotient.length > 0 || q > 0)
                quotient[quotient.length] = q;
            }
            remainders[remainders.length] = x;
            dividend = quotient;
          }
        
          /* Convert the remainders to the output string */
          var output:String = "";
          for(i = remainders.length - 1; i >= 0; i--)
            output += encoding.charAt (remainders[i]);
        
          return output;
        }
        
        /*
         * Encode a string as utf-8.
         * For efficiency, this assumes the input is valid utf-16.
         */
        public static function str2rstr_utf8 (input:String):String {
          var output:String = "";
          var i:Number = -1;
          var x:Number, y:Number;
        
          while(++i < input.length) {
            /* Decode utf-16 surrogate pairs */
            x = input.charCodeAt(i);
            y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
            if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
              x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
              i++;
            }
        
            /* Encode output as utf-8 */
            if(x <= 0x7F)
              output += String.fromCharCode(x);
            else if(x <= 0x7FF)
              output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),
                                            0x80 | ( x         & 0x3F));
            else if(x <= 0xFFFF)
              output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
                                            0x80 | ((x >>> 6 ) & 0x3F),
                                            0x80 | ( x         & 0x3F));
            else if(x <= 0x1FFFFF)
              output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
                                            0x80 | ((x >>> 12) & 0x3F),
                                            0x80 | ((x >>> 6 ) & 0x3F),
                                            0x80 | ( x         & 0x3F));
          }
          return output;
        }
        
        /*
         * Encode a string as utf-16
         */
        public static function str2rstr_utf16le (input:String):String {
          var output:String = "";
          for(var i:Number = 0; i < input.length; i++)
            output += String.fromCharCode( input.charCodeAt(i)        & 0xFF,
                                          (input.charCodeAt(i) >>> 8) & 0xFF);
          return output;
        }
        
        public static function str2rstr_utf16be (input:String):String {
          var output:String = "";
          for(var i:Number = 0; i < input.length; i++)
            output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,
                                           input.charCodeAt(i)        & 0xFF);
          return output;
        }
        
        /*
         * Convert a raw string to an array of little-endian words
         * Characters >255 have their high-byte silently ignored.
         */
        public static function rstr2binl (input:String):Array {
            var i:Number=0;
          var output:Array = new Array(input.length >> 2);
          for(i = 0; i < output.length; i++)    output[i] = 0;
          for(i = 0; i < input.length * 8; i += 8)    output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (i%32);
          return output;
        }
        
        /*
         * Convert an array of little-endian words to a string
         */
        public static function binl2rstr (input:Array):String {
          var output:String = "";
          for(var i:Number = 0; i < input.length * 32; i += 8)
            output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF);
          return output;
        }
        
        /*
         * Calculate the MD5 of an array of little-endian words, and a bit length.
         */
        public static function binl_md5 (x:Array, len:Number):Array {
          /* append padding */
          x[len >> 5] |= 0x80 << ((len) % 32);
          x[(((len + 64) >>> 9) << 4) + 14] = len;
        
          var a:Number =  1732584193;
          var b:Number = -271733879;
          var c:Number = -1732584194;
          var d:Number =  271733878;
        
          for(var i:Number = 0; i < x.length; i += 16) {
            var olda:Number = a;
            var oldb:Number = b;
            var oldc:Number = c;
            var oldd:Number = d;
        
            a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
            d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
            c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
            b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
            a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
            d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
            c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
            b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
            a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
            d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
            c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
            b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
            a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
            d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
            c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
            b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);
        
            a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
            d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
            c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
            b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
            a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
            d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
            c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
            b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
            a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
            d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
            c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
            b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
            a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
            d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
            c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
            b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
        
            a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
            d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
            c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
            b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
            a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
            d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
            c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
            b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
            a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
            d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
            c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
            b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
            a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
            d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
            c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
            b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
        
            a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
            d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
            c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
            b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
            a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
            d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
            c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
            b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
            a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
            d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
            c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
            b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
            a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
            d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
            c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
            b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
        
            a = safe_add(a, olda);
            b = safe_add(b, oldb);
            c = safe_add(c, oldc);
            d = safe_add(d, oldd);
          }
          return [a, b, c, d];
        }
        
        /*
         * These functions implement the four basic operations the algorithm uses.
         */
        public static function md5_cmn (q:Number, a:Number, b:Number, x:Number, s:Number, t:Number):Number {
          return safe_add (bit_rol (safe_add (safe_add (a, q), safe_add(x, t)), s), b);
        }
        public static function md5_ff (a:Number, b:Number, c:Number, d:Number, x:Number, s:Number, t:Number):Number {
          return md5_cmn ((b & c) | ((~b) & d), a, b, x, s, t);
        }
        public static function md5_gg (a:Number, b:Number, c:Number, d:Number, x:Number, s:Number, t:Number):Number {
          return md5_cmn ((b & d) | (c & (~d)), a, b, x, s, t);
        }
        public static function md5_hh (a:Number, b:Number, c:Number, d:Number, x:Number, s:Number, t:Number):Number {
          return md5_cmn (b ^ c ^ d, a, b, x, s, t);
        }
        public static function md5_ii (a:Number, b:Number, c:Number, d:Number, x:Number, s:Number, t:Number):Number {
          return md5_cmn (c ^ (b | (~d)), a, b, x, s, t);
        }
        
        /*
         * Add integers, wrapping at 2^32. This uses 16-bit operations internally
         * to work around bugs in some JS interpreters.
         */
        public static function safe_add (x:Number, y:Number):Number {
          var lsw:Number = (x & 0xFFFF) + (y & 0xFFFF);
          var msw:Number = (x >> 16) + (y >> 16) + (lsw >> 16);
          return (msw << 16) | (lsw & 0xFFFF);
        }
        
        /*
         * Bitwise rotate a 32-bit number to the left.
         */
        public static function bit_rol (num:Number, cnt:Number):Number {
          return (num << cnt) | (num >>> (32 - cnt));
        }
                
    }
movax is offline   Reply With Quote
Old 04-23-2008, 03:57 PM   #7
wokawaka
Registered User
Quote:
Originally Posted by Krilnon View Post
There is also a relevant project hosted by Google: http://code.google.com/p/as3corelib/
thanks, ripped out the classes i needed and got it working perfectly.

Attached them to this post.

all you need to do is change to the appropriate package locations
import it
and call
MD5.hash(String)

Thanks
Attached Files
File Type: zip MD5_encryption.zip (4.3 KB, 298 views)
wokawaka is offline   Reply With Quote
Old 04-23-2008, 04:00 PM   #8
wokawaka
Registered User
Quote:
Originally Posted by movax View Post
the fixed code, no longer throws warnings in AS3:
ill try that out to and see which i like better..
Might turn out yours is faster, seems alot cleaner atleast.

Thanks =D
wokawaka is offline   Reply With Quote
Old 04-23-2008, 04:02 PM   #9
Voetsjoeba
Tu n'es pas un robot!
 
Voetsjoeba's Avatar
Location Belgium, Ghent

Posts 11,559
My bad, sorry for coming off as an arrogant prick. That Google Code link was my second search result though

__________________
Wait, what?
Voetsjoeba is offline   Reply With Quote
Old 05-15-2008, 06:52 PM   #10
funface
Registered User
 
funface's Avatar
Location Orlando, Fl

Posts 6
Has anyone had any trouble with these MD5 AS3 scripts outputting different hashes than the md5() function in php?

I've read about issues with utf-7 vs utf-8 encoding, but so far I haven't been able to make any adjustments to get the two functions to output the same hash. even on simple strings such as "hello"

__________________
!(>_<)!
www.funfacegames.com
funface is offline   Reply With Quote
Old 05-21-2008, 07:59 AM   #11
babercan
Registered User
I have the same character problem.For example MD5 of the word "hıdır" is different in flash & php. How can i solve this problem?
babercan is offline   Reply With Quote
Old 08-29-2008, 03:46 AM   #12
giechika
Registered User
Authorize.net HMAC-MD5-128 bit encryption

Authorize.net HMAC-MD5-128
This is the only thing that worked for me.


Coding with Flex 3.0


Kudos to the folks who put this together.


George


Quote:
Originally Posted by wokawaka View Post
thanks, ripped out the classes i needed and got it working perfectly.

Attached them to this post.

all you need to do is change to the appropriate package locations
import it
and call
MD5.hash(String)

Thanks
giechika is offline   Reply With Quote
Old 08-29-2008, 06:00 AM   #13
bonnieraymond
Registered User
hey I'm curious about MD5, does it encrypt only? no decryption?
bonnieraymond is offline   Reply With Quote
Old 08-29-2008, 07:34 AM   #14
canazza
Registered User
Good ol' wikipedia
http://en.wikipedia.org/wiki/MD5

When you convert something to an MD5 string it can't be decrypted, however, more than one thing may be encrypted to the same MD5 string, but it's statistically unlikely (see http://en.wikipedia.org/wiki/Birthday_attack )
canazza is offline   Reply With Quote
Old 08-29-2008, 01:50 PM   #15
bonnieraymond
Registered User
Quote:
Originally Posted by canazza View Post
When you convert something to an MD5 string it can't be decrypted
I'm curious again, it can't be decrypted, then what can we do with the encrypted string?
bonnieraymond is offline   Reply With Quote
Reply


Currently Active Users Viewing This Thread: 2 (0 members and 2 guests)
 
Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 10:22 AM.

SHARE:

SUPPORTERS:

cdn
content delivery network (cdn)

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd. Copyright 2010 - kirupa.com Copyright 2010 - kirupa.com