当前位置: 首页 > news >正文

高校教务系统登录页面JS分析——华南理工大学

高校教务系统密码加密逻辑及JS逆向

本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文,你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。

本文仅供交流学习,勿用于非法用途。

一、密码加密基本概念

密码加密是一种保护信息安全的技术手段,它通过将明文(原始信息)转换为密文(加密后的信息),以防止未经授权的访问和篡改。常见的密码加密算法有MD5、SHA-1、SHA-256等。

1.1 加密过程

加密过程通常包括以下步骤:

  1. 密钥扩展:将密钥扩展为多个轮值,每个轮值都与明文的一部分有关。
  2. 初始轮值生成:将扩展后的密钥与轮常数进行某种运算,生成第一轮加密的密文。
  3. 多轮迭代:对密文进行多轮迭代操作,每轮操作都包括非线性函数、模运算和轮常数的变换。
  4. 最终密文:经过多轮迭代后,得到最终的密文。

1.2 解密过程

解密过程与加密过程相反,通过反向操作来恢复原始明文。通常需要知道加密时使用的密钥和算法。

二、高校教务系统密码加密逻辑分析

2.1 抓包

我们首先打开教务系统的登录页面,我们可以看到,只有学号和密码,有的高校会有验证码,或者有的高校是错误一次密码,会验证验证码。

我们打开开发者工具,尝试登录抓包,网页会返回这样的数据接口。我们用户名和密码都是默认输入1234,你也可以输入其他的。

2.2 分析加密参数

我们接下来,就是来分析这个密码是怎么加密的。我们全局搜索rsa。定位到加密的位置。我们这里只有这个参数被加密了。我们猜想密码相关信息都包含在这个里面。

我们可以看到这里,定义了rsa是怎么生成的,是把u+p+lt拼接了在一起,这个还是第一次遇到。

三、JS逆向分析方法

逆向分析是指从已知的加密文本或程序中还原出原始信息的过程。在本例中,我们将使用JavaScript编写一个简单的逆向分析工具,用于逆向高校教务系统的密码。

环境使用

  • python 3.9
  • pycharm
  • node

我们全局搜索strEnc,我们就很容易定位到一个函数,我们不难发现其加密原理。

function strEnc(data,firstKey,secondKey,thirdKey){  var leng = data.length;  var encData = "";  var firstKeyBt,secondKeyBt,thirdKeyBt,firstLength,secondLength,thirdLength;  if(firstKey != null && firstKey != ""){      firstKeyBt = getKeyBytes(firstKey);  firstLength = firstKeyBt.length;  }  if(secondKey != null && secondKey != ""){  secondKeyBt = getKeyBytes(secondKey);  secondLength = secondKeyBt.length;  }  if(thirdKey != null && thirdKey != ""){  thirdKeyBt = getKeyBytes(thirdKey);  thirdLength = thirdKeyBt.length;  }    
  1. 首先,函数会接受两个参数:数据字符串data和密钥key
  2. 然后,通过CryptoJS.enc.Utf8.parse(key)将密钥从普通的字符串转换为CryptoJS可以处理的二进制格式。
  3. 接着,使用CryptoJS.AES.encrypt(data, key, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7})对数据进行加密。这里使用了ECB模式和PKCS7填充方式。
  4. 最后,通过调用.toString()将加密后的数据对象转换为字符串形式并返回。 

代码实现

/**
* DES加密解密
* @Copyright Copyright (c) 2006
* @author Guapo
* @see DESCore
*//*
* encrypt the string to string made up of hex
* return the encrypted string
*/
function strEnc(data,firstKey,secondKey,thirdKey){var leng = data.length;var encData = "";var firstKeyBt,secondKeyBt,thirdKeyBt,firstLength,secondLength,thirdLength;if(firstKey != null && firstKey != ""){firstKeyBt = getKeyBytes(firstKey);firstLength = firstKeyBt.length;}if(secondKey != null && secondKey != ""){secondKeyBt = getKeyBytes(secondKey);secondLength = secondKeyBt.length;}if(thirdKey != null && thirdKey != ""){thirdKeyBt = getKeyBytes(thirdKey);thirdLength = thirdKeyBt.length;}if(leng > 0){if(leng < 4){var bt = strToBt(data);var encByte ;if(firstKey != null && firstKey !="" && secondKey != null && secondKey != "" && thirdKey != null && thirdKey != ""){var tempBt;var x,y,z;tempBt = bt;for(x = 0;x < firstLength ;x ++){tempBt = enc(tempBt,firstKeyBt[x]);}for(y = 0;y < secondLength ;y ++){tempBt = enc(tempBt,secondKeyBt[y]);}for(z = 0;z < thirdLength ;z ++){tempBt = enc(tempBt,thirdKeyBt[z]);}encByte = tempBt;}else{if(firstKey != null && firstKey !="" && secondKey != null && secondKey != ""){var tempBt;var x,y;tempBt = bt;for(x = 0;x < firstLength ;x ++){tempBt = enc(tempBt,firstKeyBt[x]);}for(y = 0;y < secondLength ;y ++){tempBt = enc(tempBt,secondKeyBt[y]);}encByte = tempBt;}else{if(firstKey != null && firstKey !=""){var tempBt;var x = 0;tempBt = bt;for(x = 0;x < firstLength ;x ++){tempBt = enc(tempBt,firstKeyBt[x]);}encByte = tempBt;}}}encData = bt64ToHex(encByte);}else{var iterator = parseInt(leng/4);var remainder = leng%4;var i=0;for(i = 0;i < iterator;i++){var tempData = data.substring(i*4+0,i*4+4);var tempByte = strToBt(tempData);var encByte ;if(firstKey != null && firstKey !="" && secondKey != null && secondKey != "" && thirdKey != null && thirdKey != ""){var tempBt;var x,y,z;tempBt = tempByte;for(x = 0;x < firstLength ;x ++){tempBt = enc(tempBt,firstKeyBt[x]);}for(y = 0;y < secondLength ;y ++){tempBt = enc(tempBt,secondKeyBt[y]);}for(z = 0;z < thirdLength ;z ++){tempBt = enc(tempBt,thirdKeyBt[z]);}encByte = tempBt;}else{if(firstKey != null && firstKey !="" && secondKey != null && secondKey != ""){var tempBt;var x,y;tempBt = tempByte;for(x = 0;x < firstLength ;x ++){tempBt = enc(tempBt,firstKeyBt[x]);}for(y = 0;y < secondLength ;y ++){tempBt = enc(tempBt,secondKeyBt[y]);}encByte = tempBt;}else{if(firstKey != null && firstKey !=""){var tempBt;var x;tempBt = tempByte;for(x = 0;x < firstLength ;x ++){tempBt = enc(tempBt,firstKeyBt[x]);}encByte = tempBt;}}}encData += bt64ToHex(encByte);}if(remainder > 0){var remainderData = data.substring(iterator*4+0,leng);var tempByte = strToBt(remainderData);var encByte ;if(firstKey != null && firstKey !="" && secondKey != null && secondKey != "" && thirdKey != null && thirdKey != ""){var tempBt;var x,y,z;tempBt = tempByte;for(x = 0;x < firstLength ;x ++){tempBt = enc(tempBt,firstKeyBt[x]);}for(y = 0;y < secondLength ;y ++){tempBt = enc(tempBt,secondKeyBt[y]);}for(z = 0;z < thirdLength ;z ++){tempBt = enc(tempBt,thirdKeyBt[z]);}encByte = tempBt;}else{if(firstKey != null && firstKey !="" && secondKey != null && secondKey != ""){var tempBt;var x,y;tempBt = tempByte;for(x = 0;x < firstLength ;x ++){tempBt = enc(tempBt,firstKeyBt[x]);}for(y = 0;y < secondLength ;y ++){tempBt = enc(tempBt,secondKeyBt[y]);}encByte = tempBt;}else{if(firstKey != null && firstKey !=""){var tempBt;var x;tempBt = tempByte;for(x = 0;x < firstLength ;x ++){tempBt = enc(tempBt,firstKeyBt[x]);}encByte = tempBt;}}}encData += bt64ToHex(encByte);}}}return encData;
}/*
* decrypt the encrypted string to the original string
*
* return  the original string
*/
function strDec(data,firstKey,secondKey,thirdKey){var leng = data.length;var decStr = "";var firstKeyBt,secondKeyBt,thirdKeyBt,firstLength,secondLength,thirdLength;if(firstKey != null && firstKey != ""){firstKeyBt = getKeyBytes(firstKey);firstLength = firstKeyBt.length;}if(secondKey != null && secondKey != ""){secondKeyBt = getKeyBytes(secondKey);secondLength = secondKeyBt.length;}if(thirdKey != null && thirdKey != ""){thirdKeyBt = getKeyBytes(thirdKey);thirdLength = thirdKeyBt.length;}var iterator = parseInt(leng/16);var i=0;for(i = 0;i < iterator;i++){var tempData = data.substring(i*16+0,i*16+16);var strByte = hexToBt64(tempData);var intByte = new Array(64);var j = 0;for(j = 0;j < 64; j++){intByte[j] = parseInt(strByte.substring(j,j+1));}var decByte;if(firstKey != null && firstKey !="" && secondKey != null && secondKey != "" && thirdKey != null && thirdKey != ""){var tempBt;var x,y,z;tempBt = intByte;for(x = thirdLength - 1;x >= 0;x --){tempBt = dec(tempBt,thirdKeyBt[x]);}for(y = secondLength - 1;y >= 0;y --){tempBt = dec(tempBt,secondKeyBt[y]);}for(z = firstLength - 1;z >= 0 ;z --){tempBt = dec(tempBt,firstKeyBt[z]);}decByte = tempBt;}else{if(firstKey != null && firstKey !="" && secondKey != null && secondKey != ""){var tempBt;var x,y,z;tempBt = intByte;for(x = secondLength - 1;x >= 0 ;x --){tempBt = dec(tempBt,secondKeyBt[x]);}for(y = firstLength - 1;y >= 0 ;y --){tempBt = dec(tempBt,firstKeyBt[y]);}decByte = tempBt;}else{if(firstKey != null && firstKey !=""){var tempBt;var x,y,z;tempBt = intByte;for(x = firstLength - 1;x >= 0 ;x --){tempBt = dec(tempBt,firstKeyBt[x]);}decByte = tempBt;}}}decStr += byteToString(decByte);}return decStr;
}
/*
* chang the string into the bit array
*
* return bit array(it's length % 64 = 0)
*/
function getKeyBytes(key){var keyBytes = new Array();var leng = key.length;var iterator = parseInt(leng/4);var remainder = leng%4;var i = 0;for(i = 0;i < iterator; i ++){keyBytes[i] = strToBt(key.substring(i*4+0,i*4+4));}if(remainder > 0){keyBytes[i] = strToBt(key.substring(i*4+0,leng));}return keyBytes;
}/*
* chang the string(it's length <= 4) into the bit array
*
* return bit array(it's length = 64)
*/
function strToBt(str){var leng = str.length;var bt = new Array(64);if(leng < 4){var i=0,j=0,p=0,q=0;for(i = 0;i<leng;i++){var k = str.charCodeAt(i);for(j=0;j<16;j++){var pow=1,m=0;for(m=15;m>j;m--){pow *= 2;}bt[16*i+j]=parseInt(k/pow)%2;}}for(p = leng;p<4;p++){var k = 0;for(q=0;q<16;q++){var pow=1,m=0;for(m=15;m>q;m--){pow *= 2;}bt[16*p+q]=parseInt(k/pow)%2;}}}else{for(i = 0;i<4;i++){var k = str.charCodeAt(i);for(j=0;j<16;j++){var pow=1;for(m=15;m>j;m--){pow *= 2;}bt[16*i+j]=parseInt(k/pow)%2;}}}return bt;
}/*
* chang the bit(it's length = 4) into the hex
*
* return hex
*/
function bt4ToHex(binary) {var hex;switch (binary) {case "0000" : hex = "0"; break;case "0001" : hex = "1"; break;case "0010" : hex = "2"; break;case "0011" : hex = "3"; break;case "0100" : hex = "4"; break;case "0101" : hex = "5"; break;case "0110" : hex = "6"; break;case "0111" : hex = "7"; break;case "1000" : hex = "8"; break;case "1001" : hex = "9"; break;case "1010" : hex = "A"; break;case "1011" : hex = "B"; break;case "1100" : hex = "C"; break;case "1101" : hex = "D"; break;case "1110" : hex = "E"; break;case "1111" : hex = "F"; break;}return hex;
}/*
* chang the hex into the bit(it's length = 4)
*
* return the bit(it's length = 4)
*/
function hexToBt4(hex) {var binary;switch (hex) {case "0" : binary = "0000"; break;case "1" : binary = "0001"; break;case "2" : binary = "0010"; break;case "3" : binary = "0011"; break;case "4" : binary = "0100"; break;case "5" : binary = "0101"; break;case "6" : binary = "0110"; break;case "7" : binary = "0111"; break;case "8" : binary = "1000"; break;case "9" : binary = "1001"; break;case "A" : binary = "1010"; break;case "B" : binary = "1011"; break;case "C" : binary = "1100"; break;case "D" : binary = "1101"; break;case "E" : binary = "1110"; break;case "F" : binary = "1111"; break;}return binary;
}/*
* chang the bit(it's length = 64) into the string
*
* return string
*/
function byteToString(byteData){var str="";for(i = 0;i<4;i++){var count=0;for(j=0;j<16;j++){var pow=1;for(m=15;m>j;m--){pow*=2;}count+=byteData[16*i+j]*pow;}if(count != 0){str+=String.fromCharCode(count);}}return str;
}function bt64ToHex(byteData){var hex = "";for(i = 0;i<16;i++){var bt = "";for(j=0;j<4;j++){bt += byteData[i*4+j];}hex+=bt4ToHex(bt);}return hex;
}function hexToBt64(hex){var binary = "";for(i = 0;i<16;i++){binary+=hexToBt4(hex.substring(i,i+1));}return binary;
}/*
* the 64 bit des core arithmetic
*/function enc(dataByte,keyByte){var keys = generateKeys(keyByte);var ipByte   = initPermute(dataByte);var ipLeft   = new Array(32);var ipRight  = new Array(32);var tempLeft = new Array(32);var i = 0,j = 0,k = 0,m = 0, n = 0;for(k = 0;k < 32;k ++){ipLeft[k] = ipByte[k];ipRight[k] = ipByte[32+k];}for(i = 0;i < 16;i ++){for(j = 0;j < 32;j ++){tempLeft[j] = ipLeft[j];ipLeft[j] = ipRight[j];}var key = new Array(48);for(m = 0;m < 48;m ++){key[m] = keys[i][m];}var  tempRight = xor(pPermute(sBoxPermute(xor(expandPermute(ipRight),key))), tempLeft);for(n = 0;n < 32;n ++){ipRight[n] = tempRight[n];}}var finalData =new Array(64);for(i = 0;i < 32;i ++){finalData[i] = ipRight[i];finalData[32+i] = ipLeft[i];}return finallyPermute(finalData);
}function dec(dataByte,keyByte){var keys = generateKeys(keyByte);var ipByte   = initPermute(dataByte);var ipLeft   = new Array(32);var ipRight  = new Array(32);var tempLeft = new Array(32);var i = 0,j = 0,k = 0,m = 0, n = 0;for(k = 0;k < 32;k ++){ipLeft[k] = ipByte[k];ipRight[k] = ipByte[32+k];}for(i = 15;i >= 0;i --){for(j = 0;j < 32;j ++){tempLeft[j] = ipLeft[j];ipLeft[j] = ipRight[j];}var key = new Array(48);for(m = 0;m < 48;m ++){key[m] = keys[i][m];}var  tempRight = xor(pPermute(sBoxPermute(xor(expandPermute(ipRight),key))), tempLeft);for(n = 0;n < 32;n ++){ipRight[n] = tempRight[n];}}var finalData =new Array(64);for(i = 0;i < 32;i ++){finalData[i] = ipRight[i];finalData[32+i] = ipLeft[i];}return finallyPermute(finalData);
}function initPermute(originalData){var ipByte = new Array(64);for (i = 0, m = 1, n = 0; i < 4; i++, m += 2, n += 2) {for (j = 7, k = 0; j >= 0; j--, k++) {ipByte[i * 8 + k] = originalData[j * 8 + m];ipByte[i * 8 + k + 32] = originalData[j * 8 + n];}}return ipByte;
}function expandPermute(rightData){var epByte = new Array(48);for (i = 0; i < 8; i++) {if (i == 0) {epByte[i * 6 + 0] = rightData[31];} else {epByte[i * 6 + 0] = rightData[i * 4 - 1];}epByte[i * 6 + 1] = rightData[i * 4 + 0];epByte[i * 6 + 2] = rightData[i * 4 + 1];epByte[i * 6 + 3] = rightData[i * 4 + 2];epByte[i * 6 + 4] = rightData[i * 4 + 3];if (i == 7) {epByte[i * 6 + 5] = rightData[0];} else {epByte[i * 6 + 5] = rightData[i * 4 + 4];}}return epByte;
}function xor(byteOne,byteTwo){var xorByte = new Array(byteOne.length);for(i = 0;i < byteOne.length; i ++){xorByte[i] = byteOne[i] ^ byteTwo[i];}return xorByte;
}function sBoxPermute(expandByte){var sBoxByte = new Array(32);var binary = "";var s1 = [[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7],[0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8],[4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0],[15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 ]];/* Table - s2 */var s2 = [[15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10],[3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5],[0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15],[13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 ]];/* Table - s3 */var s3= [[10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8],[13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1],[13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7],[1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 ]];/* Table - s4 */var s4 = [[7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15],[13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9],[10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4],[3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 ]];/* Table - s5 */var s5 = [[2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9],[14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6],[4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14],[11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 ]];/* Table - s6 */var s6 = [[12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11],[10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8],[9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6],[4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 ]];/* Table - s7 */var s7 = [[4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1],[13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6],[1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2],[6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12]];/* Table - s8 */var s8 = [[13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7],[1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2],[7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8],[2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11]];for(m=0;m<8;m++){var i=0,j=0;i = expandByte[m*6+0]*2+expandByte[m*6+5];j = expandByte[m * 6 + 1] * 2 * 2 * 2+ expandByte[m * 6 + 2] * 2* 2+ expandByte[m * 6 + 3] * 2+ expandByte[m * 6 + 4];switch (m) {case 0 :binary = getBoxBinary(s1[i][j]);break;case 1 :binary = getBoxBinary(s2[i][j]);break;case 2 :binary = getBoxBinary(s3[i][j]);break;case 3 :binary = getBoxBinary(s4[i][j]);break;case 4 :binary = getBoxBinary(s5[i][j]);break;case 5 :binary = getBoxBinary(s6[i][j]);break;case 6 :binary = getBoxBinary(s7[i][j]);break;case 7 :binary = getBoxBinary(s8[i][j]);break;}sBoxByte[m*4+0] = parseInt(binary.substring(0,1));sBoxByte[m*4+1] = parseInt(binary.substring(1,2));sBoxByte[m*4+2] = parseInt(binary.substring(2,3));sBoxByte[m*4+3] = parseInt(binary.substring(3,4));}return sBoxByte;
}function pPermute(sBoxByte){var pBoxPermute = new Array(32);pBoxPermute[ 0] = sBoxByte[15];pBoxPermute[ 1] = sBoxByte[ 6];pBoxPermute[ 2] = sBoxByte[19];pBoxPermute[ 3] = sBoxByte[20];pBoxPermute[ 4] = sBoxByte[28];pBoxPermute[ 5] = sBoxByte[11];pBoxPermute[ 6] = sBoxByte[27];pBoxPermute[ 7] = sBoxByte[16];pBoxPermute[ 8] = sBoxByte[ 0];pBoxPermute[ 9] = sBoxByte[14];pBoxPermute[10] = sBoxByte[22];pBoxPermute[11] = sBoxByte[25];pBoxPermute[12] = sBoxByte[ 4];pBoxPermute[13] = sBoxByte[17];pBoxPermute[14] = sBoxByte[30];pBoxPermute[15] = sBoxByte[ 9];pBoxPermute[16] = sBoxByte[ 1];pBoxPermute[17] = sBoxByte[ 7];pBoxPermute[18] = sBoxByte[23];pBoxPermute[19] = sBoxByte[13];pBoxPermute[20] = sBoxByte[31];pBoxPermute[21] = sBoxByte[26];pBoxPermute[22] = sBoxByte[ 2];pBoxPermute[23] = sBoxByte[ 8];pBoxPermute[24] = sBoxByte[18];pBoxPermute[25] = sBoxByte[12];pBoxPermute[26] = sBoxByte[29];pBoxPermute[27] = sBoxByte[ 5];pBoxPermute[28] = sBoxByte[21];pBoxPermute[29] = sBoxByte[10];pBoxPermute[30] = sBoxByte[ 3];pBoxPermute[31] = sBoxByte[24];return pBoxPermute;
}function finallyPermute(endByte){var fpByte = new Array(64);fpByte[ 0] = endByte[39];fpByte[ 1] = endByte[ 7];fpByte[ 2] = endByte[47];fpByte[ 3] = endByte[15];fpByte[ 4] = endByte[55];fpByte[ 5] = endByte[23];fpByte[ 6] = endByte[63];fpByte[ 7] = endByte[31];fpByte[ 8] = endByte[38];fpByte[ 9] = endByte[ 6];fpByte[10] = endByte[46];fpByte[11] = endByte[14];fpByte[12] = endByte[54];fpByte[13] = endByte[22];fpByte[14] = endByte[62];fpByte[15] = endByte[30];fpByte[16] = endByte[37];fpByte[17] = endByte[ 5];fpByte[18] = endByte[45];fpByte[19] = endByte[13];fpByte[20] = endByte[53];fpByte[21] = endByte[21];fpByte[22] = endByte[61];fpByte[23] = endByte[29];fpByte[24] = endByte[36];fpByte[25] = endByte[ 4];fpByte[26] = endByte[44];fpByte[27] = endByte[12];fpByte[28] = endByte[52];fpByte[29] = endByte[20];fpByte[30] = endByte[60];fpByte[31] = endByte[28];fpByte[32] = endByte[35];fpByte[33] = endByte[ 3];fpByte[34] = endByte[43];fpByte[35] = endByte[11];fpByte[36] = endByte[51];fpByte[37] = endByte[19];fpByte[38] = endByte[59];fpByte[39] = endByte[27];fpByte[40] = endByte[34];fpByte[41] = endByte[ 2];fpByte[42] = endByte[42];fpByte[43] = endByte[10];fpByte[44] = endByte[50];fpByte[45] = endByte[18];fpByte[46] = endByte[58];fpByte[47] = endByte[26];fpByte[48] = endByte[33];fpByte[49] = endByte[ 1];fpByte[50] = endByte[41];fpByte[51] = endByte[ 9];fpByte[52] = endByte[49];fpByte[53] = endByte[17];fpByte[54] = endByte[57];fpByte[55] = endByte[25];fpByte[56] = endByte[32];fpByte[57] = endByte[ 0];fpByte[58] = endByte[40];fpByte[59] = endByte[ 8];fpByte[60] = endByte[48];fpByte[61] = endByte[16];fpByte[62] = endByte[56];fpByte[63] = endByte[24];return fpByte;
}function getBoxBinary(i) {var binary = "";switch (i) {case 0 :binary = "0000";break;case 1 :binary = "0001";break;case 2 :binary = "0010";break;case 3 :binary = "0011";break;case 4 :binary = "0100";break;case 5 :binary = "0101";break;case 6 :binary = "0110";break;case 7 :binary = "0111";break;case 8 :binary = "1000";break;case 9 :binary = "1001";break;case 10 :binary = "1010";break;case 11 :binary = "1011";break;case 12 :binary = "1100";break;case 13 :binary = "1101";break;case 14 :binary = "1110";break;case 15 :binary = "1111";break;}return binary;
}
/*
* generate 16 keys for xor
*
*/
function generateKeys(keyByte){var key   = new Array(56);var keys = new Array();keys[ 0] = new Array();keys[ 1] = new Array();keys[ 2] = new Array();keys[ 3] = new Array();keys[ 4] = new Array();keys[ 5] = new Array();keys[ 6] = new Array();keys[ 7] = new Array();keys[ 8] = new Array();keys[ 9] = new Array();keys[10] = new Array();keys[11] = new Array();keys[12] = new Array();keys[13] = new Array();keys[14] = new Array();keys[15] = new Array();var loop = [1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1];for(i=0;i<7;i++){for(j=0,k=7;j<8;j++,k--){key[i*8+j]=keyByte[8*k+i];}}var i = 0;for(i = 0;i < 16;i ++){var tempLeft=0;var tempRight=0;for(j = 0; j < loop[i];j ++){tempLeft = key[0];tempRight = key[28];for(k = 0;k < 27 ;k ++){key[k] = key[k+1];key[28+k] = key[29+k];}key[27]=tempLeft;key[55]=tempRight;}var tempKey = new Array(48);tempKey[ 0] = key[13];tempKey[ 1] = key[16];tempKey[ 2] = key[10];tempKey[ 3] = key[23];tempKey[ 4] = key[ 0];tempKey[ 5] = key[ 4];tempKey[ 6] = key[ 2];tempKey[ 7] = key[27];tempKey[ 8] = key[14];tempKey[ 9] = key[ 5];tempKey[10] = key[20];tempKey[11] = key[ 9];tempKey[12] = key[22];tempKey[13] = key[18];tempKey[14] = key[11];tempKey[15] = key[ 3];tempKey[16] = key[25];tempKey[17] = key[ 7];tempKey[18] = key[15];tempKey[19] = key[ 6];tempKey[20] = key[26];tempKey[21] = key[19];tempKey[22] = key[12];tempKey[23] = key[ 1];tempKey[24] = key[40];tempKey[25] = key[51];tempKey[26] = key[30];tempKey[27] = key[36];tempKey[28] = key[46];tempKey[29] = key[54];tempKey[30] = key[29];tempKey[31] = key[39];tempKey[32] = key[50];tempKey[33] = key[44];tempKey[34] = key[32];tempKey[35] = key[47];tempKey[36] = key[43];tempKey[37] = key[48];tempKey[38] = key[38];tempKey[39] = key[55];tempKey[40] = key[33];tempKey[41] = key[52];tempKey[42] = key[45];tempKey[43] = key[41];tempKey[44] = key[49];tempKey[45] = key[35];tempKey[46] = key[28];tempKey[47] = key[31];switch(i){case 0: for(m=0;m < 48 ;m++){ keys[ 0][m] = tempKey[m]; } break;case 1: for(m=0;m < 48 ;m++){ keys[ 1][m] = tempKey[m]; } break;case 2: for(m=0;m < 48 ;m++){ keys[ 2][m] = tempKey[m]; } break;case 3: for(m=0;m < 48 ;m++){ keys[ 3][m] = tempKey[m]; } break;case 4: for(m=0;m < 48 ;m++){ keys[ 4][m] = tempKey[m]; } break;case 5: for(m=0;m < 48 ;m++){ keys[ 5][m] = tempKey[m]; } break;case 6: for(m=0;m < 48 ;m++){ keys[ 6][m] = tempKey[m]; } break;case 7: for(m=0;m < 48 ;m++){ keys[ 7][m] = tempKey[m]; } break;case 8: for(m=0;m < 48 ;m++){ keys[ 8][m] = tempKey[m]; } break;case 9: for(m=0;m < 48 ;m++){ keys[ 9][m] = tempKey[m]; } break;case 10: for(m=0;m < 48 ;m++){ keys[10][m] = tempKey[m]; } break;case 11: for(m=0;m < 48 ;m++){ keys[11][m] = tempKey[m]; } break;case 12: for(m=0;m < 48 ;m++){ keys[12][m] = tempKey[m]; } break;case 13: for(m=0;m < 48 ;m++){ keys[13][m] = tempKey[m]; } break;case 14: for(m=0;m < 48 ;m++){ keys[14][m] = tempKey[m]; } break;case 15: for(m=0;m < 48 ;m++){ keys[15][m] = tempKey[m]; } break;}}return keys;
}
var u = '1234'
var p = '1234'
var lt = ' LT-318507-wymVTnxdHIivdYhDVasTwXTNEKnqTI-cas'
var rsa =strEnc(u+p+lt , '1' , '2' , '3')console.log(rsa)

我这里直接把代码给大家,大家感兴趣可以先尝试直接去写,可以和我写的做比较。 

实现效果

C1BB5938DF9F2190C1BB5938DF9F21906C47B718205114E97CBA49C9BE760421885CBED73DBA20760A8CE596669EA996ECAE08DFB1001AFC0C53B6B482DC1A450D45FA2BFB9C2F07AEF9D3E23DE6C7061D6814B8F1D6CEBC279B336B204A11587914575B59A84A0FB2DA8880EA270330

 我们可以发现,这个结果和网页的结果一样的,说明我们逆向成功了。

四、总结

本文介绍了高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的方法。通过学习这些知识,你可以更好地理解密码加密技术的原理,并掌握一定的逆向分析技巧。请注意,逆向分析可能涉及到法律问题,请在合法范围内进行研究和实践。

五、累计更新

争取到到底早日更新30所高校,大家可以在评论区留言。前期更的可能会多一点,有的学校教务系统都没有加密,我这里就不写了,还有,部分学校的教务系统已经和我之前写的是一样的,我也不重复赘述了。

往期作品可以查看专栏👇👇👇

全国高校教务系统登录页面JS分析_爱吃饼干的小白鼠的博客-CSDN博客

6adf31c8c5dd4e6a83314f4805b30bc1.jpg

相关文章:

高校教务系统登录页面JS分析——华南理工大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…...

人工智能之PyTorch数据操作-Python版

PyTorch数据操作 # 导入PyTorch import torch [张量表示一个由数值组成的数组&#xff0c;这个数组可能有多个维度]。 具有一个轴的张量对应数学上的向量&#xff08;&#xff09;&#xff1b; 具有两个轴的张量对应数学上的矩阵&#xff08;matrix&#xff09;&#xff1b;…...

星环科技向量数据库Transwarp Hippo1.1发布:一库搞定向量+全文联合检索,提升大模型准确率

星环科技向量数据库Transwarp Hippo自发布已来,受到了众多用户的欢迎,帮助用户实现向量数据的存储、管理和检索,探索和实践大模型场景。在与用户不断地深入交流以及实践中,Hippo迎来了V1.1版本,一套系统即可支持向量与全文联合检索,提高文本数据的召回精度,从而提升大语…...

理解LoadRunner,基于此工具进行后端性能测试的详细过程(下)

5、录制并增强虚拟用户脚本 从整体角度看&#xff0c;用LoadRunner 开发虚拟用户脚本主要包括下面四步骤&#xff1a; 识别测试应用使用的协议 录制脚本 完善录制得到的脚本 验证脚本的正确性 识别被测应用使用的协议 如果明确知道了被测系统所采用的协议&#xff0c;可…...

K8s上的监控系统(Grafana)使用和理解说明

Grafana (集成Prometheus On K8s集成)主要步骤说明 客户端指标收集 —— K8s 集群资源等 —— Prometheus 监控数据收集 —— Grafana —— 通过PromQL 进行数据查询 —— 预警告警等通知 Kubernetes集群资源&#xff1a;这包括了CPU、内存、磁盘、网络等各种类型的资源。这些资…...

【netty从入门到放弃】netty转发tcp数据到多客户端

目录 创建数据库表xml实体类启动类线程类客户端代码handlecontroller类缓存tcp链接 接到一个需求&#xff0c;需要实现转发通讯模块tcp数据其他的服务器&#xff0c;也就是转发tcp数据到多客户端 任务拆解: 首先需要建立多客户端&#xff0c;每个客户端有一个独立的clientId和…...

Linux | gdb的基本使用

目录 前言 一、调试文件的生成 二、调试指令 1、选择调试文件 2、查看代码 3、运行代码 4、断点 5、打印与常显示 6、其他 总结 前言 前面我们学习了如何使用gcc/g来进行对代码进行编译&#xff0c;本章我们将使用gdb来对代码进行调试&#xff0c;学习本章的前提是有…...

C++之this指针

前言 C中对象模型和this指针是面向对象编程中的重要概念。对象模型描述了对象在内存中的布局和行为&#xff0c;包括成员变量、成员函数的存储方式和访问权限。this指针是一个隐含的指针&#xff0c;指向当前对象的地址&#xff0c;用于在成员函数中引用当前对象的成员变量和成…...

大模型,重构自动驾驶

文&#xff5c;刘俊宏 编&#xff5c;王一粟 大模型如何重构自动驾驶&#xff1f;答案已经逐渐露出水面。 “在大数据、大模型为特征&#xff0c;以数据驱动为开发模式的自动驾驶3.0时代&#xff0c;自动驾驶大模型将在车端、云端上实现一个统一的端到端的平台管理。”毫末智…...

Jmeter执行接口自动化测试-如何初始化清空旧数据

需求分析&#xff1a; 每次执行完自动化测试&#xff0c;我们不会执行删除接口把数据删除&#xff0c;而需要留着手工测试&#xff0c;此时会导致下次执行测试有旧数据我们手工可能也会新增数据&#xff0c;导致下次执行自动化测试有旧数据 下面介绍两种清空数据的方法 一、通过…...

dashboard报错 错误:无法获取网络列表、dashboard报错 错误:无法获取云主机列表 解决流程

文章目录 错误说明dashboard上报错底层命令报错查看日志message日志httpd报错日志错误日志分析开始解决测试底层命令dashboard错误说明 dashboard上报错 首先,dashboard上无论是管理员还是其他项目,均无法获取云主机和网络信息,具体报错如下...

C语言中的3种注释方法

C语言中的3种注释方法 2021年8月28日星期六席锦 在用C语言编程时&#xff0c;常用的注释方式有如下几种&#xff1a; (1)单行注释 // … (2)多行注释 /* … */ (3)条件编译注释 #if 0…#endif (1)(2)在入门教程中比较常见。 对于(1) 【单行注释 // …】&#xff0c;注释只能显示…...

20款VS Code实用插件推荐

前言&#xff1a; VS Code是一个轻量级但功能强大的源代码编辑器&#xff0c;轻量级指的是下载下来的VS Code其实就是一个简单的编辑器&#xff0c;强大指的是支持多种语言的环境插件拓展&#xff0c;也正是因为这种支持插件式安装环境开发让VS Code成为了开发语言工具中的霸主…...

攻防世界web篇-robots

打开网址后&#xff0c;发现是一个空白页面的网页 但是&#xff0c;这个题目是robots&#xff0c;所以就联想到robots.txt这个目录&#xff0c;于是我就试了一下 注意&#xff1a;这里有个php的文件&#xff0c;这个应该就是一个目录文件 当输入后&#xff0c;直接回车&#…...

6 个可解锁部分 GPT-4 功能的 Chrome 扩展(无需支付 ChatGPT Plus 费用)

在过去的几个月里&#xff0c;我广泛探索了 ChatGPT 的所有可用插件。在此期间&#xff0c;我发现了一些令人惊叹的插件&#xff0c;它们改进了我使用 ChatGPT 的方式&#xff0c;但现在&#xff0c;我将透露一些您需要了解的内容。 借助 Chrome 扩展程序&#xff0c;所有 Chat…...

centos 7.9 安装sshpass

1.作用 sshpass是一个用于非交互式SSH密码验证的实用程序。它可以用于自动输入密码以进行SSH登录&#xff0c;从而简化了自动化脚本和批处理作业中的SSH连接过程。 sshpass命令可以与ssh命令一起使用&#xff0c;通过在命令行中提供密码参数来执行远程命令。以下是一个示例命…...

CompletableFuture多任务异步,获取返回值,汇总结果

线程池异步的基础知识 详情见&#xff1a;https://blog.csdn.net/sinat_32502451/article/details/133039624 线程池执行多任务&#xff0c;获取返回值 线程池的 submit()方法&#xff0c;可以提交任务&#xff0c;并返回 Future接口。 而 future.get()&#xff0c;可以获取…...

Linux上Qt和Opencv人脸识别项目学习路线(嵌入式/C++)

本文将介绍Linux人脸识别项目的开发流程, 只作简略介绍所需知识点及大致流程。 注&#xff1a;若需详细教程请联系作者&#xff08;见文末&#xff09;。 一、基本开发环境搭建 1.1 安装虚拟机Ubuntu 虚拟机采用的是VMware&#xff0c;需要下载VMware安装包、ubuntu系统镜像…...

spring 源码阅读之@Configuration解析

Configuration解析 Configuration注解用于标识一个类是配置类&#xff0c;用于声明和组织Bean定义&#xff0c;首先Configuration本身也是一个Component&#xff0c;在其注解定义上标有Component Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Documented Co…...

Java Web 33道面试题汇总

更多面试合集在:https://javaxiaobear.cn 1、http 的长连接和短连接? HTTP 协议有 HTTP/1.0 版本和 HTTP/1.1 版本。HTTP1.1 默认保持长连接(HTTP persistent connection,也翻译为持久连接),数据传输完成了保持 TCP 连接不断开(不发 RST 包、不四次握手),等待在同域名…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...