|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
from binascii import a2b_hex, b2a_hex
|
|
|
|
|
|
|
|
|
|
from M2Crypto import BIO
|
|
|
|
|
from M2Crypto import RSA
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def load_pub_key_string(string):
|
|
|
|
|
bio = BIO.MemoryBuffer(string)
|
|
|
|
|
return RSA.load_pub_key_bio(bio)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def block_data(texts, block_size):
|
|
|
|
|
for i in range(0, len(texts), block_size):
|
|
|
|
|
yield texts[i:i + block_size]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def encrypt(texts):
|
|
|
|
|
ciphertext = b""
|
|
|
|
|
block_size = 256 - 11
|
|
|
|
|
|
|
|
|
|
for text in block_data(texts.encode('utf-8'), block_size):
|
|
|
|
|
current_text = pri_key.private_encrypt(text, RSA.pkcs1_padding)
|
|
|
|
|
ciphertext += current_text
|
|
|
|
|
|
|
|
|
|
return b2a_hex(ciphertext)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def decrypt(texts):
|
|
|
|
|
plaintext = b""
|
|
|
|
|
block_size = 256
|
|
|
|
|
|
|
|
|
|
for text in block_data(a2b_hex(texts), block_size):
|
|
|
|
|
current_text = pub_key.public_decrypt(text, RSA.pkcs1_padding)
|
|
|
|
|
plaintext += current_text
|
|
|
|
|
|
|
|
|
|
return plaintext
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
# 2048代表生成密钥的位数,65537代表公钥的指数
|
|
|
|
|
key = RSA.gen_key(2048, 65537)
|
|
|
|
|
key.save_key("private_key", None)
|
|
|
|
|
key.save_pub_key("public_key")
|
|
|
|
|
|
|
|
|
|
prikey = open("private_key").read()
|
|
|
|
|
pubkey = open("public_key").read()
|
|
|
|
|
|
|
|
|
|
pri_key = RSA.load_key_string(prikey.strip('\n').encode('utf-8'))
|
|
|
|
|
pub_key = load_pub_key_string(pubkey.strip('\n').encode('utf-8'))
|
|
|
|
|
|
|
|
|
|
texts = "hellohellohellohellohellohellohellohellohellohellohellohellohello" \
|
|
|
|
|
"hellohellohellohellohellohellohellohellohellohellohellohellohello" \
|
|
|
|
|
"hellohellohellohellohellohellohellohellohellohellohellohellohello" \
|
|
|
|
|
"hellohellohellohellohellohellohellohellohellohellohello"
|
|
|
|
|
|
|
|
|
|
ciphertext = encrypt(texts)
|
|
|
|
|
print(ciphertext)
|
|
|
|
|
plaintext = decrypt(ciphertext)
|
|
|
|
|
print(plaintext)
|