UTCTF2020 hill 希爾密碼

2021-10-08 07:12:29 字數 1427 閱讀 1733

乙個n*n矩陣(加密矩陣) a

乙個英文本串s

記 a=0,b=1,c=2…z=25

先將s轉成數字表示形式.

分組,比如s得到的序列為 x1,x2,x3,x4,x5,x6 n=2,那麼要分成每列兩個元素的矩陣即:

x1 x3 x5

x2 x4 x6

加密過程: 記上述的矩陣為m,得到的密文矩陣為c,則轉化過程為:

(am)%26=c(注意是m左乘乙個a)

解密過程:

m=(a-1 c)%26

一般做題過程中n不會太高.

嘗試n=2 猜測wznqca=utflag(前面的題目有說過類似對應,所以猜測這裡還是這樣)

解對應方程

s=

'wznqcaduqopfkqnwofdbzgeu'

flag_pre=

'utflag'

defgetit

(a1,b1,c1,a2,b2,c2,a3,b3,c3)

:for i in

range(26

):for j in

range(26

):if(a1 * i + b1 * j)%26

== c1 and

(a2 * i + b2 * j)%26

== c2 and

(a3 * i+b3*j)%26

== c3:

return

(i,j)

x1=getit(22,

25,20,

13,16,

5,2,

0,0)

x2=getit(22,

25,19,

13,16,

11,2,

0,6)

import string

flag=

''for i in

range(0

,len

(s),2)

: flag+=string.ascii_letters[

(x1[0]

*string.ascii_letters.index(s[i]

)+x1[1]

*string.ascii_letters.index(s[i+1]

))%26

] flag+=string.ascii_letters[

(x2[0]

*string.ascii_letters.index(s[i]

)+x2[1]

*string.ascii_letters.index(s[i+1]

))%26

]print

(flag)

#utflagdngeruscphertextqq

得到的不是最終答案,需要把原來的 『_』 ','大小寫等補回去.

2020五校聯盟H 虛假的防AK

原題是cfdiv1的一道b題,虛假2000分,其實只是個單調棧板子。題意 先求在乙個任意連續區間裡的最大值和次大值,求二者異或值。然後最終輸出所有異或值的最大值。思路 在任意區間裡找到第乙個比該位置數大的數,便是乙個區間的最大值和次大值了,然後正序逆序各跑一遍,不然會有疏漏,最終單調棧維護o n 解...

2020牛客多校第五場H

乙個數轉為二進位制後,最多有log位,所以減小後的個數最多只有log位,加上二分,複雜度為平方級的,主席樹也是log級的,所以總複雜度為 nlog2n mlogn 可能常數偏大 ac include include include include include include include de...

2020牛客多校第七場H

題目鏈結 任何 1,k 是有效答案。如果 n,k 是有效答案,那麼 n k,k 和 n k,k 都是有效答案。給出t組,n和k 範圍1 1e12 求出 n,k 在n n,k k範圍內的有效個數。在k不變的情況下,n的取值範圍只可能是k的倍數,或者k的倍數 1,可以o 1 算出當前k對應的答案個數。即...