funcd(j int) { for i := 1; i < 10; i++ { fmt.Println("D:", j, i*i) } } funcmain() { for i := 0; i < 10; i++ { go d(i) } runtime.Gosched() println("main") //并不一定表示主协程结束
funccounter(out chan<- int) { for i := 0; i < 123; i++ { out <- i } close(out) }
funcsquarer(out chan<- int, in <-chanint) { for i := range in { out <- i * i } close(out) } funcprinter(in <-chanint) { for i := range in { fmt.Println(i) } }
funcmain() { ch1 := make(chanint) ch2 := make(chanint) go counter(ch1) go squarer(ch2, ch1) printer(ch2) }
''' n = 26563847822899403123579768059987758748518109506340688366937229057385768563897579939399589878779201509595131302887212371556759550226965583832707699167542469352676806103999861576255689028708092007726895892953065618536676788020023461249303717579266840903337614272894749021562443472322941868357046500507962652585875038973455411548683247853955371839865042918531636085668780924020410159272977805762814306445393524647460775620243065858710021030314398928537847762167177417552351157872682037902372485985979513934517709478252552309280270916202653365726591219198063597536812483568301622917160509027075508471349507817295226801011 e = 65537 ck = 8371316287078036479056771367631991220353236851470185127168826270131149168993253524332451231708758763231051593801540258044681874144589595532078353953294719353350061853623495168005196486200144643168051115479293775329183635187974365652867387949378467702492757863040766745765841802577850659614528558282832995416523310220159445712674390202765601817050315773584214422244200409445854102170875265289152628311393710624256106528871400593480435083264403949059237446948467480548680533474642869718029551240453665446328781616706968352290100705279838871524562305806920722372815812982124238074246044446213460443693473663239594932076
// 并发搜索 found := false var foundSecret *big.Int limitJ := 1 << 18 chunkSizeJ := limitJ / numWorkers
var mu sync.Mutex for c := 0; c < numWorkers; c++ { start := c * chunkSizeJ end := (c + 1) * chunkSizeJ wg.Add(1) gofunc(start, end int) { defer wg.Done() for j := start + 1; j <= end; j++ { if found { return } jBig := new(big.Int).SetInt64(int64(j)) powJ := new(big.Int).Exp(jBig, e, n) s := new(big.Int).Mul(inv_ck, powJ) s.Mod(s, n)
if val, ok := dic.Load(s.String()); ok { i := val.(int) // 强转为 int iBig := new(big.Int).SetInt64(int64(i)) secret := new(big.Int).Mul(iBig, jBig) fmt.Printf("j=%d,i=%d", j, i) mu.Lock() if !found { found = true foundSecret = secret } mu.Unlock() return } } }(start, end) } wg.Wait()
if found { data := []byte(foundSecret.String()) h := md5.Sum(data) flag := fmt.Sprintf("NSSCTF{%x}", h) fmt.Println("FLAG:", flag) } else { fmt.Println("搜索完成,但未找到匹配项。") } }