RSA暗号化と復号化によるPythonインターフェースの自動化

やあみんな。前回の記事では、Base64、MD5、Sha1、Secret、RSAなど、いくつかの暗号化方式を紹介しましたが、本日は、プロジェクトと組み合わせてRSA暗号化を紹介します。

コンテンツ

1はじめに

タスク1:上司は、機密の作業タスクを割り当てて、CoCoにメッセージを送信したいと考えています。

タスク2:CoCoは、ボスから送信されたメッセージを受信した後、「受信済み」と応答する必要があります。

結果は次のようになります。


1.RSAアルゴリズム暗号化の概要

1はじめに

RSA暗号化アルゴリズムは非对称加密アルゴリズムです。暗号化されたキーは、公開キーと秘密キーで構成されるキーペアです。メッセージの公钥暗号化と復号化に使用され私钥ます。公開キーは公開され、秘密キーはユーザー自身のものです。予約済み。公開鍵は公開されているため、公開鍵を取得した人は誰でも公開鍵を使用して、偽造されたコンテンツを暗号化して送信できます。

セキュリティ上の理由から、メッセージを送信する前に署名するために使用できます。RSA署名では、秘密鍵を使用して署名し、公開鍵を使用して署名を検証します。署名により、ユーザーのIDの一意性を確保し、セキュリティを向上させることができます。

2.暗号化と署名の関係は何ですか?

暗号化と署名はどちらもセキュリティ上の理由からですが、わずかに異なります。簡単に言えば、加密情報の漏洩を防ぐためです签名が情報の改ざんを防ぐためです。


(1)暗号化

タスク1:上司は、機密の作業タスクを割り当てて、CoCoにメッセージを送信したいと考えています。

RSAの暗号化プロセスは次のとおりです。

1. CoCoは一対の鍵(公開鍵と秘密鍵)を生成し、秘密鍵は公開されておらず、CoCoはそれを保持します。公開鍵は公開されており、誰でも取得できます。

2. CoCoは独自の公開鍵をBossに送信し、メッセージをCoCoの公開鍵で暗号化します。

3. CoCoは、Bossによって暗号化されたメッセージを受信し、CoCo自身の秘密鍵を使用してメッセージを復号化します。

このプロセスでは、送信は2回のみです。1回目はCoCoが公開鍵をボスに渡し、2回目はボスがCoCoへのメッセージを暗号化します。両方が敵に傍受された場合でも、 CoCoの秘密鍵のみであるため、危険はありません。メッセージを復号化して、メッセージの内容が漏洩するのを防ぐことができます。

(2)署名

タスク  2: CoCoがBossからメッセージを受信した後、「Received」と応答する必要があります。

RSA署名のプロセスは次のとおりです。

1. CoCoは一対の鍵(公開鍵と秘密鍵)を生成し、秘密鍵は公開されておらず、CoCoはそれを保持します。公開鍵は公開されており、誰でも取得できます。

2. CoCoは、独自の秘密鍵を使用してメッセージに署名して署名を形成し、署名されたメッセージをメッセージ自体と一緒にボスに送信します。

3.ボスはメッセージを受信した後、署名を検証するためにCoCoの公開鍵を取得します。署名の内容がメッセージ自体と一致している場合、メッセージがCoCoによって返信されたことを証明します。

このプロセスでは、配信プロセスは2つだけです。1回目はCoCoが署名されたメッセージとメッセージ自体を上司に送信するためです。2回目は上司がCoCoの公開鍵を取得するためです。メッセージに署名できるのはCoCoの秘密鍵だけなので、メッセージの内容がわかっていても、上司に署名された返信を偽造することはできず、メッセージの内容が改ざんされることはありません。

2つのシナリオを組み合わせると、最初のシナリオでは、傍受されたメッセージはリークされませんが、傍受された公開鍵を使用して偽の命令を暗号化し、CoCoに渡すことができます。2番目のシナリオでは、傍受されたメッセージを改ざんすることはできませんが、公開鍵を使用して署名を検証することでメッセージの内容を取得できます。これにより、漏洩を防ぐことはできません。

したがって、実際のアプリケーションでは、状況に応じて使用する必要があり、暗号化と署名を同時に使用することもできます。たとえば、CoCoとBossには独自の公開鍵と秘密鍵があります。CoCoがメッセージを送信する場合ボス、最初にボスの公開鍵ペアを使用します。メッセージの暗号化、次にCoCoの秘密鍵を使用して暗号化されたメッセージに署名します。これにより、メッセージが漏洩したり改ざんされたりすることがなくなり、メッセージのセキュリティが保証されます。

つまり、公開鍵暗号化、秘密鍵復号化、秘密鍵署名、公開鍵署名検証。

2.PythonはRSA暗号化と復号化を実装します

次に、Pythonを使用して、サードパーティのライブラリを使用してRSA暗号化と署名を実装しますCrypto

1.キーペアを
生成するRSAキーを作成するには、次の手順に従います。  

1. Crypto.PublicKeyパッケージからRSAをインポートして、パスワードを作成します。

2.1024/2048ビットのRSAキーを生成します。  

3. RSAキーインスタンスのexportKeyメソッドを呼び出し、パスワード、使用されるPKCS標準、および暗号化スキームの3つのパラメーターを渡します。

4.秘密鍵をディスク上のファイルに書き込みます。

5.メソッドチェーンを使用して公開鍵メソッドとexportKeyメソッドを呼び出し、公開鍵を生成してディスク上のファイルに書き込みます。

サンプルコードは次のとおりです。

 秘密鍵は次のとおりです。

公開鍵は次のとおりです。

 2.公開鍵暗号化と秘密鍵復号化

(1)公開鍵暗号化


結果は次のようになります。 

luLmeQPdOIgDLDmCvuIK4QmQg6QXxDhvQ1igNVgURfjij/lNC7bqbWznELaGWy3ZnYWvyJoy2YY8RbjVaYSqwL37/Eta9tR+0/RCcMWK1iXOInAxwHiukvHy3itWhYbu2lQcSljBjoF3/IEEGnh7+MF3MoECIlGVlBR9s6jg5ZU=

(2)秘密鍵の復号化

import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5

def decrypt(en_data):
    '''
    en_data:加密过后的数据,传进来是一个字符串
    '''
    # base64解码
    msg = base64.b64decode(en_data)
    # 获取私钥
    privatekey = open('private.pem').read()
    rsakey = RSA.importKey(privatekey)
    # 进行解密
    cipher = PKCS1_v1_5.new(rsakey)
    data= cipher.decrypt(msg, 'DecryptError')
    # 解密出来的是字节码格式,decode转换为字符串
    return data.decode()

if __name__ == '__main__':
    en_data="luLmeQPdOIgDLDmCvuIK4QmQg6QXxDhvQ1igNVgURfjij/lNC7bqbWznELaGWy3ZnYWvyJoy2YY8RbjVaYSqwL37/Eta9tR+0/RCcMWK1iXOInAxwHiukvHy3itWhYbu2lQcSljBjoF3/IEEGnh7+MF3MoECIlGVlBR9s6jg5ZU="
    print(decrypt(en_data))

結果は次のようになります。

ITester软件测试小栈

3.秘密鍵の署名と公開鍵の検証

(1)秘密鍵の署名

 結果は次のようになります。

Eb7mtvQGHCuzOR475TPRCR95Qg4GK1Nhbdw2je83JBxPfD0WiZ1Di/vXgQ8eH9fmh5z80epATF0IGT3Lm4DJTgHq+apuvhtjYNKv4wnz7c5seTuqWXTEjA6h/PomqW/yMC5/cbPr7w+aYEpV+2E+NKc/brUS1e6+pN4vHkaOXwM=

(2)公開鍵の検証

from Crypto.Hash import SHA
from Crypto.Signature import PKCS1_v1_5 as Sig_pk
from Crypto.PublicKey import RSA
import base64

def verify(data,sign) -> bool:
    '''
    :param msg: 明文数据,签名之前的数据
    :param sign:接收到的sign签名
    :return:
    '''
    # base64解码
    data = base64.b64decode(sign)
    # 获取公钥
    key = open('public.pem').read()
    rsakey = RSA.importKey(key)
    # 将签名之前的内容进行hash处理
    sha_name = SHA.new(sign.encode("utf-8"))
    # 验证签名
    signer = Sig_pk.new(rsakey)
    res= signer.verify(sha_name, sign)
    # 验证通过返回True   不通过返回False
    return res

if __name__ == '__main__':
    # 签名之前的内容
    data= "CoCo"
    # 签名数据
    sign="X3Gg+wd7UDh4X8ra+PGCyZFUrG+6jDeQt6ajMA0EjwoDwxlddLzYoS4dtjQ2q5WCcRhxcp8fjEyoPXBmJE9rMKDjEIeE/VO0sskbJiO65fU8hgcqdWdgbVqRryhOw+Kih+I6RIeNRYnOB8GkGD8Qca+n9JlOELcxLRdLo3vx6dw="
    print(verify(data, sign)) 

結果は次のようになります。

False

3.プロジェクトを組み合わせて、RSA暗号化と復号化を実現します

要件:インターフェイスには、タイムスタンプとトークンの最初の50桁の認証が必要であり、RSA公開鍵暗号化を介して署名文字列を取得します。

1.RSA カプセル化

rsaパッケージは、ITesterソフトウェアテストのスモールスタックWeChatパブリックアカウントのバックグラウンドで「」と応答することで受信できますrsa

2.プロジェクト実施との組み合わせ
(1)認証情報の処理

トークンの最初の50桁を生成し、タイムスタンプでスプライシングします。

from time import time
def generator_sign(token):
    # 获取token的前50位
    token_50 = token[:50]
    # 生成时间戳
    timestamp = int(time())
    # print(timestamp)
    # 接拼token前50位和时间戳
    msg = token_50 + str(timestamp)
    print(msg)
    # 进行RSA加密
    sign = rsaEncrypt(msg)
    return sign,timestamp

(2)構成要求情報

リクエストURLとリクエストヘッダーは設定ファイルに保存されます。次の例は.iniファイルに保存されます。

[server]
url=http://ITester.com/xxx
auth_type=xxx.itester

(3)リクエストの処理

リクエストが開始されたときに判断が行われます。auth_typeが構成ファイルで指定されたタイプであり、トークンが空でない場合、暗号化された認証情報が含まれます。(requests_handler.py他のコードは省略)

    if conf.get("server","auth_type") == "xxx.itester" and token is not None:
        from Common.handle_rsa import generator_sign
        sign,timestamp = generator_sign(token)
        data["sign"] = sign
        data["timestamp"] = timestamp

概要:今日は、主にRSAの暗号化と復号化を紹介します。RSAは、暗号化と復号化、およびデジタル署名通信の分野で広く使用されています。公開鍵/秘密鍵アルゴリズムの 加密使用では、主に相手方の公開鍵が使用され、解密秘密鍵签名が使用され、秘密鍵が使用され、验签相手方の公開鍵が使用されます。

私の記事を注意深く読んでくれた皆さんのおかげで、ファンの台頭と注目をずっと見守っていて、ギフト交換の必要性は常にありますが、それはあまり価値のあるものではありませんが、それを使用できれば直接受け取ることができます:

 ①2000を超えるPython電子書籍(主流および古典的な書籍が利用可能である必要があります)

②Python標準ライブラリ情報(最も完全な中国語版)

③プロジェクトのソースコード(40〜50の興味深い古典的なトレーニングプロジェクトとソースコード)

④Python、クローラー、Web開発、ビッグデータ分析の基本的な紹介のビデオ(初心者の学習に適しています)

 

 ⑤Python学習ロードマップ(経験の浅い学習に別れを告げる)

上の写真の情報は私のQQ技術交換グループにあります(技術交換とリソース共有、広告があなたを邪魔するためにやって来ます)

グループ番号953306497(「csdn111」に注意)の無料情報は、著者の10年以上のテストキャリアの本質です。一緒に技術を交換する仲間の神もいます。

おすすめ

転載: blog.csdn.net/ZangKang1/article/details/122990382