Hill2 希爾密碼 python

2021-09-05 10:16:32 字數 3303 閱讀 2768

#歐幾里得演算法求逆

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...