python安裝rsa模塊(rsa算法 python)

本文目錄一覽:

python有rsa模塊么

它是由三位數學家Rivest、Shamir 和 Adleman 設計了一種算法,可以實現非對稱加密。這種算法用他們三個人的名字命名,叫做RSA算法。

需要python import 、python math 模塊方法。

babun環境下如何安裝python2 rsa

先裝setuptools,然後就可以裝rsa了。

不過建議你不要在babun環境下面搞。如果不想裝linux,又想用python的話,可以裝python的windows版本或者裝個mingw。babun環境下還是有很多坑的。

java生成的rsa公鑰 能在python上使用嗎

肯定可以,這個跟語言是無關的

Python上RSA加密的庫挺多的,最開始使用的是rsa,因為比較簡單嘛!測試的時候也是用 python模擬App的訪問,順利通過!

然而App開發者反饋,python測試腳本沒法移植到java上,因為java的加密解密模塊需要更加精細的算法細節指定,否則java加密過的數據python是解不出來的。

當初就是因為rsa模塊簡單,不需要注重細節才選的,自己又不是專業搞加密解密的。沒辦法了,只能硬着頭皮,捋了一遍RSA的加密原理。網上還是有比較多的講述比較好的文章,比如RSA算法原理

原理是懂了,但具體到python和java的區別上,還是一頭霧水。最終python的RSA模塊換成Crypto,因為支持的參數比較多。搜了很多網站講的都不是很詳細,stackflow上有幾篇還可以,借鑒了一下,最後測試通過了。還是直接上代碼吧。

Java代碼

//下面這行指定了RSA算法的細節,必須更python對應

private static String RSA_CONFIGURATION = “RSA/ECB/OAEPWithSHA-256AndMGF1Padding”;

//這個貌似需要安裝指定的provider模塊,這裡沒有使用

private static String RSA_PROVIDER = “BC”;

//解密 Key:私鑰

public static String decrypt(Key key, String encryptedString){

try {

Cipher c = Cipher.getInstance(RSA_CONFIGURATION);

c.init(Cipher.DECRYPT_MODE, key, new OAEPParameterSpec(“SHA-256”, “MGF1”, MGF1ParameterSpec.SHA256,

PSource.PSpecified.DEFAULT));

byte[] decodedBytes;

decodedBytes = c.doFinal(Base64.decode(encryptedString.getBytes(“UTF-8”)));

return new String(decodedBytes, “UTF-8”);

} catch (IllegalBlockSizeException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (BadPaddingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (Base64DecodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchAlgorithmException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchPaddingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InvalidKeyException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InvalidAlgorithmParameterException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return null;

}

//加密 Key一般是公鑰

public static String encrypt(Key key, String toBeEncryptedString){

try {

Cipher c = Cipher.getInstance(RSA_CONFIGURATION);

c.init(Cipher.ENCRYPT_MODE, key, new OAEPParameterSpec(“SHA-256”, “MGF1”, MGF1ParameterSpec.SHA256,

PSource.PSpecified.DEFAULT));

byte[] encodedBytes;

encodedBytes = c.doFinal(toBeEncryptedString.getBytes(“UTF-8”));

return Base64.encode(encodedBytes);

} catch (IllegalBlockSizeException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (BadPaddingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchAlgorithmException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchPaddingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InvalidKeyException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InvalidAlgorithmParameterException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return null;

}

//通過Pem格式的字符串(PKCS8)生成私鑰,base64是去掉頭和尾的b64編碼的字符串

//Pem格式私鑰一般有2種規範:PKCS8和PKCS1.注意java在生成私鑰時的不同

static PrivateKey generatePrivateKeyFromPKCS8(String base64)

{

byte[] privateKeyBytes;

try {

privateKeyBytes = Base64.decode(base64.getBytes(“UTF-8”));

KeyFactory kf = KeyFactory.getInstance(“RSA”);

PKCS8EncodedKeySpec ks = new PKCS8EncodedKeySpec(privateKeyBytes);

PrivateKey privateKey = kf.generatePrivate(ks);

return privateKey;

} catch (Base64DecodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchAlgorithmException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InvalidKeySpecException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return null;

}

//通過Pem格式的字符串(PKCS1)生成私鑰,base64是去掉頭和尾的b64編碼的字符串

static PrivateKey generatePrivateKeyFromPKCS1(String base64)

{

byte[] privateKeyBytes;

try {

privateKeyBytes = Base64.decode(base64.getBytes(“UTF-8”));

KeyFactory kf = KeyFactory.getInstance(“RSA”);

X509EncodedKeySpec ks = new X509EncodedKeySpec(privateKeyBytes);

PrivateKey privateKey = kf.generatePrivate(ks);

return privateKey;

} catch (Base64DecodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchAlgorithmException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InvalidKeySpecException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return null;

}

//通過Pem格式的字符串(PKCS1)生成公鑰,base64是去掉頭和尾的b64編碼的字符串

//Pem格式公鑰一般採用PKCS1格式

static PublicKey generatePublicKeyFromPKCS1(String base64)

{

byte[] publicKeyBytes;

try {

publicKeyBytes = Base64.decode(base64.getBytes(“UTF-8”));

KeyFactory kf = KeyFactory.getInstance(“RSA”);

X509EncodedKeySpec ks = new X509EncodedKeySpec(publicKeyBytes);

PublicKey publicKey = kf.generatePublic(ks);

return publicKey;

} catch (Base64DecodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchAlgorithmException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InvalidKeySpecException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return null;

}

//通過modulus和exponent生成公鑰

//參數含義就是RSA算法里的意思

public static RSAPublicKey getPublicKey(String modulus, String exponent) {

try {

BigInteger b1 = new BigInteger(modulus);

BigInteger b2 = new BigInteger(exponent);

KeyFactory keyFactory = KeyFactory.getInstance(“RSA”);

RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2);

return (RSAPublicKey) keyFactory.generatePublic(keySpec);

} catch (Exception e) {

e.printStackTrace();

return null;

}

} 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169

Python 代碼

from Config import config

from Crypto.Hash import SHA256

from Crypto.PublicKey import RSA

from Crypto.Cipher import PKCS1_OAEP

key = RSA.generate(1024)

pubkey = key.publickey().key

def Decrypt(prikey,data):

try:

cipher = PKCS1_OAEP.new(prikey, hashAlgo=SHA256)

return cipher.decrypt(data)

except:

traceback.print_exc()

return None

def Encrypt(pubkey,data):

try:

cipher = PKCS1_OAEP.new(pubkey, hashAlgo=SHA256)

return cipher.encrypt(data)

except:

traceback.print_exc()

return None

1234567891011121314151617181920212223

總結

主要是對RSA算法不是很熟悉,其中很多術語不懂,導致跟java里的加密模塊的函數和類對應不上。

RSA算法的細節到現在也是一知半解,但真的沒時間去深入學習了。

怎麼用 python 模擬 js 里 JSEncrypt 模塊的加密方式

PC登錄新浪微博時,在客戶端用js預先對用戶名、密碼都進行了加密,而且在POST之前會GET一組參數,這也將作為POST_DATA的一部分。這樣,就不能用通常的那種簡單方法來模擬POST登錄(比如人人網)。

通過爬蟲獲取新浪微博數據,模擬登錄是必不可少的。

1、在提交POST請求之前,需要GET獲取四個參數(servertime,nonce,pubkey和rsakv),不是之前提到的只是獲取簡單的servertime,nonce,這裡主要是由於js對用戶名、密碼加密方式改變了。

1.1 由於加密方式的改變,我們這裡將使用到RSA模塊,有關RSA公鑰加密算法的介紹可以參考網絡中的有關內容。下載並安裝rsa模塊:

下載:https//pypi.python.org/pypi/rsa/3.1.1

rsa模塊文檔地址:http//stuvel.eu/files/python-rsa-doc/index.html

根據自己的Python版本選擇適合自己的rsa安裝包(.egg),在win下安裝需要通過命令行使用easy_install.exe(win上安裝setuptool從這裡下載:setuptools-0.6c11.win32-py2.6.exe 安裝文件 )進行安裝,例如:easy_install rsa-3.1.1-py2.6.egg,最終命令行下測試import rsa,未報錯則安裝成功。

1.2 獲得以及查看新浪微博登錄js文件

查看新浪通行證url (http//login.sina.com.cn/signup/signin.php)的源代碼,其中可以找到該js的地址 http//login.sina.com.cn/js/sso/ssologin.js,不過打開後裏面的內容是加密過的,可以在網上找個在線解密站點解密,查看最終用戶名和密碼的加密方式。

1.3 登錄

登錄第一步,添加自己的用戶名(username),請求prelogin_url鏈接地址:

prelogin_url = ‘http//login.sina.com.cn/sso/prelogin.php?entry=ssocallback=sinaSSOController.preloginCallBacksu=%srsakt=modclient=ssologin.js(v1.4.4)’ % username

使用get方法得到以下類似內容:

sinaSSOController.preloginCallBack({“retcode”:0,”servertime”:1362041092,”pcid”:”gz-6664c3dea2bfdaa3c94e8734c9ec2c9e6a1f”,”nonce”:”IRYP4N”,”pubkey”:”EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443″,”rsakv”:”1330428213″,”exectime”:1})

進而從中提取到我們想要的servertime,nonce,pubkey和rsakv。當然,pubkey和rsakv的值我們可以寫死在代碼中,它們是固定值。

2、之前username 經過BASE64計算:

複製代碼 代碼如下:

username_ = urllib.quote(username)

username = base64.encodestring(username)[:-1]

password經過三次SHA1加密,且其中加入了 servertime 和 nonce 的值來干擾。即:兩次SHA1加密後,結果加上servertime和nonce的值,再SHA1算一次。

在最新的rsa加密方法中,username還是以前一樣的處理;

password加密方式和原來有所不同:

2.1 先創建一個rsa公鑰,公鑰的兩個參數新浪微博都給了固定值,不過給的都是16進制的字符串,第一個是登錄第一步中的pubkey,第二個是js加密文件中的『10001’。

這兩個值需要先從16進制轉換成10進制,不過也可以寫死在代碼里。這裡就把10001直接寫死為65537。代碼如下:

複製代碼 代碼如下:

rsaPublickey = int(pubkey, 16)

key = rsa.PublicKey(rsaPublickey, 65537) #創建公鑰

message = str(servertime) + ‘\t’ + str(nonce) + ‘\n’ + str(password) #拼接明文js加密文件中得到

passwd = rsa.encrypt(message, key) #加密

passwd = binascii.b2a_hex(passwd) #將加密信息轉換為16進制。

2.2 請求通行證url:login_url =『http//login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.4)’

需要發送的報頭信息

複製代碼 代碼如下:

postPara = {

‘entry’: ‘weibo’,

‘gateway’: ‘1’,

‘from’: ”,

‘savestate’: ‘7’,

‘userticket’: ‘1’,

‘ssosimplelogin’: ‘1’,

‘vsnf’: ‘1’,

‘vsnval’: ”,

‘su’: encodedUserName,

‘service’: ‘miniblog’,

‘servertime’: serverTime,

‘nonce’: nonce,

‘pwencode’: ‘rsa2’,

‘sp’: encodedPassWord,

‘encoding’: ‘UTF-8’,

‘prelt’: ‘115’,

‘rsakv’ : rsakv,

‘url’: ‘http//weibo.com/ajaxlogin.php?framelogin=1callback=parent.sinaSSOController.feedBackUrlCallBack’,

‘returntype’: ‘META’

}

請求的內容中添加了rsakv,將pwencode的值修改為rsa2,其他跟以前一致。

將參數組織好,POST請求。檢驗是否登錄成功,可以參考POST後得到的內容中的一句 location.replace(“;callback=parent.sinaSSOController.feedBackUrlCallBackretcode=101reason=%B5%C7%C2%BC%C3%FB%BB%F2%C3%DC%C2%EB%B4%ED%CE%F3”);

如果retcode=101則表示登錄失敗。登錄成功後結果與之類似,不過retcode的值是0。

3、登錄成功後,在body中的replace信息中的url就是我們下一步要使用的url。然後對上面的url使用GET方法來向服務器發請求,保存這次請求的Cookie信息,就是我們需要的登錄Cookie了。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/306246.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-02 12:00
下一篇 2025-01-02 12:00

相關推薦

  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29

發表回復

登錄後才能評論