最近ムービデオを見るために暗号クラスに、教師は非常に良いと感じたが、それは、ほとんどの話をすると、すべての理論的知識、O(∩_∩)O〜ハハ、それCTFゲームを掘削ビットであります暗号の知識は、手の数が実際のケースを解決するならば、私が一瞬のpythonを使用して、質問の特定の種類を達成するための問題解決の方法と理論を組み合わせ、効率が低すぎると思われ、そう。背中の内容の一部のみを必要とするこのブログは、後に更新されます。
上記の暗号化ビデオリンク:https://www.icourse163.org/course/UESTC-1003046001
今日は主要な古典暗号アルゴリズム「換字式暗号」を見て、「代わりにパスワードアルゴリズムの。」まず第一の原則を見ている、その後、Pythonスクリプトを解きます。
1.はじめにパスワードの代替
選択肢は、暗号化された平文は意味の文字列を生成するために、対応する文字を置き換える、文字は1つの平文で交換され、ルックアップテーブルを連続的に暗号化するパスワード置換テーブルを確立することを意味し、すなわち、暗号文キーは、代替パスワードテーブルに置き換えることです。
2.交換するパスワードプレゼンテーション
の代わりにパスワードの(1)単一のテーブル
収入:これはあるため、ここでは単一のテーブル置換暗号のためのpythonです:
どちらか私はに各文字に、このたびの時間の話題をやるのが面倒ですASCIIコードだけでなく、その後、差の様々なコンピューティングのさまざまな...
ああああああO(≧口≦)Oの頭痛は、私はまだこのため、このスクリプトを記述しないでしょう。スクリプトの書き込みもああ長い道のりがまだある私は白だ、私を許して願っています完璧な場所ではありません。運動のこのタイプがある場合は、その時点で、その後、直接アウトラインで使用するには、一部のコード長はギャングが簡略化された場合、あなたは、あなた自身の外観を合理化することができ、そのごちゃ混ぜにあれば良く、私たちと対話することであるため、これは、研究ああ^ _ ^、コメント領域に配置することができます。
単一のテーブルの代わりにパスワード-達成添加暗号:
(= 3、kは、標準的なシーザー暗号です)
#!/usr/bin/python3
#coding:utf-8
#@Author:醉清风
def alphabet_1():
alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZ' #做关于大写字母的代换表(0,1,2...分别对应A,B,..)
alphabet_dict={}
for i in range(0,26):
alphabet_dict[alphabet[i]]=i
return alphabet_dict
def alphabet_2():
alphabet='abcdefghijklmnopqrstuvwxyz' #做关于小写字母的代换表(0,1,2...分别对应a,b,..)
alphabet_dict={}
for i in range(0,26):
alphabet_dict[alphabet[i]]=i
return alphabet_dict
def run1(y,k): #根据x=y-k(mod26)得到对应的明文
m = ''
alphabet_dict = alphabet_1()
for i in y:
x = alphabet_dict[i] - k%26
if(x<0):
x = x + 26
m = m + chr(x+65)
print("k="+str(k)+":"+m)
def run2(y,k): #根据x=y-k(mod26)得到对应的明文
m = ''
alphabet_dict = alphabet_2()
for i in y:
x = alphabet_dict[i] - k%26
if(x<0):
x = x + 26
m = m + chr(x+97)
print("k="+str(k)+":"+m)
def main():
y = input("请输入要解密的内容:")
if(ord(y[0])<97): #判断输入的是大写还是小写
for k in range(0,26):
run1(y,k)
else:
for k in range(0,26):
run2(y,k)
if __name__=="__main__":
main()
シングルテーブルの代わりに、パスワード - パスワードの乗算を実現しました:
#!/usr/bin/python3
#coding:utf-8
#@Author:醉清风
alphabet_dict={}
plain=[]
def alphabet1(k,y): #做k所有可能下的关于大写字母的字符代换表(明文:A,B,C..分别对应密文:A,J,S..)
pwd={}
for i in range(26):
alphabet_dict[chr(((k*i))%26+63)] = chr(i+63)
return alphabet_dict
def alphabet2(k,y): #做k所有可能下的关于小写字母的字符代换表(明文:a,b,c..分别对应密文:a,j,s..)
pwd={}
for i in range(26):
alphabet_dict[chr(((k*i))%26+97)] = chr(i+97)
return alphabet_dict
def run1(y,key): #从代换表中取回密文对应的明文
for k in key:
alphabet_dic = alphabet1(k,y)
for i in y:
plain.append(alphabet_dict[i])
tmp="".join(plain)
k=0
m=len(tmp)
n=int(len(tmp)/12)
for i in range(0,m,n):
print ("k="+str(key[k])+":")
print (tmp[i:i+n])
k=k+1
def run2(y,key): #从代换表中取回密文对应的明文
for k in key:
alphabet_dic = alphabet2(k,y)
for i in y:
plain.append(alphabet_dict[i])
tmp="".join(plain)
k=0
m=len(tmp)
n=int(len(tmp)/12)
for i in range(0,m,n):
print ("k="+str(key[k])+":")
print (tmp[i:i+n])
k=k+1
def main():
y = input("请输入密文:")
key = [1,3,5,7,9,11,15,17,19,21,23,25] #因为(k,26)=1,故取这些值
if(ord(y[0])<97): #判断输入的是大写还是小写
run1(y,key)
else:
run2(y,key)
if __name__=="__main__":
main()
キースクリプトは、「未満26を満たすためにのみ12、すなわち、満足の値、(K、26)= 1、即ち述べたように、kは、kの値は以下の計算python2によって得ることができる、互いに素です。
#!/usr/bin/python2
#coding:utf-8
#@Author:醉清风
def gcd(a,b): #判断来两个数是否互素,辗转相除法
if(b==0):
return a
else:
return gcd(b,a%b)
def main():
y = 26
for x in range(0,26):
if gcd(x,y)==1: #如果两个数的最大公约数是1,那么两数互素。
print x,y
if __name__=="__main__":
main()
シングルテーブル換字式暗号 - アフィン暗号を実現しました:
#!/usr/bin/python3
#coding:utf-8
#@Author:醉清风
alphabet_dict={}
plain=[]
def run1(a,b):
pwd={}
for i in range(26): #做关于大写字母的代换表
alphabet_dict[chr(((a*i+b))%26+63)] = chr(i+63)
return alphabet_dict
def run2(a,b):
pwd={}
for i in range(26): #做关于小写字母的代换表
alphabet_dict[chr(((a*i+b))%26+97)] = chr(i+97)
return alphabet_dict
def main():
y = input("请输入密文:")
print("仿射密码格式:y=ax+b")
a = int(input("请输入a的值:"))
b = int(input("请输入b的值:"))
if(ord(y[0])<97):
alphabet_dict = run1(a,b)
else:
alphabet_dict = run2(a,b)
for i in y:
plain.append(alphabet_dict[i])
print("Flag is : "+"".join(plain))
if __name__=="__main__":
main()
暗号(2)マルチテーブル置換
別の日には、^ _ ^ Pythonはこれを達成するために修正します。