python RSA

零:认识

如果没有 RSA 算法,现在的网络世界毫无安全可言,也不可能有现在的网上交易。上一篇文章 ssh 协议为什么安全 中的 ssh 协议也是基于 RSA 加密算法才能确保通讯是加密的,可靠的。

1976年以前,所有的加密方法都使用对称加密算法:加密和解密使用同一套规则。例如:甲使用密钥 A 加密,将密文传递给乙,乙仍使用密钥 A 解密。如果密钥 A 在甲传递给乙的过程中泄露,或者根据已知的几次密文和明文推导出密钥 A,则甲乙之间的通讯将毫无秘密。

1976年,两位美国计算机学家 Whitfield Diffie 和 Martin Hellman,提出了一种崭新构思,可以在不传递密钥的情况下,完成解密。这被称为 Diffie-Hellman密钥交换算法
假如甲要和乙通讯,甲使用公钥 A 加密,将密文传递给乙,乙使用私钥 B 解密得到明文。其中公钥在网络上传递,私钥只有乙自己拥有,不在网络上传递,这样即使知道了公钥 A 也无法解密。反过来通讯也一样。只要私钥不泄漏,通信就是安全的,这就是非对称加密算法。

1977年,三位数学家 Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。算法用他们三个人的名字命名,叫做 RSA 算法。直到现在,RSA 算法仍是最广泛使用的"非对称加密算法"。毫不夸张地说,只要有计算机网络的地方,就有 RSA 算法。

一:python RSA-package

#生成秘钥和私钥
import rsa
(pubkey, privkey) = rsa.newkeys(512)
#加密和解密
import rsa
#1
#bob create public_key and private_key 
(bob_pubkey, bob_privkey) = rsa.newkeys(512)
#2
#alice get the public_key from bob and use public_key to send message to bob
message = "hello bob".encode("utf-8")
crypto = rsa.encrypt(message, bob_pubkey)
#3
#bob recv the message and use his private_key to read the message
message = rsa.decrypt(crypto, bob_privkey)
print(message.decode("utf-8"))

#RSA只能加密 比RSA编码程度小的数据;例如,一个512位密钥可以编码一个53字节的消息
#(512位= 64字节,其中11个字节用于随机填充和其他填充)
#保存私钥和公钥 #读取私钥和公钥
#write
import rsa

(pubkey, privkey) = rsa.newkeys(512)
pub_pkcs = pubkey.save_pkcs1()
pubfile = open('public.pem', 'wb+')
pubfile.write(pub_pkcs)
pubfile.close()

priv_pkcs = privkey.save_pkcs1()
prifile = open('private.pem', 'wb+')
prifile.write(priv_pkcs)
prifile.close()

#read
import rsa

with open('public.pem') as publickfile:
    p = publickfile.read()
    pubkey = rsa.PublicKey.load_pkcs1(p)
    print(pubkey)

with open('private.pem') as privatefile:
    p = privatefile.read()
    privkey = rsa.PrivateKey.load_pkcs1(p)
    print(privkey)
#签名 和 验证
# 理解:http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
# 对message 通过加密生成 digest
# 再利用私钥对digest加密生成signature
# 将message + signature传送数据

# sign
message = 'Go left at the blue tree'.encode("utf-8")
hash = rsa.compute_hash(message, 'SHA-1')
signature = rsa.sign_hash(hash, private_key, 'SHA-1')
print(signature)

#verify
try:
	message = 'Go left at the blue tree'.encode("utf-8")
	tof = rsa.verify(message, signature, public_key)
	print(tof)
except Exception:
	print("verify wrong")

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值