Crypto

signsystem

题目

task.py

from Crypto.Util.number import getPrime, bytes_to_long
from gmpy2 import lcm,invert
import SocketServer
import signal,os,random,string
from hashlib import sha256from secret import FLAGdef genKey():e = 65537p = getPrime(2048)q = getPrime(2048)N = p*qs = lcm(lcm(p-1,q-1),lcm(q+1,p+1))d = invert(e,s)return e,d,Ndef encrypt(m,e,N):if e == 0:return 2t1 = 2t2 = me = bin(e)[3:]for i in e:tk  = (t2*t1 - m)%Nsk = (t2*t2 - 2)%Nrk = (m*t2*t2-t2*t1-m)%Nif i == '0' :t2 = skt1 = tkelse:t2 = rkt1 = skreturn t2
class Task(SocketServer.BaseRequestHandler):def proof_of_work(self):random.seed(os.urandom(8))proof = ''.join([random.choice(string.ascii_letters+string.digits) for _ in xrange(20)])digest = sha256(proof).hexdigest()self.request.send("sha256(XXXX+%s) == %s\n" % (proof[4:],digest))self.request.send('Give me XXXX:')x = self.request.recv(10)x = x.strip()if len(x) != 4 or sha256(x+proof[4:]).hexdigest() != digest: return Falsereturn Truedef dorecv(self,sz):try:return int(self.request.recv(sz).strip())except:return 0def dosend(self, msg):try:self.request.sendall(msg)except:passdef handle(self):signal.alarm(200)if not self.proof_of_work():returnsecret = bytes_to_long(os.urandom(48))self.dosend("Welcome to the Signature System.")self.dosend('You can sign any message you want and if you give me the secret\'s signature I will give you the flag.\n')   e,d,N = genKey()self.dosend('The pulickey is '+str(e)+" "+ str(N)+'\n')self.dosend('The secret is '+str(secret)+'\n')for i in range(4):   self.dosend("Tell me the plaintext: ")pt = self.dorecv(1500)if pt == 0:breakif pt == secret:self.dosend('NO! You can not sign the secret!')breaksig = encrypt(pt,d,N)self.dosend('The signature is ' + str(sig) + '\n')self.dosend('Tell me the secret\'s signature and I will give you the flag.\n')sig = self.dorecv(1500)if(encrypt(sig,e,N) == secret):self.dosend('You are smart! The flag is '+FLAG + '\n')self.request.close()class ForkingServer(SocketServer.ForkingTCPServer, SocketServer.TCPServer):passif __name__ == "__main__":HOST, PORT = '0.0.0.0', 10004server = ForkingServer((HOST, PORT), Task)server.allow_reuse_address = Trueserver.serve_forever()

解答

题目中的加密算法很奇怪,所以测试一下加密算法的结果,得到如下结论:

在不模n的情况下,该函数加密结果满足以下数列:

f(1) = m, f(2) = m^2-2, f(n+2) = m*f(n+1) - f(n)

列出几项观察:

m, m^2-2, m^3-3m, m^4-4m^2+2, m^5-5m^3+5m, ...

暂时没有得到有用结论。再看一看e和d的关系,随便找了100个输入,确认e和d在该算法可逆,原理不明。

继续看代码。代码允许输入一个明文m计算enc(m, d, n),但m不能是secret。注意到允许输入负数,因此输入负secret时,也能得到一个签名sign。根据数列的特性,当m变为-m时,其奇数项变负,偶数项保持不变,因此尝试直接用sign或者-sign当作sig进行签名。结果发现当输入-sign时签名成功,即第e(奇数)项取负值。完整解题代码如下:

#!/usr/bin/env python
# coding:utf-8
from pwn import *
import hashlib
import string
p = remote("39.107.252.238", 10093)def myhash(text):mysha = hashlib.sha256()mysha.update(text)return mysha.hexdigest()def passPoW(plain, cipher):dic = string.digits+string.ascii_lettersfor a0 in dic:for a1 in dic:for a2 in dic:for a3 in dic:tmp = a0+a1+a2+a3+plainif(myhash(tmp)==cipher):return a0+a1+a2+a3def encrypt(m,e,N):if e == 0:return 2t1 = 2t2 = me = bin(e)[3:]for i in e:tk  = (t2*t1 - m)%Nsk = (t2*t2 - 2)%Nrk = (m*t2*t2-t2*t1-m)%Nif i == '0' :t2 = skt1 = tkelse:t2 = rkt1 = skreturn t2# pass the PoW
recv = p.recvline()
print recv.strip()
plain = recv[12:28]
cipher = recv[33:97]
res = passPoW(plain, cipher)
print p.recvuntil("Give me XXXX:")
p.sendline(res)recv = p.recvline()
print recv.strip()
recv = p.recvline()
print recv.strip()
n = int(recv.strip()[22:])
recv = p.recvline()
print recv.strip()
secret = int(recv.strip()[14:])
e = 65537print p.recvuntil("Tell me the plaintext:")
p.sendline(str(-secret))
recv = p.recvline()
print recv.strip()
result = recv.strip()[17:]
print p.recvuntil("Tell me the plaintext:")
p.sendline("0")
print p.recvuntil("Tell me the secret's signature and I will give you the flag.")
p.sendline("-"+result)
p.interactive()


flag{1890a3a7-33fe-4370-abe5-3511fdf6b0a0}

dislogAgain

题目

task.py

from gmpy2 import *
from Crypto.Util.number import bytes_to_long
import random
from secret import flag
def keygen():p = next_prime(random.getrandbits(1024))q = next_prime(p**3)n = p*p*qtmp = p*pwhile True:g = random.randint(2,n-1)if pow(g,p-1,tmp) != 1:breakreturn g,n,p,qdef encrypt(g,n,msg,p):msg = bytes_to_long(msg)assert(msg<p)r = random.randint(1,n-1) h = pow(g,n,n)return (pow(g,msg,n)*pow(h,r,n))%ng,n,p,q = keygen()print g
print n
print encrypt(g,n,flag,p)

out

137261919839707081160655330560956867995894804265247730499195988354503088921949409954943072057697292541253034534835700613830535742360897463631920633501203526409427256243296724830206327965478964707657622756269801570256719219397907211471793647401907258197687047172379076495879780075822215321321075351966321975248339716973022846475731695610685935032135321624338977475023528252024112566241730257211266833331874349028231317740509495588457797779102358174332937905603748045384741485174112107008884052498137719901235389362138360008096353902250713852195601694871454039981760765043088617789198634190290341250492480439889937728791128954629075131024415061264603758654913522235248083623764730062877911397448971010931810531490589084961439461465038297594738827260498062295088954167946297607018557519955626568624684638253531787888089133620268961212182993200434175297172229214654914470845590104662319878903416882577170667707700609678371809434757030103786988576512392665856502329308799144267569722010525231675066901859752771636518581507128071127323948466412921904129439179141168543590957499160382924875283499063362296143936019590244223294964741840468354815587092080267333339007049123873921574685837372506244539017914942403244950444208621733801241685625684067042998896142683699363394698167939478414701161082868202246250423910631209244634278558789141173955248888647672455921398646918695076757832551185938751796494635337489091562370702061565172018757379568335990039982611509278691959581404834210547498278459019046436329949508113958785434482204870461041999840081
145653267779296434305965396429100057154650730875021900492290747987400136992494375933967058997589836329649396995937093732593407112124438951423662842412368933037054730694298108685851286805873539358360293824782698205687123542276396025702798181870213166726673185465405836324762345900324304003173262510246892658532662492567170903417955641341474597417790615461846138808296772316948558957950012936348479615555901285182760167391958741645609359649307857935972341319616858241290598110226020297782583289565922306641770794817518253388680556855751447183449278015731856288641268650334586318382845222374403969941804604965995881881370793043211400497577003521914571380211441355875377998761359487809978550309057840242150900242781342077525207499481924832073927811206648196442835608774947433813401440034680922393284999234895419955041475935927642967126548774469338248349077487687781236144035796142478667730144944269102235021066928374364173695693483445241101917552592242458801153108082951415989660626178394526788417396849582367197438990141435913607252573589212403634570699675357352298022852214318930070434389174287745613702311198282268505984337191589078321516275555471231144725377339028067958681385141181446825701152603028116568465638704488778423750171666917323194451666355188287727494415147635407843523358120864096169442942276446242195918360828914245651538450905944605444807610641225102352788653187601037865116336632449302281608594244117698675518689842908653527867809876259690834989711942877346219979164092295516847199248611598900988900916518133131741613955731
84898063004825671587996219036581751699332145694704354611647705648649024723047159511943763741924381779210491000536164827638609708049380766733724215890935318675533670751139000781453970742552060752017029192265046320227315724768101715519242348802177774001507101840172806600423324917497487147094834993054580361239193293563435327259015429820458309917062906440831144834783527800982688911550880904774735297002235824350311138665140151680809746208328141434352199633367529952291028554314825523742968346430761020349449949582485079320447472306972643192876498374756657527421908292423554992397798378047987083692851616997120409739144335553593884096099206853975355978907173994114011930838946733976833903562665892283324081490968907309610395950012636772468998300719788816029408959433854204988773549703536071898454528673103323749234494497372923784342375398618136726225417264765921880998908756168464788484084447295314122440538230217918521364755266776269035727957626803363813889460422038720590563436987484066137419511075734768572993381538950339190862054374343990223129676806770859588153156218474203663981913409519880189719973048141355105115565928720263286557708060098315216098290498367186360723251135395513520820351468242305164361059604816328318688646025688237963833511694705050675742961811404427767051123592029594255270274316529160969260245028245765768076289044469106363079431096557982000628055059665205066888883025708604594523853371998907361615145141523404742991862716528669060293816658918346561789811866235766351738555975285482887683858672764357438244486073

解答

(折腾了半天,最后才想到查一查dislog什么意思,嗯,离散对数- -。再一看g已知,c已知,p可求,真的是离散对数。于是又掉进了离散对数坑。。。)

求p、q
因为q=gmpy2.next_prime(p ^ 3),所以直接将n开5次方,往回找就能找到p

#!/usr/bin/env python
# coding:utf-8
import gmpy2g = ...
n = ...
c = ...p, q = 0, 0
s = int(gmpy2.iroot(n,5)[0])
while True:while not gmpy2.is_prime(s):s -= 1if(n%s==0):p = sq = n //(p**2)breakprint p
print q

得到p,q后,网上查到该加密算法为Okamoto-Uchiyama 密码系统,利用维基百科上的解密代码求解。

#!/usr/bin/env python
# coding:utf-8
import gmpy2
from libnum import n2sg = ...
n = ...
c = ...p, q = 0, 0
s = int(gmpy2.iroot(n,5)[0])
while True:while not gmpy2.is_prime(s):s -= 1if(n%s==0):p = sq = n //(p**2)break# print p
# print q
a = (pow(c, p-1, p*p) - 1) // p
b = gmpy2.invert((pow(g, p-1, p*p) - 1) // p, p)
print n2s((a * b) % p)

flag{8bc0de2f-0995-40e2-9c33-83aa96d618e4}

2EM

题目

task.py

import random
from secret import flag
from Crypto.Util.number import bytes_to_long
pbox1 = [22, 28, 2, 21, 3, 26, 6, 14, 7, 16, 15, 9, 17, 19, 8, 11, 10, 1, 13, 31, 23, 12, 0, 27, 4, 18, 30, 29, 24, 20, 5, 25]
pbox2 = [17, 6, 7, 27, 4, 20, 11, 22, 2, 19, 9, 24, 23, 31, 15, 10, 18, 28, 5, 0, 16, 29, 25, 8, 3, 21, 30, 12, 14, 13, 1, 26]
def p(data,pbox):tmp = bin(data)[2:].rjust(32,'0')out = [ tmp[x] for x in pbox ]return int(''.join(out),2)def genkey(l):return random.getrandbits(l)def encrypt(key,msg):tmp1 = p(msg^key,pbox1)tmp2 = p(tmp1^key,pbox2)return tmp2^keykey = genkey(32)
flag = flag.ljust(44,'\x00')
for i in range(len(flag)/4):pt = bytes_to_long(flag[i*4:i*4+4])print encrypt(key,pt)
for i in range(2**22):pt = random.getrandbits(32)ct = encrypt(key,pt)print pt,ct

data

2670163133
2168059145
2640667901
1361473960
4285198444
1462920522
1669035357
1836344829
292090312
1735062728
2338346668
3972024911 3661089527
......

注意到,题目代码中的所有运算都是异或与换位,也就是说,如果我们将明文m的二进制表示视作32个不同的变量的话,可以列出一个多元一次方程组。例如以下参数:

pbox1 = [22, 28, 2, 21, 3, 26, 6, 14, 7, 16, 15, 9, 17, 19, 8, 11, 10, 1, 13, 31, 23, 12, 0, 27, 4, 18, 30, 29, 24, 20, 5, 25]
pbox2 = [17, 6, 7, 27, 4, 20, 11, 22, 2, 19, 9, 24, 23, 31, 15, 10, 18, 28, 5, 0, 16, 29, 25, 8, 3, 21, 30, 12, 14, 13, 1, 26]

设明文m为m[0]-m[31]
密钥k为k[0]-k[31]

第一次异或key后的32位:
m[0] ^ k[0], m[1] ^ k[1], …

按照pbox1变换:
m[22] ^ k[22], m[28] ^ k[28], …

第二次异或key:
m[22] ^ k[22] ^ k[0], m[28] ^ k[28] ^ k[1], …

按照pbox2变换:
m[1] ^ k[1] ^ k[17], m[6] ^ k[6] ^ k[6], …

第三次异或key:
m[1] ^ k[1] ^ k[17] ^ k[0], m[6] ^ k[6] ^ k[6] ^ k[1], …

由于我们有后边的明密文对照,所以可以根据明密文对照情况,求出形如k[1] ^ k[17] ^ k[0]的32个值,然后根据里边的参数构造矩阵,用sage求解k[i],即求出了key。再根据key直接写逆算法求出明文

计算k[a] ^ k[b] ^ k[c]

def calckey(plain, cipher):newbox = [1,6,14,29,3,23,9,0,2,31,16,4,27,25,11,15,13,24,26,22,10,20,18,7,21,12,5,17,8,19,28,30]m = list(bin(plain)[2:].rjust(32,'0'))c = list(bin(cipher)[2:].rjust(32,'0'))mm = []for i in newbox:mm.append(m[i])keys = ""for i in range(32):keys += str(ord(mm[i])^ord(c[i]))return keysprint calckey(【plain】, 【cipher】)import random

得到一个序列01001001111000111101111011001100。剩下的部分类似一个32元一次方程做,用sage的矩阵来解题

from sage import *A = Matrix(GF(2),[
[1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0],
[0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1],
[0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1],
[0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0],
[0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0],
[0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0],
[0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0],
[0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0],
[0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1]])
w = vector(GF(2),[0,1,0,0,1,0,0,1,1,1,1,0,0,0,1,1,1,1,0,1,1,1,1,0,1,1,0,0,1,1,0,0])
print A.solve_right(w)


这个转为整数即为key,为1492446066,于是可以写出解密代码

(其实不需要求解key这一步。上一步已经知道了k[0] ^ k[1] ^ k[17],直接用来解明文就好)

逆算法

from libnum import n2spbox1 = [22, 28, 2, 21, 3, 26, 6, 14, 7, 16, 15, 9, 17, 19, 8, 11, 10, 1, 13, 31, 23, 12, 0, 27, 4, 18, 30, 29, 24, 20, 5, 25]
pbox2 = [17, 6, 7, 27, 4, 20, 11, 22, 2, 19, 9, 24, 23, 31, 15, 10, 18, 28, 5, 0, 16, 29, 25, 8, 3, 21, 30, 12, 14, 13, 1, 26]def p(data,pbox):tmp = bin(data)[2:].rjust(32,'0') # 左边补0到总长度32位out = [ tmp[x] for x in pbox ] # 按照pbox重新调整位置return int(''.join(out),2)def rep(data,pbox):tmp = bin(data)[2:].rjust(32,'0')out = [tmp[pbox.index(x)] for x in range(32)]return int(''.join(out),2)def encrypt(key,msg):tmp1 = p(msg^key,pbox1)tmp2 = p(tmp1^key,pbox2)return tmp2^keydef decrypt(key,msg):msg = msg^keymsg = rep(msg, pbox2)msg = msg^keymsg = rep(msg, pbox1)msg = msg^keyreturn msgkey = 1492446066
cipher = [2670163133,2168059145,2640667901,1361473960,4285198444,1462920522,1669035357,1836344829,292090312,1735062728,2338346668]
plain = ""
for i in cipher:plain += n2s(decrypt(key, i))
print plain

flag{843f4cf5-8edc-49e7-9fd2-7cb31840c10f}

【CTF WriteUp】2020全国工业互联网安全技术技能大赛(原护网杯)Crypto题解相关推荐

  1. 2021年江西工业互联网安全技术技能大赛线上初赛Writeup

    文章目录 协议分析 S7协议分析 工控流量分析 异常流量分析 OPC流量分析 应急处置 图片的秘密 现场数据采集 应急恢复 文件分析 组态编程 探索组态密码 恶意程序 恶意app分析 恶意程序分析 固 ...

  2. 2020年江西工业互联网安全技术技能大赛WP

    目录 ## 黑客留下的文件 ## MMS协议分析 ## 常见的对称加密 ## 失窃的文件 ## findbackdoor ## address ## 恶意文件分析 ## 黑客留下的文件 1.前置知识 ...

  3. 江西省2021年工业互联网安全技术技能大赛

    s7协议 0300002402f080320100000003000e00050501120a100200010000830000000004000801.请解读以上协议内容,并准确的拿到此报文返回值 ...

  4. 云计算示范项目_瑞松科技基于工业互联网的设备运维及工艺管理云平台成功入选2020年工业互联网试点示范项目...

    2020年12月28日,工业和信息化部发布2020年工业互联网试点示范项目名单公示,瑞松科技申报项目<基于工业互联网的设备运维及工艺管理云平台>成功入选试点示范项目平台集成创新应用方向,再 ...

  5. 第六届全国工业互联网数据创新应用大赛:工业生产反应装置的建模预测【天池】

    赛题背景 在流程工业中,生产装置将不同原料经过物理或化学反应加工成高附加值产物.在化工领域,这个转变一般是由各类反应器负责完成的.反应装置通过复杂的一系列化学反应,把进料转化为一定浓度的目标产物.生产 ...

  6. 平台优势突出!科东软件被评定为广州开发区2020年工业互联网服务商

    日前,广州市黄埔区人民政府官网发布通知,正式公布了黄埔区.广州开发区2019年工业互联网服务机构暨2020年工业互联网服务商名单,其中科东(广州)软件技术有限公司被评定为2020年工业互联网服务商.  ...

  7. 高职信息安全比赛攻防思路_30.LNGZ2020-30:2020年辽宁省职业院校技能大赛(高职组)“信息安全管理与评估”赛项规程...

    1 2020 年辽宁省职业院校技能大赛 ( 高职组 ) 信息安全管理与评估赛项规程 一.赛项名称 赛项编号: LNGZ2020-30 赛项名称:信息安全管理与评估 英文名称: Information  ...

  8. 育人才,促就业!全国高等学校民航服务技能大赛吸引广泛关注

    近几年,我国民航业的发展进入一段高速期,机场不断扩建.航班不断增加.路线不断丰富--因此,行业对于专业民航人才的需求愈发强烈.每年一届的全国高等学校民航服务技能大赛,也吸引了越来越多民航企事业单位的关 ...

  9. 江苏省计算机技能大赛项目,南通职业大学荣获2020年江苏省职业院校技能大赛计算机网络应用赛项一等奖...

    9月24至26日,2020年江苏省职业院校技能大赛"计算机网络应用"赛项在无锡职业技术学院举行.全省共有38支高职院校代表队共计114名选手参赛. 本次比大赛内容包括无线网络规划与 ...

最新文章

  1. react 打包后,项目部署完毕,刷新页面报错(404)
  2. 中国城中村改造建设前景规划及投融资模式分析报告2022年版
  3. python以下是变量合法命名的是_Python超级详细的变量命名规则
  4. Docker 环境下部署 redash
  5. Java web登录拦截器_SpringMVC拦截器(实现登录验证拦截器)
  6. 网络 一篇博文搞懂五种常见的IO模型
  7. MySQL 数据库入门
  8. 未来十年,你的人生目标在哪里?
  9. java一维数组的使用_Java初步认知和使用一维数组
  10. 通过android手机内置GPS获取平面直角坐标和高斯坐标的原理(附代码)
  11. 每周学习总结11月9日
  12. 卢卡奇总体性原则_读书笔记|卢卡奇物化与无产阶级意识无产阶级的立场(1)...
  13. VTM3.0代码阅读:xCheckRDCostMerge2Nx2N函数
  14. js提交form表单给php,JS提交form表单实例分析
  15. iOS应用程序安全风险及漏洞解析
  16. C语言(爱心表白代码)
  17. Win10 新机,这些必装软件你拥有了吗?美化、写作、下载、效率神器...这篇攻略请收藏...
  18. HTML DOM中的根节点是______,HTML DOM 学习
  19. NVR(网络硬盘录像机)以及其他相近名词DVR、DVS、NVS
  20. 纹理分析及其在医学成像中的应用

热门文章

  1. 标准C函数库头文件、POSIX标准库头文件和Windows API函数库头文件说明
  2. java excel列宽自动换行_Excel单元格中数据如何自动换行以便适应单元格的大小
  3. java的接口常用命名_Java命名和目录接口,Java Naming and Directory Interface,音标,读音,翻译,英文例句,英语词典...
  4. Servlet获取Excel中数据的两种方式
  5. 妇产科护理学试题及答案(整理版)
  6. 初中升高中计算机考试题,初中信息技术中学考试excel操作题.doc
  7. 关于安装cmd命令行安装pyinstaller库失败的解决方法
  8. 我国著名的计算机科学家,我国著名计算机科学家、西安交大郑守淇教授逝世
  9. 可迁移注意力攻击(TAA)
  10. App 抓包利器:Charles 以及 App 爬虫心得