python实现rsa的公钥加密、私钥解密及私钥加密、公钥解密

rsa包中现成的公钥加密、私钥解密代码

import rsa
def rsa_encrypt(d_str):
    # 生成公钥和私钥
    pubkey, privkey = rsa.newkeys(1024)
    # 将字符串进行编码
    content = d_str.encode('utf-8')
    # 公钥加密
    crypto = rsa.encrypt(content, pubkey)
    print ('加密后', crypto)
    return crypto, privkey

def rsa_decrypt(crypto, privkey):
    # 解密
    content = rsa.decrypt(crypto, privkey)
    # 解码
    content = content.decode('utf-8')
    print ('解密结果', content)
if __name__ == '__main__':
    a = rsa_encrypt('hello word')
    rsa_decrypt(*a)

但没有现成的私钥加密、公钥解密的实现

通过阅读源码,整理出一份简易的实现方式

import rsa
from rsa import common, transform, core
import os


def _pad_for_encryption(message, target_length):

    max_msglength = target_length - 11
    msglength = len(message)

    if msglength > max_msglength:
        raise OverflowError(
            "%i bytes needed for message, but there is only"
            " space for %i" % (msglength, max_msglength)
        )

    padding = b""
    padding_length = target_length - msglength - 3

    while len(padding) < padding_length:
        needed_bytes = padding_length - len(padding)
        new_padding = os.urandom(needed_bytes + 5)
        new_padding = new_padding.replace(b"\x00", b"")
        padding = padding + new_padding[:needed_bytes]

    assert len(padding) == padding_length

    return b"".join([b"\x00\x02", padding, b"\x00", message])

def decrypt(data: bytes, d, n):
    num = transform.bytes2int(data)
    decrypto = core.decrypt_int(num, d, n)
    out = transform.int2bytes(decrypto)
    sep_idx = out.index(b"\x00", 2)
    out = out[sep_idx + 1 :]
    return out

def encrypt(data: bytes, d, n):
    keylength = common.byte_size(n)
    padded = _pad_for_encryption(data, keylength)
    num = transform.bytes2int(padded)
    decrypto = core.encrypt_int(num, d, n)
    out = transform.int2bytes(decrypto)
    return out

if __name__ == '__main__':

    pubkey, privkey = rsa.newkeys(2048)
    data = '123456789'
    data2b = data.encode('utf8')
    edata = encrypt(data2b, pubkey.e, pubkey.n)
    ddata = decrypt(edata, privkey.d, privkey.n)
    ddata = ddata.decode('utf8')
    assert ddata == data

其实上述代码也能实现公钥加密和私钥解密功能,只要改成下面即可

   edata = encrypt(data2b, privkey.d, privkey.n)
   ddata = decrypt(edata, pubkey.e, pubkey.n)

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
Python中使用非对称加密算法实现私钥加密公钥解密的机制。这种加密方式是通过使用一对密钥:公钥私钥,来实现数据加解密的过程。其中,公钥是由私钥经过复杂运算得到的,具有加密能力;而私钥则由密钥持有者自己持有,用于解密数据。这样一来,即便是加密数据不慎泄露,仍然是安全的,因为数据只能由对应的私钥进行解密Python中支持RSA算法,可以用pycryptodome或cryptography库来实现非对称加密。 使用非对称加密算法,首先需要对数据进行加密。这里使用RSA算法作为例子:选择两个不同且较大的质数p,q,计算出n=p*q,然后选取不大于 (p-1)*(q-1) 的数e作为公钥(这里称为公钥指数),计算出对应的私钥d(这里称为私钥指数)。然后,将公钥指数和n组成一个公钥私钥指数和n组成一个私钥加密的过程就是用公钥指数e和n对数据进行加密解密的过程就是用私钥指数d和n对加密数据进行解密Python中可以使用如下代码实现RSA加密解密: ```python # 加密 from Crypto.PublicKey import RSA msg = b'this is a secret message' key = RSA.generate(2048) pub_key = key.publickey() encrypted = pub_key.encrypt(msg, 32) # 解密 decrypted = key.decrypt(encrypted) ``` 需要注意的是,使用RSA算法进行加解密可能会涉及到数据长度的限制,因此可以采用数据分块的方式进行加解密。另外,在实际使用中,需要确保私钥的安全性,以免遭到泄露而导致数据的不安全。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值