├── README.md └── zju-web-auth.sh /README.md: -------------------------------------------------------------------------------- 1 | # 使用方式 2 | 3 | 4 | ## 依赖 5 | 此脚本只依赖如下命令。一般来说,即使是Openwrt都会自带这些命令: 6 | 7 | `curl echo openssl awk shuf sed` 8 | 9 | ## 登录 10 | `./zju-web-auth.sh 账号 密码` 11 | 12 | 若登录成功,脚本将打印`[Login Successful]`;若已经登录,脚本将打印`[Already Online]`;若登录失败,脚本将打印请求结果。 13 | ## 退出 14 | `./zju-web-auth.sh logout` 15 | 16 | 若退出成功,脚本将打印`logout_ok` 17 | ## 交互式操作 18 | `./zju-web-auth.sh` 19 | 20 | 然后根据提示输入指令、账号和密码。 21 | -------------------------------------------------------------------------------- /zju-web-auth.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | _PADCHAR="=" 4 | _ALPHA="LVoJPiCN2R8G90yg+hmFHuacZ1OWMnrsSTXkYpUq/3dlbfKwv6xztjI7DeBE45QA" 5 | INIT_URL="https://net.zju.edu.cn/" 6 | GET_CHALLENGE_API="https://net.zju.edu.cn/cgi-bin/get_challenge" 7 | SRUN_PORTAL_API="https://net.zju.edu.cn/cgi-bin/srun_portal" 8 | N='200' 9 | TYPE='1' 10 | ENC="srun_bx1" 11 | 12 | function ordat() { 13 | local msg="$1" 14 | local idx="$2" 15 | if [[ ${#msg} -gt idx ]]; then 16 | printf "%d" "'${msg:$idx:1}" 17 | else 18 | echo 0 19 | fi 20 | } 21 | 22 | function chr() { 23 | printf \\$(printf '%03o' $1) 24 | } 25 | 26 | function sencode() { 27 | local msg="$1" 28 | local key="$2" 29 | local l=${#msg} 30 | local pwd=() 31 | for ((i=0; i> 8 & 0xff))) 48 | output+=($((msg[$i] >> 16 & 0xff))) 49 | output+=($((msg[$i] >> 24 & 0xff))) 50 | done 51 | echo -n "${output[@]}" 52 | } 53 | 54 | function get_xencode() { 55 | local msg="$1" 56 | local key="$2" 57 | if [[ -z "$msg" ]]; then 58 | echo -n "" 59 | return 60 | fi 61 | local pwd=($(sencode "$msg" true)) 62 | local pwdk=($(sencode "$key" false)) 63 | if [[ ${#pwdk[@]} -lt 4 ]]; then 64 | local n=${#pwdk[@]} 65 | for ((i=n; i<4; i++)); do 66 | pwdk+=(0) 67 | done 68 | fi 69 | local n=$(( ${#pwd[@]} - 1 )) 70 | local z=${pwd[$n]} 71 | local c=$((0x86014019 | 0x183639A0)) 72 | local q=$((6 + 52 / (n + 1))) 73 | local d=0 74 | while ((q > 0)); do 75 | d=$(( d + c & (0x8CE0D9BF | 0x731F2640) )) 76 | local e=$((d >> 2 & 3)) 77 | local p=0 78 | while ((p < n)); do 79 | local y=${pwd[$((p + 1))]} 80 | local m=$(( z >> 5 ^ y << 2 )) 81 | m=$(( m + ((y >> 3 ^ z << 4) ^ (d ^ y)) )) 82 | m=$(( m + (pwdk[$((p & 3)) ^ e] ^ z) )) 83 | pwd[$p]=$(( pwd[$p] + m & (0xEFB8D130 | 0x10472ECF) )) 84 | z=${pwd[$p]} 85 | ((p++)) 86 | done 87 | local y=${pwd[0]} 88 | local m=$(( z >> 5 ^ y << 2 )) 89 | m=$(( m + ((y >> 3 ^ z << 4) ^ (d ^ y)) )) 90 | m=$(( m + (pwdk[$((p & 3)) ^ e] ^ z) )) 91 | pwd[$n]=$(( pwd[$n] + m & (0xBB390742 | 0x44C6F8BD) )) 92 | z=${pwd[$n]} 93 | ((q--)) 94 | done 95 | lencode "${pwd[@]}" 96 | } 97 | 98 | function get_base64() { 99 | local s=($@) 100 | local x="" 101 | local imax=$(( ${#s[@]} - ${#s[@]} % 3 )) 102 | if [[ ${#s[@]} -eq 0 ]]; then 103 | echo "" 104 | return 105 | fi 106 | for ((i=0; i