python rsa私钥加密,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)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值