zoukankan      html  css  js  c++  java
  • python使用rsa库做公钥解密(网上别处找不到)

      版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址
    
      http://www.cnblogs.com/Colin-Cai/p/8013009.html 
    
      作者:窗户
    
      QQ:6679072
    
      E-mail:6679072@qq.com
    

      使用RSA公钥解密,用openssl命令就是openssl rsautl -verify -in cipher_text -inkey public.pem -pubin -out clear_text,但其python网上还真没有找到有博文去写,只有hash的rsa解签名。

      这里使用rsa库,如果没有可以到官方网址https://pypi.python.org/pypi/rsa/3.1.4下载。

      想了想原理,然后到rsa库的python代码里找了找,从verify的代码里提取了出来,又试验了试验,一切OK了。

      代码如下:

    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    import sys
    #rsa
    from rsa import PublicKey, common, transform, core
    def f(cipher, PUBLIC_KEY):
            public_key = PublicKey.load_pkcs1(PUBLIC_KEY)
            encrypted = transform.bytes2int(cipher)
            decrypted = core.decrypt_int(encrypted, public_key.e, public_key.n)
            text = transform.int2bytes(decrypted)
    
            if len(text) > 0 and text[0] == 'x01':
                pos = text.find('x00')
                if pos > 0:
                    return text[pos+1:]
                else:
                    return None
    
    fn = sys.stdin.readline()[:-1]
    public_key = sys.stdin.readline()[:-1]
    x = f(open(fn).read(), open(public_key).read())
    print x
    

      用shell验证如下:

     $ openssl genrsa -out pri2048.pem 2048
    Generating RSA private key, 2048 bit long modulus
    ..+++
    ..............................................+++
    e is 65537 (0x10001)
     $ openssl rsa -in pri2048.pem -out pub2048.pem -RSAPublicKey_out
    writing RSA key
     $ echo -n 'Just a test' >1.txt
     $ openssl rsautl -sign -in 1.txt -inkey pri2048.pem -out 1.bin
     $ { echo 1.bin; echo pub2048.pem; } | ./test_rsa.py
    Just a test
    

      一切OK,注意,公钥pem从私钥里析出必须用-RSAPublicKey_out,这样pem文件的第一行和最后一行为以下,这样rsa.PublicKey.load_pkcs1才会认识。

      -----BEGIN RSA PUBLIC KEY-----

      -----END RSA PUBLIC KEY-----

  • 相关阅读:
    Rust-数据类型
    Rust-智能指针
    Rust-使用包、Crate和模块管理不断增长的项目
    Rust-Slice类型
    Rust-引用与借用
    Rust 的核心功能-所有权(ownership)
    How to fix “sudo: command not found error”
    ABC195 F
    CF1501D Two chandeliers【拓展欧几里得+二分】
    CCA的小球【容斥定理】
  • 原文地址:https://www.cnblogs.com/Colin-Cai/p/8013009.html
Copyright © 2011-2022 走看看