首頁 >後端開發 >Python教學 >j詳解python利用rsa函式庫做公鑰解密的方法

j詳解python利用rsa函式庫做公鑰解密的方法

小云云
小云云原創
2017-12-12 09:16:063498瀏覽

RSA是一種公鑰密碼演算法,RSA的密文是對程式碼明文的數字的 E 次方求mod N 的結果。以下這篇文章主要為大家介紹了關於python利用rsa庫做公鑰解密的方法教程,文中透過範例程式碼介紹的非常詳細,需要的朋友可以參考下,希望能幫助到大家。

前言

對於RSA的解密,即密文的數字的D 次方求mod N 即可,即密文和自己做D 次乘法,再將結果除以N 求餘數即可得到明文。 D 和 N 的組合就是私鑰(private key)。

演算法的加密和解密還是很簡單的,可是公鑰和私鑰的生成演算法卻不是隨意的。使用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下載。

具體的安裝方法大家可以參考這裡:http://www.jb51.net/article/70331.htm

想了想原理,然後到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才會認識。

相關推薦:

Python中排列組合計算操作的實作範例

python實作二分查找與快速排序實例詳解

python使用正規表示式連接符的範例程式碼

以上是j詳解python利用rsa函式庫做公鑰解密的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn