RSA encryption and decryption in Python
需要帮助使用RSA加密和decryption Python。P></
我在私营/ public key pair creating a message with,encrypting Keys to a message文件和写作。然后我从阅读文本文件decrypting ciphertext和使用的关键。P></
我portion with the decryption很麻烦。As You can see below的队列中,当把程序中
任何人可以帮助我写这从我decryption队列文件,然后读取数ciphertext uses key to decrypt ciphertext?P></
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import Crypto from Crypto.PublicKey import RSA from Crypto import Random random_generator = Random.new().read key = RSA.generate(1024, random_generator) #generate public and private keys publickey = key.publickey # pub key export for exchange encrypted = publickey.encrypt('encrypt this message', 32) #message to encrypt is in the above line 'encrypt this message' print 'encrypted message:', encrypted #ciphertext f = open ('encryption.txt', 'w'w) f.write(str(encrypted)) #write ciphertext to file f.close() #decrypted code below f = open ('encryption.txt', 'r') message = f.read() decrypted = key.decrypt(message) print 'decrypted', decrypted f = open ('encryption.txt', 'w') f.write(str(message)) f.write(str(decrypted)) f.close() |
为了使其正常工作,您需要在解密之前将密钥从str转换为tuple(ast.literal_eval函数)。以下是固定代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | import Crypto from Crypto.PublicKey import RSA from Crypto import Random import ast random_generator = Random.new().read key = RSA.generate(1024, random_generator) #generate pub and priv key publickey = key.publickey() # pub key export for exchange encrypted = publickey.encrypt('encrypt this message', 32) #message to encrypt is in the above line 'encrypt this message' print 'encrypted message:', encrypted #ciphertext f = open ('encryption.txt', 'w') f.write(str(encrypted)) #write ciphertext to file f.close() #decrypted code below f = open('encryption.txt', 'r') message = f.read() decrypted = key.decrypt(ast.literal_eval(str(encrypted))) print 'decrypted', decrypted f = open ('encryption.txt', 'w') f.write(str(message)) f.write(str(decrypted)) f.close() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | # coding: utf-8 from __future__ import unicode_literals import base64 import os import six from Crypto import Random from Crypto.PublicKey import RSA class PublicKeyFileExists(Exception): pass class RSAEncryption(object): PRIVATE_KEY_FILE_PATH = None PUBLIC_KEY_FILE_PATH = None def encrypt(self, message): public_key = self._get_public_key() public_key_object = RSA.importKey(public_key) random_phrase = 'M' encrypted_message = public_key_object.encrypt(self._to_format_for_encrypt(message), random_phrase)[0] # use base64 for save encrypted_message in database without problems with encoding return base64.b64encode(encrypted_message) def decrypt(self, encoded_encrypted_message): encrypted_message = base64.b64decode(encoded_encrypted_message) private_key = self._get_private_key() private_key_object = RSA.importKey(private_key) decrypted_message = private_key_object.decrypt(encrypted_message) return six.text_type(decrypted_message, encoding='utf8') def generate_keys(self): """Be careful rewrite your keys""" random_generator = Random.new().read key = RSA.generate(1024, random_generator) private, public = key.exportKey(), key.publickey().exportKey() if os.path.isfile(self.PUBLIC_KEY_FILE_PATH): raise PublicKeyFileExists('Файл с публичным ключом существует. Удалите ключ') self.create_directories() with open(self.PRIVATE_KEY_FILE_PATH, 'w') as private_file: private_file.write(private) with open(self.PUBLIC_KEY_FILE_PATH, 'w') as public_file: public_file.write(public) return private, public def create_directories(self, for_private_key=True): public_key_path = self.PUBLIC_KEY_FILE_PATH.rsplit('/', 1) if not os.path.exists(public_key_path): os.makedirs(public_key_path) if for_private_key: private_key_path = self.PRIVATE_KEY_FILE_PATH.rsplit('/', 1) if not os.path.exists(private_key_path): os.makedirs(private_key_path) def _get_public_key(self): """run generate_keys() before get keys""" with open(self.PUBLIC_KEY_FILE_PATH, 'r') as _file: return _file.read() def _get_private_key(self): """run generate_keys() before get keys""" with open(self.PRIVATE_KEY_FILE_PATH, 'r') as _file: return _file.read() def _to_format_for_encrypt(value): if isinstance(value, int): return six.binary_type(value) for str_type in six.string_types: if isinstance(value, str_type): return value.encode('utf8') if isinstance(value, six.binary_type): return value |
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | KEYS_DIRECTORY = settings.SURVEY_DIR_WITH_ENCRYPTED_KEYS class TestingEncryption(RSAEncryption): PRIVATE_KEY_FILE_PATH = KEYS_DIRECTORY + 'private.key' PUBLIC_KEY_FILE_PATH = KEYS_DIRECTORY + 'public.key' # django/flask from django.core.files import File class ProductionEncryption(RSAEncryption): PUBLIC_KEY_FILE_PATH = settings.SURVEY_DIR_WITH_ENCRYPTED_KEYS + 'public.key' def _get_private_key(self): """run generate_keys() before get keys""" from corportal.utils import global_elements private_key = global_elements.request.FILES.get('private_key') if private_key: private_key_file = File(private_key) return private_key_file.read() message = 'Hello мой friend' encrypted_mes = ProductionEncryption().encrypt(message) decrypted_mes = ProductionEncryption().decrypt(message) |
pkcs 1 OAEP是一种基于RSA和OAEP填充的非对称密码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | from Crypto.PublicKey import RSA from Crypto import Random from Crypto.Cipher import PKCS1_OAEP def rsa_encrypt_decrypt(): key = RSA.generate(2048) private_key = key.export_key('PEM') public_key = key.publickey().exportKey('PEM') message = input('plain text for RSA encryption and decryption:') message = str.encode(message) rsa_public_key = RSA.importKey(public_key) rsa_public_key = PKCS1_OAEP.new(rsa_public_key) encrypted_text = rsa_public_key.encrypt(message) #encrypted_text = b64encode(encrypted_text) print('your encrypted_text is : {}'.format(encrypted_text)) rsa_private_key = RSA.importKey(private_key) rsa_private_key = PKCS1_OAEP.new(rsa_private_key) decrypted_text = rsa_private_key.decrypt(encrypted_text) print('your decrypted_text is : {}'.format(decrypted_text)) |
下面是我对python 3和pycrypto的实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | from Crypto.PublicKey import RSA key = RSA.generate(4096) f = open('/home/john/Desktop/my_rsa_public.pem', 'wb') f.write(key.publickey().exportKey('PEM')) f.close() f = open('/home/john/Desktop/my_rsa_private.pem', 'wb') f.write(key.exportKey('PEM')) f.close() f = open('/home/john/Desktop/my_rsa_public.pem', 'rb') f1 = open('/home/john/Desktop/my_rsa_private.pem', 'rb') key = RSA.importKey(f.read()) key1 = RSA.importKey(f1.read()) x = key.encrypt(b"dddddd",32) print(x) z = key1.decrypt(x) print(z) |
1 2 3 4 5 6 7 8 9 10 11 12 | from Crypto.Cipher import DES des = DES.new('01234567', DES.MODE_ECB) text ="abcdefgh8" leno = len(text) if leno % 8 != 0: for i in range(0, 8 -leno%8): text +="" cipher_text = des.encrypt(text) des.decrypt(cipher_text) |
在上面的代码中,您基本上可以用"01234567"这样的密码对文本进行加密,然后用该密码再次对其进行解密。这很简单。唯一要注意的是,您的文本长度应该是8的幂,所以有一个小for循环,它添加了足够的空间,使您的文本长度可以被8整除。就是这样。