やあみんな。前回の記事では、Base64、MD5、Sha1、Secret、RSAなど、いくつかの暗号化方式を紹介しましたが、本日は、プロジェクトと組み合わせてRSA暗号化を紹介します。
コンテンツ
タスク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年以上のテストキャリアの本質です。一緒に技術を交換する仲間の神もいます。