Python使用pycrypto进行RSA长字符串加密

原创 2017年06月09日 17:00:43

今天有位群友在 “Python那些事” 群里问到了一个使用 pycrypto 进行rsa报错的问题。

问题

使用 pycrypto 进行 rsa 加密解密,padding模式是 RSA_PKCS1_PADDING, 加密比较短的字符串没问题,加密长的字符串就报错。

    raise ValueError("Plaintext is too long.")
ValueError: Plaintext is too long.

正好之前用过 rsa,当时也是短字符串加密解密,也没注意长度问题。 pycrypto 和 lua-resty-rsa 进行跨语言的RSA加密解密.md

解决

先去google下,没发现什么有用的信息,于是去找源码,在 源码错误处理地方 看到了一些信息

        :Parameters:
         message : byte string
                The message to encrypt, also known as plaintext. It can be of
                variable length, but not longer than the RSA modulus (in bytes) minus 11.

原来加密的 plaintext 最大长度是 证书key位数/8 - 11, 例如1024 bit的证书,被加密的串最长 1024/8 - 11=117, 顺着这个思路google下,解决办法是 分块 加密,然后分块解密就行了,因为 证书key固定的情况下,加密出来的串长度是固定的。

下面是个简单的例子,演示使用 pycrypto 库处理 RSA 长字符串加密和解密。

#coding:utf-8
"""
orangleliu 2017.6.9 rsa_test.py

python2.7
pycrypto (2.6.1)
"""
from Crypto.PublicKey import RSA as rsa
from Crypto.Cipher import PKCS1_v1_5


pub_key_str = """-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAuw4T755fepEyXTM66pzf6nv8NtnukQTMGnhmBFIFHp/P2vEpxjXU
BBDUpzKkVFR3wuK9O1FNmRDAGNGYC0N/9cZNdhykA1NixJfKQzncN31VJTmNqJNZ
W0x7H9ZGoh2aE0zCCZpRlC1Rf5rL0SVlBoQkn/n9LnYFwyLLIK5/d/y/NZVL6Z6L
cyvga0zRajamLIjY0Dy/8YIwVV6kaSsHeRv2cOB03eam6gbhLGIz/l8wuJhIn1rO
yJLQ36IOJymbbNmcC7+2hEQJP40qLvH7hZ1LaAkgQUHjfi8RvH2T1Jmce7XGPxCo
Ed0yfeFz+pL1KeSWNey6cL3N5hJZE8EntQIDAQAB
-----END RSA PUBLIC KEY-----"""

priv_key_str = """-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAuw4T755fepEyXTM66pzf6nv8NtnukQTMGnhmBFIFHp/P2vEp
xjXUBBDUpzKkVFR3wuK9O1FNmRDAGNGYC0N/9cZNdhykA1NixJfKQzncN31VJTmN
qJNZW0x7H9ZGoh2aE0zCCZpRlC1Rf5rL0SVlBoQkn/n9LnYFwyLLIK5/d/y/NZVL
6Z6Lcyvga0zRajamLIjY0Dy/8YIwVV6kaSsHeRv2cOB03eam6gbhLGIz/l8wuJhI
n1rOyJLQ36IOJymbbNmcC7+2hEQJP40qLvH7hZ1LaAkgQUHjfi8RvH2T1Jmce7XG
PxCoEd0yfeFz+pL1KeSWNey6cL3N5hJZE8EntQIDAQABAoIBAGim1ayIFK8EMQNH
uDyui/Aqcc9WWky0PGTK23irUsXxb1708gQ89WNY70Cj6qBrqZ1VMb3QHPP4FSFN
kh0rJJoi2g+ssm5R5r5KlhTKeFRrQInVC1Y3KhUUUwZa4aWtnhgSJ7Urq1yVhjU4
K7PVkhH1OHBwcp/d1Bd6jd65AgPkY63P+WpcARJkClmQ1RhgoRwThyJdpKrV4/gO
ha0AUGlJNRNvRwiZxP0zaI5C8RdrG96SnVpeYOcD0z/M1HVlkoYMXsXLKttwLfpK
88Igtm6ZJwRpfuMF5VA+9hHaYGCBdGz0B/rMp2fc+EtrOavYQGrWIWi2RL1Qk6Rt
BUyeTgECgYEA9anj4n/cak1MT+hbNFsL31mJXryl1eVNjEZj/iPMztpdS15CmFgj
Kjr9UuintjSiK7Is43nZUWWyP1XQjRhVi2uP7PRIv92QNl/YteWD6tYCInJHKe2J
QqYyZrElezsdayXb5DK6bi1UIYYji90g79N7x6pOR0UnQNQUXTv+Y8ECgYEAwuzl
6Ez4BSXIIL9NK41jfNMa73Utfl5oO1f6mHM2KbILqaFE76PSgEeXDbOKdcjCbbqC
KCGjwyPd+Clehg4vkYXTq1y2SQGHwfz7DilPSOxhPY9ND7lGbeNzDUK4x8xe52hd
MWKdgqeqCK83e5D0ihzRiMah8dbxmlfLAOZ3sPUCgYEA0dT9Czg/YqUHq7FCReQG
rg3iYgMsexjTNh/hxO97PqwRyBCJPWr7DlU4j5qdteobIsubv+kSEI6Ww7Ze3kWM
u/tyAeleQlPTnD4d8rBKD0ogpJ+L3WpBNaaToldpNmr149GAktgpmXYqSEA1GIAW
ZAL11UPIfOO6dYswobpevYECgYEApSosSODnCx2PbMgL8IpWMU+DNEF6sef2s8oB
aam9zCi0HyCqE9AhLlb61D48ZT8eF/IAFVcjttauX3dWQ4rDna/iwgHF5yhnyuS8
KayxJJ4+avYAmwEnfzdJpoPRpGI0TCovRQhFZI8C0Wb+QTJ7Mofmt9lvIUc64sff
GD0wT/0CgYASMf708dmc5Bpzcis++EgMJVb0q+ORmWzSai1NB4bf3LsNS6suWNNU
zj/JGtMaGvQo5vzGU4exNkhpQo8yUU5YbHlA8RCj7SYkmP78kCewEqxlx7dbcuj2
LAPWpiDca8StTfEphoKEVfCPHaUk0MlBHR4lCrnAkEtz23vhZKWhFw==
-----END RSA PRIVATE KEY-----"""


def rsa_long_encrypt(pub_key_str, msg, length=100):
    """
    单次加密串的长度最大为 (key_size/8)-11
    1024bit的证书用100, 2048bit的证书用 200
    """
    pubobj = rsa.importKey(pub_key_str)
    pubobj = PKCS1_v1_5.new(pubobj)
    res = []
    for i in range(0, len(msg), length):
        res.append(pubobj.encrypt(msg[i:i+length]))
    return "".join(res)


def rsa_long_decrypt(priv_key_str, msg, length=128):
    """
    1024bit的证书用128,2048bit证书用256位
    """
    privobj = rsa.importKey(priv_key_str)
    privobj = PKCS1_v1_5.new(privobj)
    res = []
    for i in range(0, len(msg), length):
        res.append(privobj.decrypt(msg[i:i+length], 'xyz'))
    return "".join(res)


if __name__ == "__main__":
    msg = "We are different, work hard!"*100

    enres = rsa_long_encrypt(pub_key_str, msg, 200)
    deres = rsa_long_decrypt(priv_key_str, enres, 256)
    print msg == deres
版权声明:本文为orangleliu (http://blog.csdn.net/orangleliu/)原创文章,自由传播,文章转载请声明, 多谢。

Python使用pycrypto进行RSA长字符串加密

Python RSA 长字符串加密标签(空格分隔): 未分类 今天有位群友在 “Python那点事” 群里问到了一个使用 pycrypto 进行rsa报错的问题。 问题使用 pycrypto 进行...
  • lzz957748332
  • lzz957748332
  • 2017年06月09日 17:00
  • 2492

Python使用Rsa公钥加密,私钥解密以及私钥签名,公钥验签的例子

安装Cryptor库 wget https://github.com/dlitz/pycrypto/archive/master.zip  python setup.py install 生成...
  • nyist327
  • nyist327
  • 2015年09月10日 22:22
  • 10474

Python 进行RSA私钥加密,公钥解密

使用M2Crypto库 需要安装M2Crypto库 # -*- coding: UTF-8 -*-import M2Cryptofrom Crypto.PublicKey import RSAi...
  • nyist327
  • nyist327
  • 2015年09月16日 16:51
  • 6496

python 利用pycrypto进行rsa生成公钥、私钥,加密、解密、签名、解签

1、安装 pycrypto pip install pycrypto 2、利用pycrypto进行rsa生成公钥、私钥,加密、解密、签名、解签 # -*- coding: utf-8 -*-...
  • u010693827
  • u010693827
  • 2017年11月25日 02:36
  • 151

Windows下python安装PyCrypto加密模块以及使用

本机环境: Windows8(Windows系列都可以) python3.4 步骤一:首先下载PyCrytoPyCrypto点击下载—下载完解压假设我解压到H盘,打开cmd,cd到pycrypto-2...
  • Snail_zhan
  • Snail_zhan
  • 2016年12月09日 17:59
  • 7368

Python加密工具包pycrypto的安装

【介绍】 pycrypto是用Python写的加密工具包。 This is a collection of both secure hash functions (such as SHA2...
  • qq_32389997
  • qq_32389997
  • 2017年05月27日 15:19
  • 241

使用Python进行字符串加密 利用win32com.client和CAPICOM

在Python编程中,我们会使用到字符串加密,
  • liqiang19910328
  • liqiang19910328
  • 2014年08月07日 09:44
  • 1139

Python加密工具包pycrypto的安装

pycrypto是用Python写的加密工具包。
  • liuchunming033
  • liuchunming033
  • 2014年10月31日 14:10
  • 12727

C#使用私钥进行RSA加密

背景:接口方开发环境是Java,要求我使用私钥对数据进行加密,他使用公钥进行解密。 开发时遇到的问题: 1).Net平台默认是使用公钥进行加密,私钥进行解密。私钥加密需要自己实现或者使用第三方dll。...
  • theodore26
  • theodore26
  • 2015年12月16日 17:49
  • 5264

java 使用RSA算法进行加密和解密

一、  生成公钥和私钥公钥可以对外公开,供其他人加密使用,而把私钥秘密保存用于解密。下面程序产生公钥和私钥,并将他们分别保存在文件中。import java.io.*; import java.sec...
  • dreamingjay
  • dreamingjay
  • 2011年05月10日 11:20
  • 705
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python使用pycrypto进行RSA长字符串加密
举报原因:
原因补充:

(最多只允许输入30个字)