2006年07月13日
ActionScript2.0でMD5
ActionScript2.0でMD5を得たいと思い、標準クラスをチェックしたけどなかったので、検索してみたら、MD5を得る関数が見つかりました。
MD5 in ActionScript:
http://www.nurs.or.jp/~b3/scripts/md5as/
ただ、せっかくなのでASのクラスとして使いたかったので、上のソースをクラスにしてみました。
以下のような感じで使えます。
---(
hash_str = new MD5("strstr...").value;
trace(hash_str);
---)
関数の場合と違って、include したりしなくても良いのが唯一のメリットです。
それで以下のプログラムをMD5.as という名前で保存しておきます。
---(
//----------------------------------------------------------------------
// MD5 Message-Digest
// RFC1321
//----------------------------------------------------------------------
// (クラス化 ) http://kujirahand.com
// (オリジナル) http://www.nurs.or.jp/~b3/scripts/md5as/
//----------------------------------------------------------------------
// USES:
// hash = new MD5(str).value;
// hash = new MD5(str).toString();
//----------------------------------------------------------------------
class MD5
{
var g_dataArray:Array;
function MD5(seed) {
g_dataArray = MD5_hash(seed);
}
function toString()
{
var i, out, c;
out = "";
for ( i = 0; i < 16; i++ ) {
c = g_dataArray[i];
out += "0123456789abcdef".charAt((c >> 4) & 0xf);
out += "0123456789abcdef".charAt(c & 0xf);
}
return out;
}
function get value():String
{
return this.toString();
}
var MD5_T = [
0x00000000, 0xd76aa478, 0xe8c7b756, 0x242070db,
0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613,
0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1,
0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e,
0x49b40821, 0xf61e2562, 0xc040b340, 0x265e5a51,
0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681,
0xe7d3fbc8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87,
0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9,
0x8d2a4c8a, 0xfffa3942, 0x8771f681, 0x6d9d6122,
0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60,
0xbebfbc70, 0x289b7ec6, 0xeaa127fa, 0xd4ef3085,
0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8,
0xc4ac5665, 0xf4292244, 0x432aff97, 0xab9423a7,
0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d,
0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314,
0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb,
0xeb86d391
];
var MD5_round1 = [
[0, 7, 1], [1, 12, 2], [2, 17, 3], [3, 22, 4],
[4, 7, 5], [5, 12, 6], [6, 17, 7], [7, 22, 8],
[8, 7, 9], [9, 12, 10], [10, 17, 11], [11, 22, 12],
[12, 7, 13], [13, 12, 14], [14, 17, 15], [15, 22, 16]
];
var MD5_round2 = [
[1, 5, 17], [6, 9, 18], [11, 14, 19], [0, 20, 20],
[5, 5, 21], [10, 9, 22], [15, 14, 23], [4, 20, 24],
[9, 5, 25], [14, 9, 26], [3, 14, 27], [8, 20, 28],
[13, 5, 29], [2, 9, 30], [7, 14, 31], [12, 20, 32]
];
var MD5_round3 = [
[5, 4, 33], [8, 11, 34], [11, 16, 35], [14, 23, 36],
[1, 4, 37], [4, 11, 38], [7, 16, 39], [10, 23, 40],
[13, 4, 41], [0, 11, 42], [3, 16, 43], [6, 23, 44],
[9, 4, 45], [12, 11, 46], [15, 16, 47], [2, 23, 48]
];
var MD5_round4 = [
[0, 6, 49], [7, 10, 50], [14, 15, 51], [5, 21, 52],
[12, 6, 53], [3, 10, 54], [10, 15, 55], [1, 21, 56],
[8, 6, 57], [15, 10, 58], [6, 15, 59], [13, 21, 60],
[4, 6, 61], [11, 10, 62], [2, 15, 63], [9, 21, 64]
];
var MD5_round = new Array(
new Array(MD5_F, MD5_round1),
new Array(MD5_G, MD5_round2),
new Array(MD5_H, MD5_round3),
new Array(MD5_I, MD5_round4)
);
function MD5_F(x, y, z) {
return (x & y) | (~x & z);
}
function MD5_G(x, y, z) {
return (x & z) | (y & ~z);
}
function MD5_H(x, y, z) {
return x ^ y ^ z;
}
function MD5_I(x, y, z) {
return y ^ (x | ~z);
}
function MD5_pack(n32) {
return new Array(n32 & 0xff, (n32 >>> 8) & 0xff, (n32 >>> 16) & 0xff, (n32 >>> 24) & 0xff);
}
function MD5_hash(seed) {
var f, r, tmp;
var i, j, k;
var state = new Array(0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476);
var abcd = new Array(0, 1, 2, 3);
var x = new Array(16);
var s = new Array(4);
var dataArray = new Array();
var currentChar = 0;
//
// UCS2 or 4 -> UTF-8
// http://www.unicode.org/versions/corrigendum1.html
//
for (i = 0; i < seed.length; i++) {
j = seed.charCodeAt(i);
if ( j <= 0x7F ) {
dataArray[currentChar++] = j;
} else if ( j <= 0x7FF ) {
dataArray[currentChar++] = ((j >> 6) & 0x3F) | 0xC0;
dataArray[currentChar++] = ( j & 0x3F) | 0x80;
} else if ( j <= 0xFFFF ) {
dataArray[currentChar++] = ((j >> 12) & 0x0F) | 0xE0;
dataArray[currentChar++] = ((j >> 6) & 0x3F) | 0x80;
dataArray[currentChar++] = ( j & 0x3F) | 0x80;
} else {
dataArray[currentChar++] = ((j >> 18) & 0x07) | 0xF0;
dataArray[currentChar++] = ((j >> 12) & 0x3F) | 0x80;
dataArray[currentChar++] = ((j >> 6) & 0x3F) | 0x80;
dataArray[currentChar++] = ( j & 0x3F) | 0x80;
}
}
var len = dataArray.length;
var index = len & 0x3f;
var padLen = ( index < 56 )? 56 - index : 120 - index;
if ( padLen > 0 ) {
dataArray[currentChar++] = 128;
for (i = 0; i < padLen-1; i++, currentChar++) {
dataArray[currentChar] = 0;
}
}
dataArray = dataArray.concat(MD5_pack(len * 8), MD5_pack(0));
len += padLen + 8;
for ( k = 0; k < len; k += 64 ) {
for ( i = 0, j = k; i < 16; i++, j += 4 ) {
x[i] = dataArray[j] | (dataArray[j+1] << 8) | (dataArray[j+2] << 16) | (dataArray[j+3] << 24);
}
for ( i = 0; i < 4; i++ ) {
s[i] = state[i];
}
for ( i = 0; i < 4; i++ ) {
f = MD5_round[i][0];
r = MD5_round[i][1];
for ( j = 0; j < 16; j++ ) {
MD5_apply_round(x, s, f, abcd, r[j]);
tmp = abcd[0];
abcd[0] = abcd[3];
abcd[3] = abcd[2];
abcd[2] = abcd[1];
abcd[1] = tmp;
}
}
for ( i = 0; i < 4; i++ ) {
state[i] += s[i];
state[i] = MD5_number(state[i]);
}
}
dataArray = new Array();
return dataArray.concat(MD5_pack(state[0]), MD5_pack(state[1]), MD5_pack(state[2]), MD5_pack(state[3]));
}
function MD5_number(n) {
while ( n < 0 ) {
n += 4294967296;
}
while ( n > 4294967295 ) {
n -= 4294967296;
}
return n;
}
function MD5_apply_round(x, s, f, abcd, r) {
var a, b, c, d;
var kk, ss, ii;
var t, u;
a = abcd[0];
b = abcd[1];
c = abcd[2];
d = abcd[3];
kk = r[0];
ss = r[1];
ii = r[2];
u = f(s[b], s[c], s[d]);
t = s[a] + u + x[kk] + MD5_T[ii];
t = MD5_number(t);
t = (t << ss) | (t >>> (32 - ss));
t += s[b];
s[a] = MD5_number(t);
}
}
---)
トラックバック
このエントリーのトラックバックURL:
http://aoi-project.com/presents/mt/mt-tb.cgi/18