python 3+公式ライブラリrsaは暗号化、復号化、署名を実現


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
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後記とまとめ
暗号学は安全な通信の基礎の中の基礎であり、重要であることは間違いないが、どのように安全な鍵を生成し、鍵を管理し、鍵の漏洩を防止するかがスタッフの注意すべき点の一つである.その後、鍵生成および鍵管理に関する内容を更新する時間がありますので、間違ったところをご指摘ください.