密码与通信

     密码技术是一门历史悠久的技术。信息传播离不开加密与解密。密码技术的用途主要源于两个方面,加密/解密和签名/验签。
 
pip install pycrypto

RSA 密码算法与签名

     RSA是一种公钥密码算法,RSA的密文是对代码明文的数字E次方求mod N的结果。也就是将明文和自己做E次乘法,然后再将其结果除以N求余数,余数就是密文。RSA也是一个简洁的加密算法。E和N的组合就是公钥(public key)
 
     对RSA的解密,即密文的数字的D次方求mod N即可,即密文和自己做D次乘法,在对结果除以N求余数即可得到明文。D和N的组合就是私钥(private key)
 
     算法的加密和解密还是很简单的,可是公钥和私钥的生成算法却不是随意的。使用Pucrypto生成秘钥对很简单,我们分别为Master和Ghost各生成一对属于自己的密钥对。
 
from Crypto import Random
from Crypto.PublicKey import RSA # 伪随机数生成器
random_generator = Random.new().read
# rsa算法生成实例
rsa = RSA.generate(1024, random_generator) # master的秘钥对的生成
private_pem = rsa.exportKey()
# 私钥
with open('master-private.pem', 'w') as f:
f.write(private_pem)
# 公钥
public_pem = rsa.publickey().exportKey()
with open('master-public.pem', 'w') as f:
f.write(public_pem)
 # master-private.pem
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCiVxAofpOL1lxbs2/66fXQksBd6Dc5PsB4vtpcBYbyxEp5CBCX
5pN0/NbVFwiyg/aOv5vvBXUMTsQkhr6kJXLmM9chVuPkedwQ7FESe7oLFNxuaDjZ
hYM9RasDJ4rE2NMwSN1M54mw6ZVpzPnRpnrawbZSzLkEOOvywmephmuHvwIDAQAB
AoGAPi6ZGtm5DHQ0dk+aEgMxzA2aL542IPA/a0C3hU38rdqwKAIF0RlZ3BLI+2BS
TYasl2sfgIOXnPpCuTb/qQJLKvP903yOjQDjnNAn2wp24FQKhhVzlaOwwiyHRN/U
LoUhcaaGFnGNL6r4E4ZM9beBLVVdn+g1bJn2HQawlVlGw9ECQQDLcSrUgzbuQeRi
HT3Q/HnDiVk7WXu4laJ/NRpTPj2HxjjaS2nI8IP/ndZvg7OU5Xc5tLkWh3b5RUgU
J7u6nJqJAkEAzEeUCJ0Df+i4zieu1ER9NUV6Ml9kFwCTAF7TzNAj5K1SZfSK9i1k
BbKxhEUdr8aYgReqhQkwqD6WEpI/Iv1eBwJAQF3Cvk/xjjpcxsoXp8ppv/rxt3xd
T45QRk0H0jSMBSwrCq33fzLRoItQsCGMLNzY9vH96Wncs4s+/dmAZM9teQJBAJjK
KMTQe5+d9yvqrm8B0wyXLLCkfH5f5ZNvWcdlHpOZt3mekJlUle1VHEUsVOn2Bnb3
tojOuN/9/81gKW0ISN0CQFMEyymdqARaTKrSpzYXkerE987TQJdaP6VVjNaBnbv+
VzAHW5qTJgcP/sABfw3dQ4+ocTU8yVTlBgtleeHmZxg=
-----END RSA PRIVATE KEY----- # master-public.pem -----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiVxAofpOL1lxbs2/66fXQksBd
6Dc5PsB4vtpcBYbyxEp5CBCX5pN0/NbVFwiyg/aOv5vvBXUMTsQkhr6kJXLmM9ch
VuPkedwQ7FESe7oLFNxuaDjZhYM9RasDJ4rE2NMwSN1M54mw6ZVpzPnRpnrawbZS
zLkEOOvywmephmuHvwIDAQAB
-----END PUBLIC KEY-----

生成的私钥和公钥

加密与解密

     通常通信的时候,发送者使用接受者的公钥加密,接受者使用接受者秘钥进行解密。
     
     简而言之,Master给Ghost通信,需要加密内容,那么Ghost会生成一个秘钥对,Ghost的公钥ghost-public.pem和私钥ghost-private.pem 。 ghost把公钥公开给发送者,任何人都可以用来加密,然后Master使用ghost-public.pem 进行加密,然后把内容发送给Ghost,ghost再使用ghost-private.pem进行解密。
 
 
import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5 # 加密内容
message = "hello"
# 加密
with open('master-public.pem', 'r') as f:
key = f.read()
rsakey = RSA.importKey(key)
cipher = Cipher_pkcs1_v1_5.new(rsakey)
cipher_text = base64.b64encode(cipher.encrypt(message))
print(cipher_text)
# IpAX4ZynawSsxI4/0RGEHpFT/U2E7VXDLN36+QONelxnid5jziq/Epk6Xsv3iBEWvRdmdcTYf/0zBHnnwg515K/
# a45JeaKV/DQwc2Qeq+lsFBuDyUFN/RnC6zGTMUzkAzCmbVH3NPiX9UzZo6Rjr7y2Zm6zUWsLgL/D3/QDh/IU= # 解密
with open('master-private.pem', 'r') as f:
key = f.read()
rsakey = RSA.importKey(key)
cipher = Cipher_pkcs1_v1_5.new(rsakey)
text = cipher.decrypt(base64.b64decode(cipher_text), random_generator)
print(str(text)) # hello

签名与验签

当然,对于窃听者,有时候也可以对伪造Master给Ghost发送内容。为此出现了数字签名。也就是Master给Ghost发送消息的时候,先对消息进行签名,表明自己的身份,并且这个签名无法伪造。具体过程即Master使用自己的私钥对内容签名,然后Ghost使用Master的公钥进行验签。
import base64
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA, MD5
from Crypto.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5 message = "hello"
# 签名
with open('master-private.pem', 'r') as f:
key = f.read()
rsakey = RSA.importKey(key)
signer = Signature_pkcs1_v1_5.new(rsakey)
digest = SHA.new() # MD5.new()
digest.update(message)
sign = signer.sign(digest)
signature = base64.b64encode(sign)
print(signature)
# JpDhJPGl1MG5T2l5aggPBMbIzjKqyYmB7Q3MkqbJtj1Z5FVSP6dTthspEVrFarNxA51hx5mLbbs9mLCFK++dy4z
# QdpgkSjBgyisWBHCKDbgskvu8DZCn6STZ0o0Ml9r+h4Oj++JX3SwmUNjzEYIgdp3jTIh12bZzgfoJmY8k4Rk= # 验签
with open('master-public.pem', 'r') as f:
key = f.read()
rsakey = RSA.importKey(key)
verifier = Signature_pkcs1_v1_5.new(rsakey)
digest = SHA.new()
digest.update(message)
is_verify = verifier.verify(digest, base64.b64decode(signature))
print(is_verify) # True

总结

rsa提供了比较完善的加密算法。RSA广泛用于加密与解密,还有数字签名通信领域。使用Publick/Private秘钥算法中,加密主要用对方的公钥,解密用自己的私钥。签名用自己的私钥,验签用对方的公钥。
 
加密解密:公钥加密,私钥解密
签名验签:私钥签名,公钥验签
无论是加密机密还是签名验签都使用同一对秘钥对
 

Pycrypto与RSA密码技术的更多相关文章

  1. Pycrypto与RSA密码技术笔记

    密码与通信 密码技术是一门历史悠久的技术.信息传播离不开加密与解密.密码技术的用途主要源于两个方面,加密/解密和签名/验签 在信息传播中,通常有发送者,接受者和窃听者三个角色.假设发送者Master想 ...

  2. 杂项之python利用pycrypto实现RSA

    杂项之python利用pycrypto实现RSA 本节内容 pycrypto模块简介 RSA的公私钥生成 RSA使用公钥加密数据 RSA使用私钥解密密文 破解博客园登陆 pycrypto模块简介 py ...

  3. 密码技术之密钥、随机数、PGP、SSL/TLS

    第三部分:密码技术之密钥.随机数.PGP.SSL/TLS 密码的本质就是将较长的消息变成较短的秘密消息——密钥. 一.密钥 什么是密钥? (1)密钥就是一个巨大的数字,然而密钥数字本身的大小不重要,重 ...

  4. 公钥密码之RSA密码算法大素数判定:Miller-Rabin判定法!

    公钥密码之RSA密码算法大素数判定:Miller-Rabin判定法! 先存档再说,以后实验报告还得打印上交. Miller-Rabin大素数判定对于学算法的人来讲不是什么难事,主要了解其原理. 先来灌 ...

  5. 密码学笔记(2)——RSA密码

    上一篇笔记中讲述了大量的代数知识,这一篇中我们看看如何将这些代数知识应用到RSA密码体制中. 一.公钥密码学简介 在经典密码学的研究模型中,我们根据已选择的秘钥K得到一条加密规则$e_{k}$和一条解 ...

  6. 了解SSL必须要懂得密码技术

    要理解SSL就必须理解密码系统.消息摘要函数(单向或散列函数)和数字签名,这些技术是许多文献所讨论的主题(比如[AC96),提供了保密性.完整性和认证的基础. 密码系统 假设Alice想给她的银行发一 ...

  7. 《图解密码技术》-chaper1-概述

    密码和信息安全常识:  (1)不要使用保密的密码算法.  (2)不要使用低强度密码算法.  (3)密码一定会被破解.  (4)密码只是信息安全的一部分.

  8. 使用TortoiseGit和Git Bash不需要输入RSA密码(passphrase)的方法

    1. 安装和配置Putty 安装 官网下载Putty并安装. 生成ppk密钥 打开puttygen.exe(C:\Program Files\PuTTY\puttygen.exe), 点Convers ...

  9. 【密码技术】Part 4 SSL/TLS

    01 SSL/TLS基本概念 02 TLS协议流程图

随机推荐

  1. dp-完全背包(题)

    理解了这道题 , 我感觉对背包又有了一个更深的认识 …… HDU  2159 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务.久而久之xhd开始对杀怪产生的厌恶感, ...

  2. 数据可视化之Matplotlib的使用

    1.什么是数据可视化 数据可视化在量化分析当中是一个非常关键的辅助工具,往往我们需要通过可视化技术,对我们的数据进行更清晰的展示,这样也能帮助我们理解交易.理解数据.通过数据的可视化也可以更快速的发现 ...

  3. 关于在读取excel的文件时候,放在服务器上就报路径错误

    就是指定这个路径:C:\Program Files (x86)\IIS Express 因为在上传到服务器的时候,服务器读取的是在服务器上的路径,所以正确的思路应该是 把上传的Excel存在服务器上, ...

  4. 实战_Spring_Cloud

    目录 前言 开发环境 源码地址 创建工程 服务注册中心(Eureka) Eureka Server Eureka Client 注册中心高可用 小结 负载均衡(Ribbon) RestTemplate ...

  5. 开源导入导出库Magicodes.IE 导出教程

    要点 导出特性 如何导出Excel表头 如何导出数据.如何进行数据的切割.如何使用筛选器 导出特性 ExporterAttribute Name: 名称(当前Sheet 名称) HeaderFontS ...

  6. python 装饰器-初识

    一.装饰器的形成过程 1.函数无参数,无返回值 import time def f1(): # 无参数,无返回值 time.sleep(1) print("Hello, World!&quo ...

  7. Dynamics email的subject标题出现 CRM:0000xxxx

    怎样移除email subject标题中出现的CRM:0000xxxx Settings->Administration->System Settings->Email->Un ...

  8. ReactNative---android系统中Image组件无默认图片问题

    react native的Image组件通过网络地址加载图片的时候,若加载失败iOS有默认图片等属性,但安卓没有:但可以通过其他方式来实现: {Platform.OS == 'android'?< ...

  9. ajax--->http头信息的content-type是application/x-www-form-urlencoded或application/json区别

    ajax请求时http头信息的content-type是application/x-www-form-urlencoded或application/json区别 content-type请求头是干嘛的 ...

  10. oracle问题之数据库恢复(三)

    可能很多人在做数据库恢复时,都遇到过如下错误: SQL> recover database; ORA: recovery session canceled due to errors ORA: ...