密码与通信

     密码技术是一门历史悠久的技术。信息传播离不开加密与解密。密码技术的用途主要源于两个方面,加密/解密和签名/验签。
 
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. IDEA 公司推出新字体,极度舒适~

    这几天炒得沸沸扬扬的 Intellij IDEA 公司 JetBrains 推出了一种新字体:JetBrains Mono,据说它是专为开发人员设计的,下面栈长带大家一起来吃个瓜. JetBrains ...

  2. java jdk9的特性 jshell

    1.进入 jshell 2.推出 /exit() 和python的解释器用法差不多

  3. ORM基础2 字段及其参数和meta

    一.ORM简介 1.概念:ORM(Object Relational Mappingt ),对象关系映射 2.实质:类与数据库之间的映射 3.优点: 开发人员不用写数据库 4.缺点: 开发人员,数据库 ...

  4. Nginx配置不同端口号映射二级域名

    upstream xx{ #ip_hash; server 127.0.0.1:1008; } server { listen 80; server_name xx.xxx.com; location ...

  5. Bate冲刺博客(3次)

    Bate冲刺博客 课程介绍 课程 (https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience) 作业要求 https://www ...

  6. 时间序列数据库(TSDB)初识与选择

    时间序列数据库(TSDB)初识与选择 本文作者由 MageByte 团队的 「借来方向」编写,关注公众号 给你更多硬核技术 背景 这两年互联网行业掀着一股新风,总是听着各种高大上的新名词.大数据.人工 ...

  7. php--->依赖注入(DI)实现控制反转(IOC)

    依赖注入(DI)实现控制反转(IOC) DI和IOC概念理解 当一个类的实例需要另一个类的实例协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例.而采用依赖注入的方式,创建被调用者的工作 ...

  8. java实现字符串翻转

    public class StringReverse { /*一共写了三个函数func1 func2 func3 * 时间: 2019年9月12日9:00 * func1用的反向输出到一个新的字符串中 ...

  9. Nginx-入门(源码编译安装http://nginx.org/en/download.html)

    比较早的时候  web主要经典组合--->LAMP 近几年---->nginx后来居上--->LNMP=LEMP   Nginx = Engine x Nginx和Apache 都是 ...

  10. OpenCV中Mat与二维数组之间的转换

    ---恢复内容开始--- 在OpenCV中将Mat(二维)与二维数组相对应,即将Mat中的每个像素值赋给一个二维数组. 全部代码如下: #include <iostream> #inclu ...