首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
华为云
V2EX  ›  Python

已知公钥,如何将一段字符串进行 rsa 加密?

  •  
  •   cruithne · 10 天前 · 1422 次点击
    百度了一天,用 rsa 模块,会报错:'str' object has no attribute 'n'
    看了一下源码,大概意思是公钥私钥要通过 rsa 模块生成,公钥是一个对象,自带了 n 这个属性,我自己传一个 str 是不行的。可是我已有公钥,只想将字符串加密,该怎么搞?
    21 回复  |  直到 2018-11-09 10:34:18 +08:00
        1
    justfly   10 天前
    RSA 库肯定有 API 用来把你的字符串格式公钥 Load 到一个 PublicKey 对象啊,找找呗。
        2
    ThirdFlame   10 天前
    读公钥 得到 n e , 密文=libnum.n2s(pow(libnum.s2n('字符串'),e,n))
        3
    WordTian   10 天前 via Android
    不能,私钥加密,公钥解密,这是常识。
        4
    boom7   10 天前
    用 pycrypto
    例 pkcs1.5:

    import base64
    from Crypto.PublicKey import RSA
    from Crypto.Cipher import PKCS1_v1_5
    key = RSA.importKey(base64.b64decode(public_key))
    pkcs1 = PKCS1_v1_5.new(key)
    pkcs1.encrypt("123456".encode()))
        5
    phithon   10 天前   ♥ 1
    @WordTian
    加密:公钥负责加密,私钥负责解密。
    签名:私钥负责签名,公钥负责校验。
        6
    Yanni0507   10 天前
    @WordTian 这不是常识,你说反了....
        7
    summic   10 天前
    @WordTian 这不是常识,你说反了....

    PHP 版本对应函数:
    penssl_public_encrypt

    另外还有几个函数一起看:
    openssl_​ private_​ decrypt
    openssl_​ private_​ encrypt
    openssl_​ public_​ decrypt
    openssl_public_encrypt
        8
    Leigg   10 天前 via iPhone
    专门写一篇文章实现这个,用 python 实现的
    https://blog.csdn.net/sc_lilei/article/details/83027970
        9
    belin520   10 天前
    楼上的回复尴尬了?
        10
    znood   10 天前 via iPhone
    @WordTian 按你这么说 tls 怎么通信?
        11
    WordTian   10 天前 via Android
    尴尬了。。。
    居然记错了,还是理解不到家

    感谢各位指正
    @phithon
    @Yanni0507
    @summic
    @znood
        12
    bp0   10 天前
    @WordTian 你说的没错,只是没说全。

    准确的说,
    公钥加密,私钥解密。可以得到正确的内容。
    私钥加密,公钥解密。可以得到正确的内容。

    只不过,既然都叫它是公钥了,所以一般没人用他来解密,而是用来加密。

    上面其他人说公钥用来验证签名。不过,验证签名的原理就是在解密,而不是加密。
        13
    leavic   10 天前
    @WordTian 私钥和公钥是对等的,哪个算私钥哪个算公钥完全看应用。
        14
    xml123   10 天前
    实际上加密和解密用的算法是完全一样的
        15
    37Y37   10 天前
    看看这个文章
    https://mp.weixin.qq.com/s/dpGqieL4WCmGdQh1AEG4Gw

    里边一段 python3 代码实现生成秘钥并加解密的功能:
    ```
    import binascii
    from Cryptodome.PublicKey import RSA
    from Cryptodome.Cipher import PKCS1_v1_5


    class RsaCrypto():
    '''RSA 加解密'''

    def create_rsa_key(self):
    '''生成 RSA 秘钥对'''
    try:
    key = RSA.generate(2048)
    encrypted_key = key.exportKey(pkcs=8)

    public_key = key.publickey().exportKey().decode('utf-8')
    private_key = encrypted_key.decode('utf-8')

    return {'state': 1, 'message': {'public_key': public_key, 'private_key': private_key}}
    except Exception as err:
    return {'state': 0, 'message': str(err)}

    def encrypt(self, public_key, plaintext):
    '''加密方法'''
    try:
    recipient_key = RSA.import_key(public_key)
    cipher_rsa = PKCS1_v1_5.new(recipient_key)

    en_data = cipher_rsa.encrypt(plaintext.encode('utf-8'))
    hex_data = binascii.hexlify(en_data).decode('utf-8')

    return {'state': 1, 'message': hex_data}
    except Exception as err:
    return {'state': 0, 'message': str(err)}

    def decrypt(self, private_key, hex_data):
    '''解密方法'''
    try:
    private_key = RSA.import_key(private_key)
    cipher_rsa = PKCS1_v1_5.new(private_key)

    en_data = binascii.unhexlify(hex_data.encode('utf-8'))
    data = cipher_rsa.decrypt(en_data, None).decode('utf-8')

    return {'state': 1, 'message': data}
    except Exception as err:
    return {'state': 0, 'message': str(err)}


    if __name__ == '__main__':
    print(RsaCrypto().create_rsa_key())
    ```
        16
    20150517   9 天前 via Android
    rsa 的 key 是用来加密 key 的,rsa 加密长字串效率特别低,一般是用 aes 加密,再把 aes 密码用 rsa 加密发出来
        17
    msg7086   9 天前
    公钥和私钥的区别在于私钥包含了完整的密钥对而公钥只含有其中一个密钥(即只有半个密钥对)。
        18
    metrxqin   9 天前
    @WordTian I feel pity for you.
        19
    1010543618   9 天前
    以前看书总结的

    ## RAS
    ### 生成密钥
    1. 找大整数 p,q (素数测试算法)
    2. 根据 N=pq,求 N (乘法)
    2. 找任意与(p-1)(q-1)互素的数 e
    3. 根据 ed≡(1 mod (p-1)(q-1)),求 d (拓展 Euclid 算法)

    此时公钥为(N,e),私钥为(N,d)

    ### 加密解密
    1. 加密:y=x^e mod N
    2. 解密:x=y^d mod N

    ### 破解?
    方法 1:尝试所有可能的 x 判断`x^e = y mod N`是否成立
    方法 2:对 N 因式分解,得到 p 和 q,进而计算出 d
        20
    CloudMx   9 天前
    非对称加密嘛,我发布出去的就叫公钥,自己保留的就叫私钥。
    用公钥加密后,用私钥解密。
    用私钥加密后,用公钥解密。
        21
    no1xsyzy   9 天前
    @leavic 主要是私钥比较长,并且知道公钥也算不出一个对应的私钥
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   745 人在线   最高记录 3821   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 17ms · UTC 18:33 · PVG 02:33 · LAX 10:33 · JFK 13:33
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1