#歐幾里得演算法求逆
def euclid(a,b=26):
x1 = 1
x2 = 0
x3 = a
y1 = 0
y2 = 1
y3 = b
while y3 != 0 :
q = int(x3/y3)
t1 = x1-q*y1
t2 = x2-q*y2
t3 = x3-q*y3
x1 = y1
x2 = y2
x3 = y3
y1 = t1
y2 = t2
y3 = t3
if x1<0:
x1 = x1+b
return x1
#求模m的逆矩陣
def want1(x):
a=x[0,0]
b=x[0,1]
c=x[1,0]
d=x[1,1]
k=a*d-b*c
k=euclid(k)
x1=[[(k*d)%26,(-k*b)%26],[(-k*c)%26,(k*a)%26]]
return x1
#加密def hill2encrypt(c1,a):
c11=[0,0]
c1111=
for i in range(len(c1)):
if c1[i]=='z':
c1[i]='`'
for i in range(len(c1)):
if i%2==0:
c11[0]=ord(c1[i])-96
else:
c11[1]=ord(c1[i])-96
strc11=str(c11[0])+';'+str(c11[1])
c111=fw.mat(strc11)
c111=a*c111
x=chr((int(c111[0][0]))%26+96)
y=chr((int(c111[1][0]))%26+96)
if x=='`':
x='z'
if y=='`':
y='z'
c112=x+y
c1111=''.join(c1111)
print('加密後為',c1111)
#解密#def hill2decrypt(d1):
def hill2decrypt(d1,a1):
d11=[0,0]
d1111=
for i in range(len(d1)):
if d1[i]=='z':
d1[i]='`'
for i in range(len(d1)):
if i%2==0:
d11[0]=ord(d1[i])-96
else:
d11[1]=ord(d1[i])-96
strd11=str(d11[0])+';'+str(d11[1])
d111=fw.mat(strd11)
d111=a1*d111
x=chr((int(d111[0][0]))%26+96)
y=chr((int(d111[1][0]))%26+96)
if x=='`':
x='z'
if y=='`':
y='z'
d112=x+y
d1111=''.join(d1111)
print('解密後為',d1111)
#開始print("請輸入一段4字母的用hill2加密的明文和其密文(線性無關)")
a = input('明文為:')
b = input('密文為:')
c = input('想要加密的明文為:')
d = input('想要解密的密文為:')
'''a='taco'
b='ucrs'
c='clintonisgoingtovisitacountryinmiddleeastt'
d='ojwpiswazuxauuiseabaucrsiplbhaammlpjjotenh'
'''#輸入已知的明文和密文
a=list(a)
for i in range(4):
if a[i]=='z':
a[i]=='`'
a[0]=str(ord(a[0])-96)+' '
a[1]=str(ord(a[1])-96)+' '
a[2]=str(ord(a[2])-96)+';'#abcdefghijklmnopqrstuvwxyz
a[3]=str(ord(a[3])-96) #cfglkroxsdwjapevibmhqnutyz
a[1],a[2]=a[2],a[1]
a=''.join(a)
b=list(b)
for i in range(4):
if b[i]=='z':
b[i]=='`'
b[0]=str(ord(b[0])-96)+' '
b[1]=str(ord(b[1])-96)+' '
b[2]=str(ord(b[2])-96)+';'
b[3]=str(ord(b[3])-96)
b[1],b[2]=b[2],b[1]
b=''.join(b)
#a,b變為矩陣
a1 = fw.mat(a)
b1 = fw.mat(b)
'''print('a1:\n',a1)
print('b1\n',b1)
'''a=b1*want1(a1)
a1=want1(a)
'''print(a1)'''
#對要明文和密文操作
c1=list(c)
d1=list(d)
print('a:\n',a)
print('a1:\n',a1)
hill2encrypt(c1,a)
hill2decrypt(d1,a1)
UTCTF2020 hill 希爾密碼
乙個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,則轉化...
2 希爾排序
是對插入排序的改進,也叫作縮減增量排序。屬於原址排序。1 思路 先取乙個小於n 陣列長度 的整數d1作為第乙個增量,把檔案的全部記錄分成 n d1 個組。所有距離為d1的倍數的記錄放在同乙個組中。先在各組內進行直接插入排序 然後,取第二個增量d2 2 複雜度分析 2.1 時間複雜度 o o 1 3 ...
排序 2 希爾排序
我們來談一談希爾排序 希爾排序和直接插入排序一樣屬於插入排序,但是由於分組的存在,相等的元素可能分在不同組,導致他們的次序可能發生變化,所以它是不穩定的排序。除此之外由於它移動次數較少所以它比直接插入排序時間效能優越,效率更高。時間複雜度 最好情況 o n 最壞情況 o n2 平均情況 o n1.3...