資源簡介
純python實現的RC4加解密,不依賴任何第三方庫,兼容python2和python3,支持中文加解密
代碼片段和文件信息
#!python
#?-*-?coding:utf-8?-*-
“““
公用函數(rc4加密),兼容py2及py3
Created?on?2014/5/26
Updated?on?2017/11/9
@author:?Holemar
“““
import?sys
__all__?=?(“decode“?‘encode‘)
def?RC4(data?key):
????“““rc4加密的核心算法“““
????x?=?0
????box?=?list(range(256))
????for?i?in?list(range(256)):
????????x?=?(x?+?box[i]?+?ord(key[i?%?len(key)]))?%?256
????????box[i]?box[x]?=?box[x]?box[i]
????x?=?0
????y?=?0
????out?=?[]
????for?char?in?data:
????????x?=?(x?+?1)?%?256
????????y?=?(y?+?box[x])?%?256
????????box[x]?box[y]?=?box[y]?box[x]
????????out.append(chr(ord(char)?^?box[(box[x]?+?box[y])?%?256]))
????return?‘‘.join(out)
def?hex2str(s):
????“““16進制轉字符串“““
????if?s[:2]?in?(‘0x‘?‘0X‘):
????????s?=?s[2:]
????res?=?[]
????for?i?in?list(range(0?len(s)?2)):
????????hex_dig?=?s[i:i?+?2]
????????res.append(chr(int(hex_dig?base=16)))
????return?‘‘.join(res)
def?str2hex(input_str):
????“““字符串轉16進制“““
????res?=?[]
????for?s?in?input_str:
????????hex_dig?=?hex(ord(s))[2:]
????????if?len(hex_dig)?==?1:
????????????hex_dig?=?“0“?+?hex_dig
????????res.append(hex_dig)
????return?‘‘.join(res)
def?decode(rc4_txt?key):
????“““
????將rc4加密后的密文,解密出來
????:param?{string}?rc4_txt:?RC4加密后的密文
????:param?{string}?key:?加密/解密的key值
????:return?{string}:?返回解密后的明文
????“““
????if?not?rc4_txt:
????????return?rc4_txt
????if?not?key:
????????raise?RuntimeError(u‘缺少解密的key!‘)
????rc4_txt?=?to_str(rc4_txt)
????key?=?to_str(key)
????real_text?=?RC4(hex2str(rc4_txt)?key)
????try:
????????unicode?#?py2
????????return?real_text
????except?NameError:?#?py3
????????b?=?bytes((ord(s)?for?s?in?real_text))
????????return?b.decode()
def?encode(real_text?key):
????“““
????將明文字符串,用RC4加密成密文
????:param?{string}?real_text:?明文的字符串
????:param?{string}?key:?加密/解密的key值
????:return?{string}:?返回加密后的密文
????“““
????if?not?real_text:
????????return?real_text
????if?not?key:
????????raise?RuntimeError(u‘缺少加密的key!‘)
????real_text?=?to_str(real_text)
????key?=?to_str(key)
????rc4_txt?=?str2hex(RC4(real_text?key))
????return?rc4_txt
system_encoding?=?“utf-8“
defaultencoding?=?sys.getdefaultencoding()
def?to_str(text):
????“““
????中文轉換,將?unicode、gbk、big5?編碼轉成?str?編碼(utf-8)
????:param?{string}?text:?原字符串
????:return?{string}:?返回轉換后的字符串
????“““
????try:
????????if?isinstance(text?unicode):
????????????return?text.encode(system_encoding)
????????elif?isinstance(text?str):
????????????#?沒有中文,不必處理編碼
????????????if?text.isalnum():
????????????????return?text
????????????text?=?to_unicode(text)
????????????return?text.encode(system_encoding)
????????else:
????????????return?str(text)
????except?NameError:
????????#?py3?的處理
????????text?=?to_unicode(text)
????????retur
評論
共有 條評論