一、题目
1、用Python或Sage实现RSA算法的加密、解密、签名/验证签名
2、用Python或Sage实现DH秘钥交换协议的。
3、请提交代码的网页链接,不要提交代码压缩包。
二、平台
Anaconda的spyder ( Python3.6 )
三、安装rsa模块(参考文章: Python进行RSA加密 Python 安装RSA模块 )
(1)Python中的一些模块是用一个包管理器来发布的,RSA模块就是这样,所以首先需要安装setup tools工具
下载文件:ez_setup.py
(2) 用python解释执行它
(3) 安装完成后,会在scripts文件夹下生成几个exe可执行文件。(如: f:\Python3.6\Scripts目录下)
(4) 下载RSA安装包:rsa-3.1.1-py3.2.egg
(5)把之前下载的文件rsa-3.1.1-py3.2.egg拷贝到f:\Python3.6\Scripts目录下, 然后在cmd中cd到D:\Python3.6\Scripts目录下,用这个命令执行egg文件:easy_install.exe rsa-3.1.1-py2.7.egg
四、实现过程
import rsa
"生成公钥和私钥"
(mypubkey,myprivkey)=rsa.newkeys(1024)
"保存密钥"
with open('./mypublic.pem','w') as f:f.write(mypubkey.save_pkcs1().decode())
with open('./myprivate.pem','w') as f:
f.write(myprivkey.save_pkcs1().decode())
"导入密钥"
with open("./mypublic.pem","r") as f:
mypubkey = rsa.PublicKey.load_pkcs1(f.read().encode())
with open("./myprivate.pem","r") as f:
myprivkey = rsa.PrivateKey.load_pkcs1(f.read().encode())
"明文"
message = "HelloWorld"
"公钥加密encrypt"
def encrypt(message):
PublicKey=open("./mypublic.pem","r")
encryptor = rsa.encrypt(message.encode(), mypubkey)
enData=encryptor.encrypt(message,0)
file=open("./crypt.txt","enc")
file.write(enData[0])
file.close()
if __name__=="__main__":
encryptedThingy=encrypt("message")
"私钥解密"
def decrypt():
PrivateKey=open("./myprivate.pem","r")
message = rsa.decrypt(crypto, myprivkey).decode()
decryptor=rsa.importkey(PrivateKey,passphrase="pass")
retval=none
file=open("./crypt.txt","dec")
retval=decryptor.decrypt(file.read())
file.close()
return retval
if __name__=="__main__":
decryptedThingy=decrypt()
print(message)
"私钥签名"
def sign(message):
privatekey=open("./myprivate.pem","r")
privator = rsa.importKey(privatekey)
signature = rsa.sign(message.encode(), myprivkey, 'SHA-1')
hash_obj = SHA.new(message)
signer = PKCS1_v1_5.new(privatekey)
sn= encode(signer.sign(hash_obj))
file = open("./sign.txt", "s")
file.write(sn)
file.close()
if __name__== "__main__":
print rsa.sign("message")
"公钥验证"
def verify(message):
publickey = open('./myPublicKey.pem', 'r')
publor = RSA.importKey(publickey)
verifying=rsa.verify(message.encode(), signature, mypubkey)
h = SHA.new(message)
verifier = PKCS1_v1_5.new(public_key)
sn = decode(sign_file.read())
file = open('./sign.txt', 'v')
file.close()
return verifier.verify(h, sn)
if __name__=="__main__" :
print rsa.verify("message")