Hướng dẫn mã hóa rsa python

Hỗ trợ thanh toán qua INTERNET BANKING tất cả các ngân hàng:
VietcomBank, BIDV, VietinBank, SacomBank, TechcomBank, Á Châu, TPbank,
MBbank, AgriBank, VPbank, SHB, MaritimeBank, DongAbank, VIB, EximBank,
HDbank, NCB, Việt Á, OceanBank, PGbank, BacAbank...

Bạn cần đăng nhập để tải code qua chức năng này!

  ĐĂNG NHẬP NGAY

Hỗ trợ CHUYỂN KHOẢN TRỰC TIẾP qua các số tài khoản ngân hàng:
VietcomBank, BIDV, VietinBank, SacomBank, TechcomBank, Á Châu, TPbank,
MBbank, AgriBank, VPbank, SHB, MaritimeBank

Bạn cần đăng nhập để tải code qua chức năng này!

  ĐĂNG NHẬP NGAY

Tôi cần trợ giúp bằng cách sử dụng mã hóa và giải mã RSA bằng Python.

Tôi đang tạo cặp khóa riêng tư / công khai, mã hóa tin nhắn bằng các khóa và ghi tin nhắn vào tệp. Sau đó, tôi đang đọc bản mã từ tệp và giải mã văn bản bằng cách sử dụng khóa.

Tôi đang gặp sự cố với phần giải mã. Như bạn có thể thấy trong đoạn mã của tôi bên dưới, khi tôi đưa vào decrypted = key.decrypt[message]chương trình đó hoạt động, nhưng thông báo đã giải mã lại được mã hóa. Có vẻ như nó không đọc bản mã từ tệp.

Bất cứ ai có thể giúp tôi viết mã này để giải mã đọc bản mã từ tệp và sau đó sử dụng khóa để giải mã bản mã?

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[]

  • python
  • encryption
  • rsa
  • pycrypto

39 hữu ích 5 bình luận 193k xem chia sẻ

answer

52

Để làm cho nó hoạt động, bạn cần chuyển đổi khóa từ str thành tuple trước khi giải mã [hàm ast.literal_eval]. Đây là mã cố định:

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[]

52 hữu ích 4 bình luận chia sẻ

answer

9

# 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

Và sử dụng

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]

9 hữu ích 0 bình luận chia sẻ

answer

8

PKCS # 1 OAEP là một mật mã không đối xứng dựa trên RSA và phần đệm OAEP

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]]

8 hữu ích 2 bình luận chia sẻ

answer

3

Đây là cách triển khai của tôi cho python 3 và pycrypto

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]

3 hữu ích 3 bình luận chia sẻ

answer

1

Bạn có thể sử dụng cách đơn giản để genarate RSA. Sử dụng thư viện rsa

pip install rsa 

1 hữu ích 0 bình luận chia sẻ

answer

0

Hãy coi chừng bằng cách sử dụng Crypto !!! Nó là một thư viện tuyệt vời nhưng nó có vấn đề trong python3.8 'vì thời gian thư viện đã bị xóa đồng hồ thuộc tính []. Để khắc phục nó chỉ cần sửa đổi nguồn ở /usr/lib/python3.8/site-packages/Crypto/Random/_UserFriendlyRNG.pydòng 77 thay đổi t = time.clock[]intt = time.perf_counter[]

0 hữu ích 0 bình luận chia sẻ

Đăng nhập để trả lời câu hỏi

Có thể bạn quan tâm

Chủ Đề