python的公钥加密示例

前言

        前几篇博文分别介绍了对称加密消息验证码数字签名,本文将介绍公钥加密(非对称加密)的应用示例。为什么会有公钥加密呢?考虑对称加密模型,一个k 个用户的网络需要存储 k(k-1)/2 对秘钥;而公钥加密模型,则只需要存储k 个公钥,k 个私钥。

 

混合加密

        对称加密算法计算效率比公钥加密明显要高,对于充分长的消息,可以通过混合加密组合达到应用效果。当传递一个消息m 时:

(1)发送方先选择一个随机的对称密钥k ,然后用接收方的公钥pk 加密k,得到密文c1;接收方利用自己的私钥sk 解密c1 得到k

(2)通信双方利用k m 使用对称加密算法。

        混合加密算法的安全性证明依赖于∏和∏'的安全性(参考下图),这里不作深入。

 

应用模型

        假如现在 Alice 向 Bob 传送信息m ,为了保证信息传送的保密性真实性完整性不可否认性,采用混合加密,其传送过程为:


Alice 准备好要传送的数字信息m (明文)
Alice 对数字信息进行Hash 运算(md5),得到一个信息摘要(消息验证码)h
Alice 用自己的私钥sk h 进行加密得到数字签名σ
Alice 随机产生一个对称加密密钥k ,利用k m 进行AES加密形成密文c
Alice 用 Bob 的公钥pk' k 进行加密,得到密文c'
Alice 将c'cσ 发送给Bob

Bob 用自己的私钥sk' 对加密的c' 进行解密,得到k
Bob 用k 对收到的密文c 进行解密得到m
Bob 计算m 的消息摘要h
Bob 用 Alice 的公钥pk 验证数字签名Vrfy(h, σ)
Vrfy 算法输出True,则验证了消息的真实性完整性,同时保证了不可否认性

 

RSA加密

        这里直接给出Python的RSA加密示例

KeyGen.py

#!/usr/bin/python
#coding=utf-8

from Crypto.PublicKey import RSA

rsa = RSA.generate(1024)

privatekey = rsa.exportKey()
with open('privatekey.pem', 'w') as f:
    f.write(privatekey)

publickey = rsa.publickey().exportKey()
with open('publickey.pem', 'w') as f:
    f.write(publickey)

Encrypt.py

#!/usr/bin/python
#coding=utf-8

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

publickey = RSA.importKey(open('publickey.pem').read())
enc = PKCS1_v1_5.new(publickey)
ciphertext = enc.encrypt("Thank you mom")

import base64
with open("ciphertext", 'w') as f:
    f.write(base64.encodestring(ciphertext))

Decrypt.py

#!/usr/bin/python
#coding=utf-8

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

key = RSA.importKey(open('privatekey.pem').read())
dec = PKCS1_v1_5.new(key)

with open('ciphertext', 'r') as f:
    ciphertext = f.read()
import base64
ciphertext = base64.decodestring(ciphertext)

from Crypto import Random

print dec.decrypt(ciphertext, Random.new().read)

 

 

转载于:https://my.oschina.net/keyven/blog/831343

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值