A. 5-python庫之-paho mqtt通訊
連接調用connect介面,然後調用loop_forever後就開始跑了
connect的第三個參數為mqtt的心跳時間
on_connect 和 on_disconnect 為連接成功和斷開的回掉函數,
添加證書,只需要在調用connect函數之前,添加下面兩條內容即可。
設置賬號密碼,在調用connect函數之前,添加下面一條內容即可。
設置WILL主題,在調用connect函數之前,使用will_set介面設置,添加will主題和will主題的payload
主題的訂閱使用subscribe介面,一般在on_connect回調函數裡面設置
訂閱完主題,我們的目的就是要收到訂閱的數據,所以需要設置接收數據的回調函數on_message
,只要有數據發送過來on_message就會收到。
發布使用publish介面,如下
B. 求python中的愷撒密碼的加密,解密,以及破解的程序
凱撒密碼作為一種最為古老的對稱加密體制,在古羅馬的時候都已經很流行,他的基本思想是:通過把字母移動一定的位數來實現加密和解密。明文中的所有字母都在字母表上向後(或向前)按照一個固定數目進行偏移後被替換成密文。例如,當偏移量是3的時候,所有的字母A將被替換成D,B變成E,以此類推X將變成A,Y變成B,Z變成C。由此可見,位數就是凱撒密碼加密和解密的密鑰。
如下代碼是以偏移量為13展開計算的。123
源代碼如下:
sr1="abcdefghijklmnopqrstuvwxyz"sr2=sr1.upper()
sr=sr1+sr1+sr2+sr2
st="The Zen of Python"sResult=""for j in st: if j==" ":
sResult = sResult +" "
continue
i=sr.find(j) if(i>-1):
sResult=sResult+sr[i+13]print sResult12345678910111213
運行結果為:
Gur Mra bs Clguba
C. python3 import Crypto 失敗的解決辦法 (AES對稱加密使用 模塊)
# 先導入所需要的包
pip3 install Crypto
# 再安裝pycrypto
pip3 install pycrypto
from Crypto.Cipher import AES # 就成功了
使用說明,參見:
https://codeghar.wordpress.com/2013/09/06/beginning-aes-with-python3/
D. Python 加密程序
#coding=utf-8
'''''
Description:可逆的加密與解密
Environment:python2.5.x
Author:[email protected]
'''
importos
importsys
classCode(object):
'''''可逆的加密與解密'''
def__init__(self,key="[email protected]"):
self.__src_key=key
self.__key=self.__get_strascii(self.__src_key,True)
defencode(self,value):
'''''加密函數,加密後為一串數字'''
return"%d"%(self.__get_strascii(value,True)^self.__key)
defdecode(self,pwd):
'''''解密函數'''
ifself.is_number(pwd):
returnself.__get_strascii((int(pwd))^self.__key,False)
else:
print'requirenumber.'
defreset_key(self,key):
'''''重新設置key'''
self.__src_key=key
self.__key=self.__get_strascii(self.__src_key,True)
#===============================================================================
#內部調用介面
#===============================================================================
def__get_strascii(self,value,bFlag):
ifbFlag:
returnself.__get_str2ascii(value)
else:
returnself.__get_ascii2str(value)
def__get_str2ascii(self,value):
ls=[]
foriinvalue:
ls.append(self.__get_char2ascii(i))
returnlong("".join(ls))
def__get_char2ascii(self,char):
'''''獲取單個字元的acsii碼值'''
try:
return"%03.d"%ord(char)
except(TypeError,ValueError):
print"keyerror."
exit(1)
def__get_ascii2char(self,ascii):
ifself.is_ascii_range(ascii):
returnchr(ascii)
else:
print"asciierror(%d)"%ascii
exit(1)
def__get_ascii2str(self,n_chars):
ls=[]
s="%s"%n_chars
n,p=divmod(len(s),3)
ifp>0:
nRet=int(s[0:p])
ls.append(self.__get_ascii2char(nRet))
pTmp=p
whilepTmp<len(s):
ls.append(self.__get_ascii2char(int(s[pTmp:pTmp+3])))
pTmp+=3
return"".join(ls)
#================================================================================
#工具介面
#================================================================================
defis_number(self,value):
try:
int(value)
returnTrue
except(TypeError,ValueError):
pass
returnFalse
defis_ascii_range(self,n):
return0<=n<256
defis_custom_ascii_range(self,n):
return33<=n<48or58<=n<126
classUsage(object):
'''''
命令行參數讀取與解析
'''
def__init__(self):
self._clsWork=Code()
self._args_dic={'arg_help':['-?','-help'],
'arg_p':['-p','-pwd'],
'arg_t':['-t','-text'],
'arg_k':['-k','-key'],
}
defhelp(self,*k):
strHelp="Usage:pwd[-options][args...]whereoptioninclude:"
strHelp+="""
-?-helpprintthishelpmessage
-k<key_str>-p<pwd_str>
-k<key_str>-t<text_str>"""
printstrHelp
defargs(self,argv_ls):
'''''dispatchcommand'''
#printargv_ls
iflen(argv_ls)<=1orlen(argv_ls)>5:
print'Unrecognizedoption'
return
cmd_dic={}
curr_cmd=''
#controlcommand
fori,vinenumerate(argv_ls[1:]):
forjinself._args_dic.items():
#addcommand
ifvinj[1]andj[0]notincmd_dic:
curr_cmd=j[0]
cmd_dic[curr_cmd]=[]
break
else:
#addargv
ifcmd_dic:
cmd_dic[curr_cmd].append(v)
#execcommand
ifcmd_dic:
self.exec_cmd(cmd_dic)
else:
print'Unrecognizedoption'
defexec_cmd(self,cmd_dic):
'''''execcmd'''
iflen(cmd_dic)==2:
if'arg_p'incmd_dicand'arg_k'incmd_dic
andlen(cmd_dic['arg_p'])==1andlen(cmd_dic['arg_k'])==1:
self._clsWork.reset_key(cmd_dic['arg_k'][0])
printself._clsWork.encode(cmd_dic['arg_p'][0])
return
elif'arg_t'incmd_dicand'arg_k'incmd_dic
andlen(cmd_dic['arg_t'])==1andlen(cmd_dic['arg_k'])==1:
self._clsWork.reset_key(cmd_dic['arg_k'][0])
printself._clsWork.decode(cmd_dic['arg_t'][0])
return
self.help()
if__name__=='__main__':
usage=Usage()
usage.args(sys.argv)
E. python中AES 用ECB模式加密之後為什麼和C#加密之後的結果不一樣
AES是美國國家標准技術研究所NIST旨在取代DES的21世紀的加密標准。 AES的基本要求是,採用對稱分組密碼體制,密鑰長度的最少支持為128、192、256,分組長度128位,演算法應易於各種硬體和軟體實現。1998年NIST開始AES第一輪分析、測試和徵集
F. python rsa模塊---生成公鑰和私鑰的方法
https://blog.csdn.net/six66hao/article/details/81814576
https://blog.csdn.net/whatday/article/details/97617461
https://blog.csdn.net/xiongzaiabc/article/details/88400748
https://blog.csdn.net/zhao3587717/article/details/83111082/
一.
非對稱加密演算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)
對稱加密演算法大家共用一個密鑰
數字簽名: 就是為了證明該信件是確定的人發出的,而不是黑客冒充發出的
eg:
1.鮑勃給蘇珊回信,決定採用"數字簽名"。他寫完後先用Hash函數,生成信件的摘要(digest)。
二.用RSA庫可以生成公鑰和私鑰
到時候把公鑰給前端,後端保存公鑰和私鑰
三.在用戶注冊/登入時,輸入密碼後前端會用JS對密碼進行加密傳送到後端
一般現在對於密碼的加密解密都用RSA進行
G. Python簡單加密操作
加密是將一個明文數據,按照指定的演算法,運算得到一個其他的可以隱藏真實信息的密文數據,這個過程稱為加密;處理的演算法稱為加密演算法;用到的關鍵數據稱為密鑰。
解密是按照制定的演算法和關鍵數據,將一個密文數據進行逆向運算得到的正確的明文數據的過程
如:用戶賬號密碼存儲,此時任何人都不能查看該用戶的明文密碼
1.原始數據
2.編碼(轉換為位元組數據)
3.使用演算法加密
4.利用鹽值更新密文
5.得到加密後的數據
編碼:字元串.encode(編碼名稱)——>位元組數據
解碼:位元組數據.decode(編碼名稱)——>字元串數據
==========================================
H. python文本加密是什麼
python文本加密是Python 提供了諸如 hashlib,base64 等便於使用的加密庫,我們可以藉助異或操作,實現一個簡單的文件加密程序。
通過了解異或操作的性質,加密原理就非常清晰了。
首先將文件轉換成二進制數,再生成與該二進制數等長的隨機密鑰,將二進制數與密鑰進行異或操作,得到加密後的二進制數。
將加密後的二進製程序與密鑰進行異或操作,就得到原二進制數,最後將原二進制數恢復成文本文件。
相關拓展
加密,是以某種特殊的演算法改變原有的信息數據,使得未授權的用戶即使獲得了已加密的信息,但因不知解密的方法,仍然無法了解信息的內容。
加密之所以安全,絕非因不知道加密解密演算法方法,而是加密的密鑰是絕對的隱藏,流行的RSA和AES加密演算法都是完全公開的,一方取得已加密的數據,就算知道加密演算法也好,若沒有加密的密鑰,也不能打開被加密保護的信息。
單單隱蔽加密演算法以保護信息,在學界和業界已有相當討論,一般認為是不夠安全的。公開的加密演算法是給黑客和加密家長年累月攻擊測試,對比隱蔽的加密演算法要安全得多。
盡管加密或為了安全目的對信息解碼這個概念十分簡單,但在這里仍需對其進行解釋。數據加密的基本過程包括對稱為明文的原來可讀信息進行翻譯,譯成稱為密文或密碼的代碼形式。該過程的逆過程為解密,即將該編碼信息轉化為其原來的形式的過程。
以上內容參考 網路-加密
I. 密碼學基礎之對稱加密(一)
就不給定義了,我簡單解釋下,就是我的信息不想讓別人知道,使用 秘鑰(key) 對我的信息進行 加密(encrypt) ,變成鬼符一樣的 秘文(ciphertext) 。別人就算看到了,也無法識別,只有有了秘鑰,把秘文 解密(decrypt) 後才能看懂信息,秘鑰呢?一般人我不告訴他。我的秘鑰是私密信息,所以也叫 私鑰(private key) ,加密和解密用的秘鑰是相同的,所以叫 「對稱加密」 ,也叫 「私鑰加密」 。
對於明文plaintext,和對稱秘鑰key
加密過程 E(plaintext, key) = ciphertext
解密過程 D(ciphertext, key) = plaintext
對稱加密的分為 分組密碼(block cipher) 和 流密碼(stream cipher) 兩種類型。本文只介紹分組密碼。
分組密碼是每次只能處理特定長度的一塊(block)數據的一類加解密演算法。AES就是一種分組密碼演算法。AES加密演算法每次可以加密的塊長度是128位(bit)。
ECB模式
使用AES加密演算法ECB模式,每次能加密128位數據,即16個位元組。如果要加密48個位元組內容,我們需要把數據分為3組,每組16個位元組,分別為P1、P2、P3。P1、P2、P3加密後形成的秘文分別為C1、C2、C3,我們把C1、C2、C3依次拼接起來就成為最終的加密結果。
CBC模式
《對稱加密之對稱加密二》正在寫作,會包含分組密碼的更多模式,流密碼及AES的更多知識。
DES加密:舊的加密演算法,NIST規定僅能用於遺留系統和TDEA。(參考文獻[CNS] 3.2章)
TDEA(Triple DEA)加密:很多資料也叫3DES(Triple DES)。(參考文獻[SP800-67])
Python 可以使用 pycrypto 模塊進行AES加解密。安裝 pycrypto 可使用命令 pip install pycrypto 安裝。
下面AES演示第一版,先看下,緊接著就會升級到第二版本。
運行一下,能正常加解密。但是,如果你把要加密的文本,從 aesAlgorithmDemo 改為 hello ,就會運行報錯:
這是因為,AES的分組長度是128位,即16個位元組。有些AES實現,要加密的消息長度不是16個位元組的倍數需要填充。
填充的方法一般是按照PKCS#7填充標准。
如果要數據的長度不是分組的整數倍,需要填充數據到分組的倍數,如果數據的長度是分組的倍數,需要填充分組長度的數據,填充的每個位元組值為填充的長度。PKCS#7支持的分組長度為1到255個位元組。
舉一些例子:
AES的分組長度為16個位元組,不管秘鑰是128位、192位還是256位。如果要加密的數據長度是5個位元組,你需要填充11個位元組,填充的內容位填充的長度0x0b。填充後類似下面表示
如果數據長度是30個位元組,需要填充2個位元組,每個位元組的內容為0x02,如果數據成都恰好為16的倍數,需要填充16個位元組,每個位元組的內容為0x10。
弄明白填充的概念後,我們重寫加解密函數如下:
這樣填充後會不會可其它系統不兼容?不會。一般的AES程序都是支持PKCS#7填充的。
密碼學基礎之RSA與不對稱秘鑰
密碼學基礎系列
[CNS] 《密碼編碼學與網路安全》(第六版)
[SP800-67] NIST Special Publication 800-67 Revision 1, Recommendation for Triple Data Encryption Algorithm (TDEA) Block Cipher, January 2012.
[SSH] OpenSSH CBC模式信息泄露漏洞
[NIST SP 800-57 Part 1 Rev. 4] Recommendation for Key Management, Part 1: General
J. python的加密方式: rsa加密和解密
RSA加密是一種非對稱加密,通常使用公鑰加密,私鑰解密。
生成文件如下圖:
可以將生成的公鑰、私鑰粘貼復制存儲起來,以便使用:
在使用中, 通常會先對數據進行bas64加密, 再對加密後的內容使用rsa加密, 最後對rsa解密後的內容進行bas64解密.