-
Notifications
You must be signed in to change notification settings - Fork 1
/
crypt.js
98 lines (84 loc) · 2.9 KB
/
crypt.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// Generated by CoffeeScript 2.5.1
(function() {
// crypt.coffee - EpisoPassでの文字置換
// Toshiyuki Masui @ Pitecan.com
// Last Modified: 2015/10/31 12:20:30
var charkind, charset, crypt_char, md5, utf2bytestr;
md5 = typeof require === 'undefined' ? exports : require('./md5.js');
// 文字種ごとに置換を行なうためのテーブル
charset = ['abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', '0123456789', '-', '~!@#$%^&*()_=+[{]}|;:.,#?', ' ', "\"'/<>\\`"];
charkind = function(c) {
var ind, ref;
ind = null;
(function() {
var results = [];
for (var k = 0, ref = charset.length; 0 <= ref ? k < ref : k > ref; 0 <= ref ? k++ : k--){ results.push(k); }
return results;
}).apply(this).forEach(function(i) {
if (charset[i].indexOf(c) >= 0) {
return ind = i;
}
});
return ind;
};
// crypt_char(crypt_char(c,n),n) == c になるような文字置換関数
crypt_char = function(c, n) {
var chars, cind, ind, kind, len;
kind = charkind(c);
chars = charset[kind];
cind = chars.indexOf(c);
len = chars.length;
ind = (n - cind + len) % len;
return chars[ind];
};
// UTF8文字列をバイト文字列(?)に変換
// (MD5_hexhashがUTF8データをうまく扱えないため)
utf2bytestr = function(text) {
var ref, result;
result = "";
if (text === null) {
return result;
}
(function() {
var results = [];
for (var k = 0, ref = text.length; 0 <= ref ? k < ref : k > ref; 0 <= ref ? k++ : k--){ results.push(k); }
return results;
}).apply(this).forEach(function(i) {
var c;
c = text.charCodeAt(i);
if (c <= 0x7f) {
return result += String.fromCharCode(c);
} else {
if (c <= 0x07ff) {
result += String.fromCharCode(((c >> 6) & 0x1F) | 0xC0);
return result += String.fromCharCode((c & 0x3F) | 0x80);
} else {
result += String.fromCharCode(((c >> 12) & 0x0F) | 0xE0);
result += String.fromCharCode(((c >> 6) & 0x3F) | 0x80);
return result += String.fromCharCode((c & 0x3F) | 0x80);
}
}
});
return result;
};
// crypt(crypt(s,data),data) == s になる
exports.crypt = function(str, seeddata) {
var hash, ref, res;
// seeddataのMD5の32バイト値の一部を取り出して数値化し、
// その値にもとづいて文字置換を行なう
hash = md5.MD5_hexhash(utf2bytestr(seeddata));
res = '';
(function() {
var results = [];
for (var k = 0, ref = str.length; 0 <= ref ? k < ref : k > ref; 0 <= ref ? k++ : k--){ results.push(k); }
return results;
}).apply(this).forEach(function(i) {
var j, n, s;
j = i % 8;
s = hash.substring(j * 4, j * 4 + 4);
n = parseInt(s, 16);
return res += crypt_char(str[i], n + i);
});
return res;
};
}).call(this);