javascript实现des解密加密全过程


Posted in Javascript onApril 03, 2014
//Paul Tero, July 2001 
//http://www.tero.co.uk/des/ 
// 
//Optimised for performance with large blocks by Michael Hayworth, November 2001 
//http://www.netdealing.com 
// 
//THIS SOFTWARE IS PROVIDED "AS IS" AND 
//ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
//IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
//ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 
//FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
//DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
//OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
//HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
//OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
//SUCH DAMAGE. //des 
//this takes the key, the message, and whether to encrypt or decrypt 
function des (key, message, encrypt, mode, iv, padding) { 
//declaring this locally speeds things up a bit 
var spfunction1 = new Array (0x1010400,0,0x10000,0x1010404,0x1010004,0x10404,0x4,0x10000,0x400,0x1010400,0x1010404,0x400,0x1000404,0x1010004,0x1000000,0x4,0x404,0x1000400,0x1000400,0x10400,0x10400,0x1010000,0x1010000,0x1000404,0x10004,0x1000004,0x1000004,0x10004,0,0x404,0x10404,0x1000000,0x10000,0x1010404,0x4,0x1010000,0x1010400,0x1000000,0x1000000,0x400,0x1010004,0x10000,0x10400,0x1000004,0x400,0x4,0x1000404,0x10404,0x1010404,0x10004,0x1010000,0x1000404,0x1000004,0x404,0x10404,0x1010400,0x404,0x1000400,0x1000400,0,0x10004,0x10400,0,0x1010004); 
var spfunction2 = new Array (-0x7fef7fe0,-0x7fff8000,0x8000,0x108020,0x100000,0x20,-0x7fefffe0,-0x7fff7fe0,-0x7fffffe0,-0x7fef7fe0,-0x7fef8000,-0x80000000,-0x7fff8000,0x100000,0x20,-0x7fefffe0,0x108000,0x100020,-0x7fff7fe0,0,-0x80000000,0x8000,0x108020,-0x7ff00000,0x100020,-0x7fffffe0,0,0x108000,0x8020,-0x7fef8000,-0x7ff00000,0x8020,0,0x108020,-0x7fefffe0,0x100000,-0x7fff7fe0,-0x7ff00000,-0x7fef8000,0x8000,-0x7ff00000,-0x7fff8000,0x20,-0x7fef7fe0,0x108020,0x20,0x8000,-0x80000000,0x8020,-0x7fef8000,0x100000,-0x7fffffe0,0x100020,-0x7fff7fe0,-0x7fffffe0,0x100020,0x108000,0,-0x7fff8000,0x8020,-0x80000000,-0x7fefffe0,-0x7fef7fe0,0x108000); 
var spfunction3 = new Array (0x208,0x8020200,0,0x8020008,0x8000200,0,0x20208,0x8000200,0x20008,0x8000008,0x8000008,0x20000,0x8020208,0x20008,0x8020000,0x208,0x8000000,0x8,0x8020200,0x200,0x20200,0x8020000,0x8020008,0x20208,0x8000208,0x20200,0x20000,0x8000208,0x8,0x8020208,0x200,0x8000000,0x8020200,0x8000000,0x20008,0x208,0x20000,0x8020200,0x8000200,0,0x200,0x20008,0x8020208,0x8000200,0x8000008,0x200,0,0x8020008,0x8000208,0x20000,0x8000000,0x8020208,0x8,0x20208,0x20200,0x8000008,0x8020000,0x8000208,0x208,0x8020000,0x20208,0x8,0x8020008,0x20200); 
var spfunction4 = new Array (0x802001,0x2081,0x2081,0x80,0x802080,0x800081,0x800001,0x2001,0,0x802000,0x802000,0x802081,0x81,0,0x800080,0x800001,0x1,0x2000,0x800000,0x802001,0x80,0x800000,0x2001,0x2080,0x800081,0x1,0x2080,0x800080,0x2000,0x802080,0x802081,0x81,0x800080,0x800001,0x802000,0x802081,0x81,0,0,0x802000,0x2080,0x800080,0x800081,0x1,0x802001,0x2081,0x2081,0x80,0x802081,0x81,0x1,0x2000,0x800001,0x2001,0x802080,0x800081,0x2001,0x2080,0x800000,0x802001,0x80,0x800000,0x2000,0x802080); 
var spfunction5 = new Array (0x100,0x2080100,0x2080000,0x42000100,0x80000,0x100,0x40000000,0x2080000,0x40080100,0x80000,0x2000100,0x40080100,0x42000100,0x42080000,0x80100,0x40000000,0x2000000,0x40080000,0x40080000,0,0x40000100,0x42080100,0x42080100,0x2000100,0x42080000,0x40000100,0,0x42000000,0x2080100,0x2000000,0x42000000,0x80100,0x80000,0x42000100,0x100,0x2000000,0x40000000,0x2080000,0x42000100,0x40080100,0x2000100,0x40000000,0x42080000,0x2080100,0x40080100,0x100,0x2000000,0x42080000,0x42080100,0x80100,0x42000000,0x42080100,0x2080000,0,0x40080000,0x42000000,0x80100,0x2000100,0x40000100,0x80000,0,0x40080000,0x2080100,0x40000100); 
var spfunction6 = new Array (0x20000010,0x20400000,0x4000,0x20404010,0x20400000,0x10,0x20404010,0x400000,0x20004000,0x404010,0x400000,0x20000010,0x400010,0x20004000,0x20000000,0x4010,0,0x400010,0x20004010,0x4000,0x404000,0x20004010,0x10,0x20400010,0x20400010,0,0x404010,0x20404000,0x4010,0x404000,0x20404000,0x20000000,0x20004000,0x10,0x20400010,0x404000,0x20404010,0x400000,0x4010,0x20000010,0x400000,0x20004000,0x20000000,0x4010,0x20000010,0x20404010,0x404000,0x20400000,0x404010,0x20404000,0,0x20400010,0x10,0x4000,0x20400000,0x404010,0x4000,0x400010,0x20004010,0,0x20404000,0x20000000,0x400010,0x20004010); 
var spfunction7 = new Array (0x200000,0x4200002,0x4000802,0,0x800,0x4000802,0x200802,0x4200800,0x4200802,0x200000,0,0x4000002,0x2,0x4000000,0x4200002,0x802,0x4000800,0x200802,0x200002,0x4000800,0x4000002,0x4200000,0x4200800,0x200002,0x4200000,0x800,0x802,0x4200802,0x200800,0x2,0x4000000,0x200800,0x4000000,0x200800,0x200000,0x4000802,0x4000802,0x4200002,0x4200002,0x2,0x200002,0x4000000,0x4000800,0x200000,0x4200800,0x802,0x200802,0x4200800,0x802,0x4000002,0x4200802,0x4200000,0x200800,0,0x2,0x4200802,0,0x200802,0x4200000,0x800,0x4000002,0x4000800,0x800,0x200002); 
var spfunction8 = new Array (0x10001040,0x1000,0x40000,0x10041040,0x10000000,0x10001040,0x40,0x10000000,0x40040,0x10040000,0x10041040,0x41000,0x10041000,0x41040,0x1000,0x40,0x10040000,0x10000040,0x10001000,0x1040,0x41000,0x40040,0x10040040,0x10041000,0x1040,0,0,0x10040040,0x10000040,0x10001000,0x41040,0x40000,0x41040,0x40000,0x10041000,0x1000,0x40,0x10040040,0x1000,0x41040,0x10001000,0x40,0x10000040,0x10040000,0x10040040,0x10000000,0x40000,0x10001040,0,0x10041040,0x40040,0x10000040,0x10040000,0x10001000,0x10001040,0,0x10041040,0x41000,0x41000,0x1040,0x1040,0x40040,0x10000000,0x10041000); 
//create the 16 or 48 subkeys we will need 
var keys = des_createKeys (key); 
var m=0, i, j, temp, temp2, right1, right2, left, right, looping; 
var cbcleft, cbcleft2, cbcright, cbcright2 
var endloop, loopinc; 
var len = message.length; 
var chunk = 0; 
//set up the loops for single and triple des 
var iterations = keys.length == 32 ? 3 : 9; //single or triple des 
if (iterations == 3) {looping = encrypt ? new Array (0, 32, 2) : new Array (30, -2, -2);} 
else {looping = encrypt ? new Array (0, 32, 2, 62, 30, -2, 64, 96, 2) : new Array (94, 62, -2, 32, 64, 2, 30, -2, -2);} 
//pad the message depending on the padding parameter 
if (padding == 2) message += " "; //pad the message with spaces 
else if (padding == 1) {temp = 8-(len%8); message += String.fromCharCode (temp,temp,temp,temp,temp,temp,temp,temp); if (temp==8) len+=8;} //PKCS7 padding 
else if (!padding) message += "\0\0\0\0\0\0\0\0"; //pad the message out with null bytes 
//store the result here 
result = ""; 
tempresult = ""; 
if (mode == 1) { //CBC mode 
cbcleft = (iv.charCodeAt(m++) << 24) | (iv.charCodeAt(m++) << 16) | (iv.charCodeAt(m++) << 8) | iv.charCodeAt(m++); 
cbcright = (iv.charCodeAt(m++) << 24) | (iv.charCodeAt(m++) << 16) | (iv.charCodeAt(m++) << 8) | iv.charCodeAt(m++); 
m=0; 
} 
//loop through each 64 bit chunk of the message 
while (m < len) { 
left = (message.charCodeAt(m++) << 24) | (message.charCodeAt(m++) << 16) | (message.charCodeAt(m++) << 8) | message.charCodeAt(m++); 
right = (message.charCodeAt(m++) << 24) | (message.charCodeAt(m++) << 16) | (message.charCodeAt(m++) << 8) | message.charCodeAt(m++); 
//for Cipher Block Chaining mode, xor the message with the previous result 
if (mode == 1) {if (encrypt) {left ^= cbcleft; right ^= cbcright;} else {cbcleft2 = cbcleft; cbcright2 = cbcright; cbcleft = left; cbcright = right;}} 
//first each 64 but chunk of the message must be permuted according to IP 
temp = ((left >>> 4) ^ right) & 0x0f0f0f0f; right ^= temp; left ^= (temp << 4); 
temp = ((left >>> 16) ^ right) & 0x0000ffff; right ^= temp; left ^= (temp << 16); 
temp = ((right >>> 2) ^ left) & 0x33333333; left ^= temp; right ^= (temp << 2); 
temp = ((right >>> 8) ^ left) & 0x00ff00ff; left ^= temp; right ^= (temp << 8); 
temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1); 
left = ((left << 1) | (left >>> 31)); 
right = ((right << 1) | (right >>> 31)); 
//do this either 1 or 3 times for each chunk of the message 
for (j=0; j<iterations; j+=3) { 
endloop = looping[j+1]; 
loopinc = looping[j+2]; 
//now go through and perform the encryption or decryption 
for (i=looping[j]; i!=endloop; i+=loopinc) { //for efficiency 
right1 = right ^ keys[i]; 
right2 = ((right >>> 4) | (right << 28)) ^ keys[i+1]; 
//the result is attained by passing these bytes through the S selection functions 
temp = left; 
left = right; 
right = temp ^ (spfunction2[(right1 >>> 24) & 0x3f] | spfunction4[(right1 >>> 16) & 0x3f] 
| spfunction6[(right1 >>> 8) & 0x3f] | spfunction8[right1 & 0x3f] 
| spfunction1[(right2 >>> 24) & 0x3f] | spfunction3[(right2 >>> 16) & 0x3f] 
| spfunction5[(right2 >>> 8) & 0x3f] | spfunction7[right2 & 0x3f]); 
} 
temp = left; left = right; right = temp; //unreverse left and right 
} //for either 1 or 3 iterations 
//move then each one bit to the right 
left = ((left >>> 1) | (left << 31)); 
right = ((right >>> 1) | (right << 31)); 
//now perform IP-1, which is IP in the opposite direction 
temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1); 
temp = ((right >>> 8) ^ left) & 0x00ff00ff; left ^= temp; right ^= (temp << 8); 
temp = ((right >>> 2) ^ left) & 0x33333333; left ^= temp; right ^= (temp << 2); 
temp = ((left >>> 16) ^ right) & 0x0000ffff; right ^= temp; left ^= (temp << 16); 
temp = ((left >>> 4) ^ right) & 0x0f0f0f0f; right ^= temp; left ^= (temp << 4); 
//for Cipher Block Chaining mode, xor the message with the previous result 
if (mode == 1) {if (encrypt) {cbcleft = left; cbcright = right;} else {left ^= cbcleft2; right ^= cbcright2;}} 
tempresult += String.fromCharCode ((left>>>24), ((left>>>16) & 0xff), ((left>>>8) & 0xff), (left & 0xff), (right>>>24), ((right>>>16) & 0xff), ((right>>>8) & 0xff), (right & 0xff)); 
chunk += 8; 
if (chunk == 512) {result += tempresult; tempresult = ""; chunk = 0;} 
} //for every 8 characters, or 64 bits in the message 
//return the result as an array 
return result + tempresult; 
} //end of des 

//des_createKeys 
//this takes as input a 64 bit key (even though only 56 bits are used) 
//as an array of 2 integers, and returns 16 48 bit keys 
function des_createKeys (key) { 
//declaring this locally speeds things up a bit 
pc2bytes0 = new Array (0,0x4,0x20000000,0x20000004,0x10000,0x10004,0x20010000,0x20010004,0x200,0x204,0x20000200,0x20000204,0x10200,0x10204,0x20010200,0x20010204); 
pc2bytes1 = new Array (0,0x1,0x100000,0x100001,0x4000000,0x4000001,0x4100000,0x4100001,0x100,0x101,0x100100,0x100101,0x4000100,0x4000101,0x4100100,0x4100101); 
pc2bytes2 = new Array (0,0x8,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808,0,0x8,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808); 
pc2bytes3 = new Array (0,0x200000,0x8000000,0x8200000,0x2000,0x202000,0x8002000,0x8202000,0x20000,0x220000,0x8020000,0x8220000,0x22000,0x222000,0x8022000,0x8222000); 
pc2bytes4 = new Array (0,0x40000,0x10,0x40010,0,0x40000,0x10,0x40010,0x1000,0x41000,0x1010,0x41010,0x1000,0x41000,0x1010,0x41010); 
pc2bytes5 = new Array (0,0x400,0x20,0x420,0,0x400,0x20,0x420,0x2000000,0x2000400,0x2000020,0x2000420,0x2000000,0x2000400,0x2000020,0x2000420); 
pc2bytes6 = new Array (0,0x10000000,0x80000,0x10080000,0x2,0x10000002,0x80002,0x10080002,0,0x10000000,0x80000,0x10080000,0x2,0x10000002,0x80002,0x10080002); 
pc2bytes7 = new Array (0,0x10000,0x800,0x10800,0x20000000,0x20010000,0x20000800,0x20010800,0x20000,0x30000,0x20800,0x30800,0x20020000,0x20030000,0x20020800,0x20030800); 
pc2bytes8 = new Array (0,0x40000,0,0x40000,0x2,0x40002,0x2,0x40002,0x2000000,0x2040000,0x2000000,0x2040000,0x2000002,0x2040002,0x2000002,0x2040002); 
pc2bytes9 = new Array (0,0x10000000,0x8,0x10000008,0,0x10000000,0x8,0x10000008,0x400,0x10000400,0x408,0x10000408,0x400,0x10000400,0x408,0x10000408); 
pc2bytes10 = new Array (0,0x20,0,0x20,0x100000,0x100020,0x100000,0x100020,0x2000,0x2020,0x2000,0x2020,0x102000,0x102020,0x102000,0x102020); 
pc2bytes11 = new Array (0,0x1000000,0x200,0x1000200,0x200000,0x1200000,0x200200,0x1200200,0x4000000,0x5000000,0x4000200,0x5000200,0x4200000,0x5200000,0x4200200,0x5200200); 
pc2bytes12 = new Array (0,0x1000,0x8000000,0x8001000,0x80000,0x81000,0x8080000,0x8081000,0x10,0x1010,0x8000010,0x8001010,0x80010,0x81010,0x8080010,0x8081010); 
pc2bytes13 = new Array (0,0x4,0x100,0x104,0,0x4,0x100,0x104,0x1,0x5,0x101,0x105,0x1,0x5,0x101,0x105); 
//how many iterations (1 for des, 3 for triple des) 
var iterations = key.length > 8 ? 3 : 1; //changed by Paul 16/6/2007 to use Triple DES for 9+ byte keys 
//stores the return keys 
var keys = new Array (32 * iterations); 
//now define the left shifts which need to be done 
var shifts = new Array (0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0); 
//other variables 
var lefttemp, righttemp, m=0, n=0, temp; 
for (var j=0; j<iterations; j++) { //either 1 or 3 iterations 
left = (key.charCodeAt(m++) << 24) | (key.charCodeAt(m++) << 16) | (key.charCodeAt(m++) << 8) | key.charCodeAt(m++); 
right = (key.charCodeAt(m++) << 24) | (key.charCodeAt(m++) << 16) | (key.charCodeAt(m++) << 8) | key.charCodeAt(m++); 
temp = ((left >>> 4) ^ right) & 0x0f0f0f0f; right ^= temp; left ^= (temp << 4); 
temp = ((right >>> -16) ^ left) & 0x0000ffff; left ^= temp; right ^= (temp << -16); 
temp = ((left >>> 2) ^ right) & 0x33333333; right ^= temp; left ^= (temp << 2); 
temp = ((right >>> -16) ^ left) & 0x0000ffff; left ^= temp; right ^= (temp << -16); 
temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1); 
temp = ((right >>> 8) ^ left) & 0x00ff00ff; left ^= temp; right ^= (temp << 8); 
temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1); 
//the right side needs to be shifted and to get the last four bits of the left side 
temp = (left << 8) | ((right >>> 20) & 0x000000f0); 
//left needs to be put upside down 
left = (right << 24) | ((right << 8) & 0xff0000) | ((right >>> 8) & 0xff00) | ((right >>> 24) & 0xf0); 
right = temp; 
//now go through and perform these shifts on the left and right keys 
for (var i=0; i < shifts.length; i++) { 
//shift the keys either one or two bits to the left 
if (shifts[i]) {left = (left << 2) | (left >>> 26); right = (right << 2) | (right >>> 26);} 
else {left = (left << 1) | (left >>> 27); right = (right << 1) | (right >>> 27);} 
left &= -0xf; right &= -0xf; 
//now apply PC-2, in such a way that E is easier when encrypting or decrypting 
//this conversion will look like PC-2 except only the last 6 bits of each byte are used 
//rather than 48 consecutive bits and the order of lines will be according to 
//how the S selection functions will be applied: S2, S4, S6, S8, S1, S3, S5, S7 
lefttemp = pc2bytes0[left >>> 28] | pc2bytes1[(left >>> 24) & 0xf] 
| pc2bytes2[(left >>> 20) & 0xf] | pc2bytes3[(left >>> 16) & 0xf] 
| pc2bytes4[(left >>> 12) & 0xf] | pc2bytes5[(left >>> 8) & 0xf] 
| pc2bytes6[(left >>> 4) & 0xf]; 
righttemp = pc2bytes7[right >>> 28] | pc2bytes8[(right >>> 24) & 0xf] 
| pc2bytes9[(right >>> 20) & 0xf] | pc2bytes10[(right >>> 16) & 0xf] 
| pc2bytes11[(right >>> 12) & 0xf] | pc2bytes12[(right >>> 8) & 0xf] 
| pc2bytes13[(right >>> 4) & 0xf]; 
temp = ((righttemp >>> 16) ^ lefttemp) & 0x0000ffff; 
keys[n++] = lefttemp ^ temp; keys[n++] = righttemp ^ (temp << 16); 
} 
} //for each iterations 
//return the keys we've created 
return keys; 
} //end of des_createKeys 

////////////////////////////// TEST ////////////////////////////// 
function stringToHex (s) { 
var r = "0x"; 
var hexes = new Array ("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"); 
for (var i=0; i<s.length; i++) {r += hexes [s.charCodeAt(i) >> 4] + hexes [s.charCodeAt(i) & 0xf];} 
return r; 
} 
function hexToString (h) { 
var r = ""; 
for (var i= (h.substr(0, 2)=="0x")?2:0; i<h.length; i+=2) {r += String.fromCharCode (parseInt (h.substr (i, 2), 16));} 
return r; 
} 
var key = "this is a 24 byte key !!"; 
var message = "This is a test message"; 
var ciphertext = des (key, message, 1, 0); 
document.writeln ("DES Test: " + stringToHex (ciphertext));
Javascript 相关文章推荐
JavaScript 模仿vbs中的 DateAdd() 函数的代码
Aug 13 Javascript
Jquery中删除元素的实现代码
Dec 29 Javascript
DWZ table的原生分页浅谈
Mar 01 Javascript
jQuery使用$.ajax进行即时验证的方法
Dec 08 Javascript
原生js页面滚动延迟加载图片
Dec 20 Javascript
js下将金额数字每三位一逗号分隔
Feb 19 Javascript
jquery实现点击弹出可放大居中及关闭的对话框(附demo源码下载)
May 10 Javascript
Bootstrap3学习笔记(三)之表格
May 20 Javascript
详解微信小程序开发之城市选择器 城市切换
Jan 17 Javascript
Vue.js实现分页查询功能
Nov 15 Javascript
angularjs自定义过滤器demo示例
Aug 24 Javascript
JavaScript组合设计模式--改进引入案例分析
May 23 Javascript
无刷新预览所选择的图片示例代码
Apr 02 #Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
Apr 02 #Javascript
jquery跟js初始化加载的多种方法及区别介绍
Apr 02 #Javascript
jquery中子元素和后代元素的区别示例介绍
Apr 02 #Javascript
js 日期比较相关天数代码
Apr 02 #Javascript
你未必知道的JavaScript和CSS交互的5种方法
Apr 02 #Javascript
网页广告中JS代码的信息监听示例
Apr 02 #Javascript
You might like
FCKeditor添加自定义按钮
2008/03/27 PHP
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
yii框架搜索分页modle写法
2016/12/19 PHP
laravel5.6实现数值转换
2019/10/23 PHP
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
开源的javascript项目Kissy介绍
2014/11/28 Javascript
跟我学习javascript的函数调用和构造函数调用
2015/11/16 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
2015/12/24 Javascript
JS触发服务器控件的单击事件(详解)
2016/08/06 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
2016/12/30 Javascript
微信小程序简单实现form表单获取输入数据功能示例
2017/11/30 Javascript
在vue中,v-for的索引index在html中的使用方法
2018/03/06 Javascript
vue2.0模拟锚点的实例
2018/03/14 Javascript
Vue实现本地购物车功能
2018/12/05 Javascript
[03:07]DOTA2英雄基础教程 冰霜诅咒极寒幽魂
2013/12/06 DOTA
Python中Collection的使用小技巧
2014/08/18 Python
举例讲解Python程序与系统shell交互的方式
2015/04/09 Python
Python实现针对中文排序的方法
2017/05/09 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
2019/07/16 Python
python numpy数组中的复制知识解析
2020/02/03 Python
django 外键创建注意事项说明
2020/05/20 Python
哪种Python框架适合你?简单介绍几种主流Python框架
2020/08/04 Python
CSS3之2D与3D变换的实现方法
2019/01/28 HTML / CSS
HTML5的表单(绝对特别强大的功能)使用示例
2013/06/20 HTML / CSS
Onzie官网:美国时尚瑜伽品牌
2019/08/21 全球购物
嘻哈珠宝品牌:KRKC&CO
2020/10/19 全球购物
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
2013/06/05 面试题
专科毕业生求职简历的自我评价
2013/10/12 职场文书
团队口号大全
2014/06/06 职场文书
招标承诺书
2014/08/30 职场文书
党员作风建设自查报告
2014/10/23 职场文书
2014年第四季度入党积极分子思想汇报(十八届四中全会)
2014/11/03 职场文书
办公用品管理制度
2015/08/04 职场文书
关于车尾的标语大全
2015/08/11 职场文书
终止合同协议书范本
2016/03/22 职场文书
蔬果开业典礼发言稿应该怎么写?
2019/09/03 职场文书