python 3+公式ライブラリrsaは暗号化、復号化、署名を実現
4606 ワード
0 x 00はじめに
学校のネットの安全な実験、私は暗号学に対して本当に风邪を引かないで、しかし私达の学院はこのように特别で、ネットの工事も暗号学を学ばなければならなくて、その上数学期缲り返し同じものを教えて、间违いなくて、あなたです(XD university).原理部分は次回に書きます.
0 x 01実験要求
実験は1与えられた素数pとq,公開鍵e,計算d p=11を要求する.q=13; e=11; d=?? p=17; q=11; e=7; d=?? p=5; q=11; e=3; d=?? 実験要求2自分で計算した公開鍵ペア、およびp,q,設計プログラムに基づいて、RSAの暗号化と復号暗号化を実現する:入力明文、鍵、出力密文復号:入力密文、鍵、出力明文実験要求3自分で計算した公開鍵ペアに基づいて、およびp,q,設計プログラム、実現RSAの署名と検証署名:入力メッセージ、鍵、出力署名メッセージ検証:入力署名メッセージ、鍵、原文を出力する
0 x 02コードと実装
1、計算d
2、暗号化と復号化
3、署名と署名の検証(私は本当にこれにツッコミを入れたいです.先生は私にhashを使わせてはいけませんか.どうして私に原文を出力させますか!!!!
注意:p*qの値はmessageの値より大きくなければなりません.そうしないとエラーになります.つまり、asciiでやると、p=17、q=11でmessageの値は187未満でなければなりません.だから、ここではアルファベットを1文字だけ選んで検証します.
0 x 03注意事項
実はこの実験は本当に简単で、理论の部分はあなたが分からなくてもすることができますが、この実験が最も気持ち悪いのはpythonの中で各种の16進数、10進数の文字列、メッセージの文字列の间の各种の変化で、私が最も时間をかけたのはこれで、復号と署名をプラスして基本的に10数分で书きました.もちろん、今回の実験自体が鍵の生成部分の内容を持っていないためです.そうしないと、やはり时間がかかります.
0 x 04後記とまとめ
暗号学は安全な通信の基礎の中の基礎であり、重要であることは間違いないが、どのように安全な鍵を生成し、鍵を管理し、鍵の漏洩を防止するかがスタッフの注意すべき点の一つである.その後、鍵生成および鍵管理に関する内容を更新する時間がありますので、間違ったところをご指摘ください.
学校のネットの安全な実験、私は暗号学に対して本当に风邪を引かないで、しかし私达の学院はこのように特别で、ネットの工事も暗号学を学ばなければならなくて、その上数学期缲り返し同じものを教えて、间违いなくて、あなたです(XD university).原理部分は次回に書きます.
0 x 01実験要求
実験は1与えられた素数pとq,公開鍵e,計算d p=11を要求する.q=13; e=11; d=?? p=17; q=11; e=7; d=?? p=5; q=11; e=3; d=?? 実験要求2自分で計算した公開鍵ペア、およびp,q,設計プログラムに基づいて、RSAの暗号化と復号暗号化を実現する:入力明文、鍵、出力密文復号:入力密文、鍵、出力明文実験要求3自分で計算した公開鍵ペアに基づいて、およびp,q,設計プログラム、実現RSAの署名と検証署名:入力メッセージ、鍵、出力署名メッセージ検証:入力署名メッセージ、鍵、原文を出力する
0 x 02コードと実装
1、計算d
def find_d(e, s):
for d in range(s):
x = (e * d) % s
if x == 1:
return d
if __name__ == '__main__':
p = input("what's your p ?")
q = input("what's your q ?")
e = int(input("what's your e ?"))
s = (int(p)-1) * (int(q)-1)
print(s)
print(find_d(e, s))
2、暗号化と復号化
import rsa
def str2_ascii_int(string1):
xx = ""
for i in string1:
xx = xx + hex(ord(i))[2:]
return int(xx, 16)
def ascii_int2str(num1):
xx = hex(num1)[2:]
i = 0
sign_name = ""
while i < len(xx) / 2:
current_str = xx[2 * i:2 * i + 2]
real = chr(int(current_str, 16))
sign_name = sign_name + real
i = i + 1
return sign_name
def encryption(plaintext, e, n):
cryptotext = pow(plaintext, e) % n
return cryptotext
def decryption(cryptotext, d, n):
plaintext = pow(cryptotext, d) % n
return plaintext
# this part is mainly for signature, in the part, the public key will be used for decryption and the private key will be
# used for encryption, but why? Because the public key is open for everyone, and the private key is just for the owner.
# if you want anyone else to recognize you as xxx, you should offer the other one a signature ,because the signature is
# encrypted by private key, so no one else can get the same signature expect the loss of the private key.
if __name__ == '__main__':
key = rsa.newkeys(32)
n = key[1].n
e = key[1].e
d = key[1].d
plaintext = input("what's your plaintext ?")
print("the plaintext is : ", plaintext)
cryototext = encryption(str2_ascii_int(plaintext), e, n) # ,
print("the cryptotext is : ", cryototext)
recognize_name = ascii_int2str(decryption(cryototext, d, n)) # ,
print(str(recognize_name))
3、署名と署名の検証(私は本当にこれにツッコミを入れたいです.先生は私にhashを使わせてはいけませんか.どうして私に原文を出力させますか!!!!
注意:p*qの値はmessageの値より大きくなければなりません.そうしないとエラーになります.つまり、asciiでやると、p=17、q=11でmessageの値は187未満でなければなりません.だから、ここではアルファベットを1文字だけ選んで検証します.
import rsa
def str2_ascii_int(string1):
xx = ""
for i in string1:
xx = xx + hex(ord(i))[2:]
return int(xx, 16)
def ascii_int2str(num1):
xx = hex(num1)[2:]
i = 0
sign_name = ""
while i < len(xx) / 2:
current_str = xx[2 * i:2 * i + 2]
real = chr(int(current_str, 16))
sign_name = sign_name + real
i = i + 1
return sign_name
def encryption(plaintext, e, n):
cryptotext = pow(plaintext, e) % n
return cryptotext
def decryption(cryptotext, d, n):
plaintext = pow(cryptotext, d) % n
return plaintext
# this part is mainly for signature, in the part, the public key will be used for decryption and the private key will be
# used for encryption, but why? Because the public key is open for everyone, and the private key is just for the owner.
# if you want anyone else to recognize you as xxx, you should offer the other one a signature ,because the signature is
# encrypted by private key, so no one else can get the same signature expect the loss of the private key.
if __name__ == '__main__':
key = rsa.newkeys(16) # , ,
n = key[1].n
e = key[1].e
d = key[1].d
sig_name = input("what's your name ?")
print("your name is : ", sig_name)
signature = encryption(str2_ascii_int(sig_name), d, n) # ,
print("the signature is : ", signature)
recognize_name = ascii_int2str(decryption(signature, e, n)) # ,
print(str(recognize_name))
0 x 03注意事項
実はこの実験は本当に简単で、理论の部分はあなたが分からなくてもすることができますが、この実験が最も気持ち悪いのはpythonの中で各种の16進数、10進数の文字列、メッセージの文字列の间の各种の変化で、私が最も时間をかけたのはこれで、復号と署名をプラスして基本的に10数分で书きました.もちろん、今回の実験自体が鍵の生成部分の内容を持っていないためです.そうしないと、やはり时間がかかります.
0 x 04後記とまとめ
暗号学は安全な通信の基礎の中の基礎であり、重要であることは間違いないが、どのように安全な鍵を生成し、鍵を管理し、鍵の漏洩を防止するかがスタッフの注意すべき点の一つである.その後、鍵生成および鍵管理に関する内容を更新する時間がありますので、間違ったところをご指摘ください.