追加Python 證書(shū)加解密

首先介紹背景:有一php項(xiàng)目,只提供了php加解密接口,因業(yè)務(wù)需求,需要提供python版本加密接口。

注意:

1、加密方式:使用Crypto包,RSA/1024bit KEY,實(shí)例加密使用公鑰加密,私鑰解密,反過(guò)來(lái)原理一樣

2、加密填充方式:OPENSSL_PKCS1_PADDING

3、python3? PKCS1_v1_5.new.encrypt 只接受byte數(shù)據(jù)

4、切割加密解密,原因自行百度,可參考:https://blog.csdn.net/orangleliu/article/details/72964948


php代碼如下:

//請(qǐng)求內(nèi)容結(jié)構(gòu)體

$data=array(

? ? ? ? "fromname"=>"告警",

? ? ? ? "html"=>"恢復(fù), 服務(wù)器: 192.168.2.111 utilization more than 90% bj,故障:IO 已恢復(fù)!",

? ? ? ? "mail"=>"XXXX@qq.com",

? ? ? ? "subject"=>"現(xiàn)網(wǎng)警告,請(qǐng)盡快處理"

? ? ? ? );

//通訊密鑰公鑰

$keyb_public="-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlRrb6KwJRTx8nvApuMX3f3QCH

qeHkvbxgMJuhHkWOwmD8su1k+OK8c1WHd41C+gkeQr2tVLmEl4VKPKcUEkCTOOBT

NVxSEZf0+xw/WqVqCdqRZGst444Xa6xCVjcuAsIdUjNNCZULLnvPcCTmb9W869BI

C3L5SGvta/Hq/izSswIDAQAB

-----END PUBLIC KEY-----";

$pu_key=openssl_pkey_get_public($keyb_public);

$encrypted="";

//函數(shù):公鑰加密代碼

function encrypt($originalData,$rsaPublicKey)

? ? ? ? {

? ? ? ? $crypto = '';

? ? ? ? //分割加密

? ? ? ? foreach (str_split($originalData, 117) as $chunk) {

? ? ? ? ? ? $test=openssl_public_encrypt($chunk, $encryptData, $rsaPublicKey,OPENSSL_PKCS1_PADDING);

? ? ? ? ? ? ? ? ? ? ? ? if(!$test) echo "<br>Encrypt faild:".openssl_error_string();

? ? ? ? ? ? echo "<br>".$encryptData;

? ? ? ? ? ? $crypto .= $encryptData;

? ? ? ? }

? ? ? ? return $crypto;

? ? }

//utf-8編碼 json 格式化

$text="msg=".json_encode($data,JSON_UNESCAPED_UNICODE);

//加密

$encrypted=encrypt($text,$pu_key);

//base64 和urlencode 加密

$data=urlencode(base64_encode($encrypted));

echo "<br>加密后數(shù)據(jù)=".$data;



python2.7加解密版本,

yum install -y python-devel

pip2 install pycrypto

#!/usr/bin/env?python

#?-*-?coding:?utf-8?-*-

#?Description:

#?@Time????:?2019/8/12?23:07

#?@Author??:?hubo

#?@Email???:?hagic.hhj@gmail.com

"""

python2.7

"""

import?base64,json

from?Crypto.PublicKey?import?RSA?as?rsa

from?Crypto.Cipher?import?PKCS1_v1_5

from?urllib?import?quote,?unquote

pub_key_str?=?"""-----BEGIN?PUBLIC?KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRUUJTzy4Nm9js/gbfE2K4QjIP

Lo+9a9s+xaK3mlyWHPgdTWfAFdqcTI2Rv8jysqE7OdAzl/lOO5j0d1yVyq/sUkc9

/43A8xyyC1cxmIFvWLYhS5cyKfxy5lrW32ynMcH17OJSJ5fSKLAHd2kZ7npnI9C7

DImkPmwbuLLGrbo1ZwIDAQAB

-----END?PUBLIC?KEY-----"""

priv_key_str?=?"""-----BEGIN?RSA?PRIVATE?KEY-----

MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANFRQlPPLg2b2Oz+

Bt8TYrhCMg8uj71r2z7ForeaXJYc+B1NZ8AV2pxMjZG/yPKyoTs50DOX+U47mPR3

XJXKr+xSRz3/jcDzHLILVzGYgW9YtiFLlzIp/HLmWtbfbKcxwfXs4lInl9IosAd3

aRnuemcj0LsMiaQ+bBu4ssatujVnAgMBAAECgYEAyhvcH3B810cUPkFKATuGpsPD

8kTTJeNu3z2V0BKMM6XlLOYAt8hiPWjtiT3VmgJBDB7Wmfq0DoYdOm/GRhxfn+DV

j/kDbXIlEe0jQkwDmCgLpN0rIGaqnY22yeEkfTHyLnwnRNu0HMbOmNsY27HolkjS

2iANzJuw2Cnt8kx38AECQQDumFy4nZnGZWNJ0PV15i1a03XJH+bdopmGj+k4LErU

dcDQvdd/ZvyFAiK7VNgAxoKCmP1d09BP9FDxW9RBHgTnAkEA4JYmisJtxUUs5Oji

CVaxmczeetP+px68NnqBVLrEvrdUtDsAHU//zEhWGWkGJA6b3puayD7viDUr0861

mjO7gQJAR08MLzUTF4OH2DD2m6UOmx2mD1VUh5soLVpnhp1eQ/9pgDms5WvfPtVz

ke96m0i5CtU0rE047hyD8I7Uch3JswJAQQ8eISpLtE7iv3k7KatkjYJMnNZWucDs

kveQCaSFJB5lukQxN0yadGosDvZeogldW/JFt2aL6zBD/vqtnvsHgQJBAMYwWXEY

tH/dBGao8NGDmzokEvlninUFLuUQm2gV3Gtm+KiJ9vsqFeuEMhcwby1BI0FHUDOW

Y+U95ipVY+0cMRc=

-----END?RSA?PRIVATE?KEY-----"""

def?encrypt(pub_key_str,?msg):

????pubobj?=?rsa.importKey(pub_key_str)

????pubobj?=?PKCS1_v1_5.new(pubobj)

????buffer?=?[]

????while?msg:??#?分段進(jìn)行加密

????????input?=?msg[:117]

????????tmp?=?pubobj.encrypt(input)

????????buffer.append(tmp)

????????msg?=?msg[117:]

????data?=?base64.b64encode(''.join(buffer))

????return?data

def?decrypt(priv_key_str,?msg):

????privobj?=?rsa.importKey(priv_key_str)

????privobj?=?PKCS1_v1_5.new(privobj)

????ctxt_pri?=?base64.b64decode(msg)??#?先將str轉(zhuǎn)成base64

????buffer?=?[]

????while?ctxt_pri:

????????input?=?ctxt_pri[:128]

????????ctxt_pri?=?ctxt_pri[128:]

????????tmp?=?privobj.decrypt(input,?'decrypt?error')

????????buffer.append(tmp)

????return?''.join(buffer)

if?__name__?==?"__main__":

????salt?=?"msg="

????data?=?{

????????????"subject":?"現(xiàn)網(wǎng)警告,請(qǐng)盡快處理",

????????????"fromname":?"告警",

????????????"mail":?"XXXX@qq.com",

????????????"html":?"恢復(fù),?服務(wù)器:?192.168.2.111?utilization?more?than?90%?bj,故障:IO?已恢復(fù)!"

????}

????##utf-8格式化字符串,

????msg?=?salt?+?json.dumps(data,?ensure_ascii=False,?encoding='utf-8')

????##去掉json格式化字典后,字典元素之前的空格

????msg?=?msg.replace('":?',?'":').replace(',?"',?',"').replace(",?{",?",{")

????print(msg)

????#加密

????mmsg?=?encrypt(pub_key_str,?msg)

????enData?=?quote(mmsg)

????print("加密:%s"?%?enData)

????#解密

????mmsg?=?unquote(enData)

????dmsg?=?decrypt(priv_key_str,?mmsg)

????print("解密:%s"?%?dmsg)



python3.6版本

pip3 install pycryptodome

#!/usr/bin/env?python

#?-*-?coding:?utf-8?-*-

#?Description:

#?@Time????:?2019/8/12?23:07

#?@Author??:?hubo

#?@Email???:?hagic.hhj@gmail.com

"""

python2.7

"""

import?base64,json

from?Crypto.PublicKey?import?RSA?as?rsa

from?Crypto.Cipher?import?PKCS1_v1_5

from?urllib?import?quote,?unquote

pub_key_str?=?"""-----BEGIN?PUBLIC?KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRUUJTzy4Nm9js/gbfE2K4QjIP

Lo+9a9s+xaK3mlyWHPgdTWfAFdqcTI2Rv8jysqE7OdAzl/lOO5j0d1yVyq/sUkc9

/43A8xyyC1cxmIFvWLYhS5cyKfxy5lrW32ynMcH17OJSJ5fSKLAHd2kZ7npnI9C7

DImkPmwbuLLGrbo1ZwIDAQAB

-----END?PUBLIC?KEY-----"""

priv_key_str?=?"""-----BEGIN?RSA?PRIVATE?KEY-----

MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANFRQlPPLg2b2Oz+

Bt8TYrhCMg8uj71r2z7ForeaXJYc+B1NZ8AV2pxMjZG/yPKyoTs50DOX+U47mPR3

XJXKr+xSRz3/jcDzHLILVzGYgW9YtiFLlzIp/HLmWtbfbKcxwfXs4lInl9IosAd3

aRnuemcj0LsMiaQ+bBu4ssatujVnAgMBAAECgYEAyhvcH3B810cUPkFKATuGpsPD

8kTTJeNu3z2V0BKMM6XlLOYAt8hiPWjtiT3VmgJBDB7Wmfq0DoYdOm/GRhxfn+DV

j/kDbXIlEe0jQkwDmCgLpN0rIGaqnY22yeEkfTHyLnwnRNu0HMbOmNsY27HolkjS

2iANzJuw2Cnt8kx38AECQQDumFy4nZnGZWNJ0PV15i1a03XJH+bdopmGj+k4LErU

dcDQvdd/ZvyFAiK7VNgAxoKCmP1d09BP9FDxW9RBHgTnAkEA4JYmisJtxUUs5Oji

CVaxmczeetP+px68NnqBVLrEvrdUtDsAHU//zEhWGWkGJA6b3puayD7viDUr0861

mjO7gQJAR08MLzUTF4OH2DD2m6UOmx2mD1VUh5soLVpnhp1eQ/9pgDms5WvfPtVz

ke96m0i5CtU0rE047hyD8I7Uch3JswJAQQ8eISpLtE7iv3k7KatkjYJMnNZWucDs

kveQCaSFJB5lukQxN0yadGosDvZeogldW/JFt2aL6zBD/vqtnvsHgQJBAMYwWXEY

tH/dBGao8NGDmzokEvlninUFLuUQm2gV3Gtm+KiJ9vsqFeuEMhcwby1BI0FHUDOW

Y+U95ipVY+0cMRc=

-----END?RSA?PRIVATE?KEY-----"""

def?encrypt(pub_key_str,?msg):

????pubobj?=?rsa.importKey(pub_key_str)

????pubobj?=?PKCS1_v1_5.new(pubobj)

????buffer?=?[]

????while?msg:??#?分段進(jìn)行加密

????????input?=?msg[:117]

????????tmp?=?pubobj.encrypt(input)

????????buffer.append(tmp)

????????msg?=?msg[117:]

????data?=?base64.b64encode(''.join(buffer))

????return?data

def?decrypt(priv_key_str,?msg):

????privobj?=?rsa.importKey(priv_key_str)

????privobj?=?PKCS1_v1_5.new(privobj)

????ctxt_pri?=?base64.b64decode(msg)??#?先將str轉(zhuǎn)成base64

????buffer?=?[]

????while?ctxt_pri:

????????input?=?ctxt_pri[:128]

????????ctxt_pri?=?ctxt_pri[128:]

????????tmp?=?privobj.decrypt(input,?'decrypt?error')

????????buffer.append(tmp)

????return?''.join(buffer)

if?__name__?==?"__main__":

????salt?=?"msg="

????data?=?{

????????????"subject":?"現(xiàn)網(wǎng)警告,請(qǐng)盡快處理",

????????????"fromname":?"告警",

????????????"mail":?"XXXX@qq.com",

????????????"html":?"恢復(fù),?服務(wù)器:?192.168.2.111?utilization?more?than?90%?bj,故障:IO?已恢復(fù)!"

????}

????##utf-8格式化字符串,

????msg?=?salt?+?json.dumps(data,?ensure_ascii=False,?encoding='utf-8')

????##去掉json格式化字典后,字典元素之前的空格

????msg?=?msg.replace('":?',?'":').replace(',?"',?',"').replace(",?{",?",{")

????print(msg)

????#加密

????mmsg?=?encrypt(pub_key_str,?msg)

????enData?=?quote(mmsg)

????print("加密:%s"?%?enData)

????#解密

????mmsg?=?unquote(enData)

????dmsg?=?decrypt(priv_key_str,?mmsg)

????print("解密:%s"?%?dmsg)



補(bǔ)充下python2下用M2Crypto包加解密方法

yum install -y python-devel

pip2 install M2Crypto

#!/usr/bin/env?python

#?-*-?coding:?utf-8?-*-

#?Description:

#?@Time????:?2019/8/12?23:07

#?@Author??:?hubo

#?@Email???:?hagic.hhj@gmail.com

"""

python2.7

"""

import?base64,json

from?Crypto.PublicKey?import?RSA?as?rsa

from?Crypto.Cipher?import?PKCS1_v1_5

from?urllib?import?quote,?unquote

pub_key_str?=?"""-----BEGIN?PUBLIC?KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRUUJTzy4Nm9js/gbfE2K4QjIP

Lo+9a9s+xaK3mlyWHPgdTWfAFdqcTI2Rv8jysqE7OdAzl/lOO5j0d1yVyq/sUkc9

/43A8xyyC1cxmIFvWLYhS5cyKfxy5lrW32ynMcH17OJSJ5fSKLAHd2kZ7npnI9C7

DImkPmwbuLLGrbo1ZwIDAQAB

-----END?PUBLIC?KEY-----"""

priv_key_str?=?"""-----BEGIN?RSA?PRIVATE?KEY-----

MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANFRQlPPLg2b2Oz+

Bt8TYrhCMg8uj71r2z7ForeaXJYc+B1NZ8AV2pxMjZG/yPKyoTs50DOX+U47mPR3

XJXKr+xSRz3/jcDzHLILVzGYgW9YtiFLlzIp/HLmWtbfbKcxwfXs4lInl9IosAd3

aRnuemcj0LsMiaQ+bBu4ssatujVnAgMBAAECgYEAyhvcH3B810cUPkFKATuGpsPD

8kTTJeNu3z2V0BKMM6XlLOYAt8hiPWjtiT3VmgJBDB7Wmfq0DoYdOm/GRhxfn+DV

j/kDbXIlEe0jQkwDmCgLpN0rIGaqnY22yeEkfTHyLnwnRNu0HMbOmNsY27HolkjS

2iANzJuw2Cnt8kx38AECQQDumFy4nZnGZWNJ0PV15i1a03XJH+bdopmGj+k4LErU

dcDQvdd/ZvyFAiK7VNgAxoKCmP1d09BP9FDxW9RBHgTnAkEA4JYmisJtxUUs5Oji

CVaxmczeetP+px68NnqBVLrEvrdUtDsAHU//zEhWGWkGJA6b3puayD7viDUr0861

mjO7gQJAR08MLzUTF4OH2DD2m6UOmx2mD1VUh5soLVpnhp1eQ/9pgDms5WvfPtVz

ke96m0i5CtU0rE047hyD8I7Uch3JswJAQQ8eISpLtE7iv3k7KatkjYJMnNZWucDs

kveQCaSFJB5lukQxN0yadGosDvZeogldW/JFt2aL6zBD/vqtnvsHgQJBAMYwWXEY

tH/dBGao8NGDmzokEvlninUFLuUQm2gV3Gtm+KiJ9vsqFeuEMhcwby1BI0FHUDOW

Y+U95ipVY+0cMRc=

-----END?RSA?PRIVATE?KEY-----"""

def?encrypt(pub_key_str,?msg):

????pubobj?=?rsa.importKey(pub_key_str)

????pubobj?=?PKCS1_v1_5.new(pubobj)

????buffer?=?[]

????while?msg:??#?分段進(jìn)行加密

????????input?=?msg[:117]

????????tmp?=?pubobj.encrypt(input)

????????buffer.append(tmp)

????????msg?=?msg[117:]

????data?=?base64.b64encode(''.join(buffer))

????return?data

def?decrypt(priv_key_str,?msg):

????privobj?=?rsa.importKey(priv_key_str)

????privobj?=?PKCS1_v1_5.new(privobj)

????ctxt_pri?=?base64.b64decode(msg)??#?先將str轉(zhuǎn)成base64

????buffer?=?[]

????while?ctxt_pri:

????????input?=?ctxt_pri[:128]

????????ctxt_pri?=?ctxt_pri[128:]

????????tmp?=?privobj.decrypt(input,?'decrypt?error')

????????buffer.append(tmp)

????return?''.join(buffer)

if?__name__?==?"__main__":

????salt?=?"msg="

????data?=?{

????????????"subject":?"現(xiàn)網(wǎng)警告,請(qǐng)盡快處理",

????????????"fromname":?"告警",

????????????"mail":?"XXXX@qq.com",

????????????"html":?"恢復(fù),?服務(wù)器:?192.168.2.111?utilization?more?than?90%?bj,故障:IO?已恢復(fù)!"

????}

????##utf-8格式化字符串,

????msg?=?salt?+?json.dumps(data,?ensure_ascii=False,?encoding='utf-8')

????##去掉json格式化字典后,字典元素之前的空格

????msg?=?msg.replace('":?',?'":').replace(',?"',?',"').replace(",?{",?",{")

????print(msg)

????#加密

????mmsg?=?encrypt(pub_key_str,?msg)

????enData?=?quote(mmsg)

????print("加密:%s"?%?enData)

????#解密

????mmsg?=?unquote(enData)

????dmsg?=?decrypt(priv_key_str,?mmsg)

????print("解密:%s"?%?dmsg)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容