python 加密解密 rc4_Python中实现的RC4算法

闲暇之时,用Python实现了一下RC4算法

编码 UTF-8

class 方式

#/usr/bin/python

#coding=utf-8

import sys,os,hashlib,time,base64

class rc4:

def __init__(self,public_key = None,ckey_lenth = 16):

self.ckey_lenth = ckey_lenth

self.public_key = public_key or 'none_public_key'

key = hashlib.md5(self.public_key).hexdigest()

self.keya = hashlib.md5(key[0:16]).hexdigest()

self.keyb = hashlib.md5(key[16:32]).hexdigest()

self.keyc = ''

def encode(self,string):

self.keyc = hashlib.md5(str(time.time())).hexdigest()[32 - self.ckey_lenth:32]

string = '0000000000' + hashlib.md5(string + self.keyb).hexdigest()[0:16] + string

self.result = ''

self.docrypt(string)

return self.keyc + base64.b64encode(self.result)

def decode(self,string):

self.keyc = string[0:self.ckey_lenth]

string = base64.b64decode(string[self.ckey_lenth:])

self.result = ''

self.docrypt(string)

result = self.result

if (result[0:10] == '0000000000' or int(result[0:10]) - int(time.time()) > 0) and result[10:26] == hashlib.md5(result[26:] + self.keyb).hexdigest()[0:16]:

return result[26:]

else:

return None

def docrypt(self,string):

string_lenth = len(string)

result = ''

box = list(range(256))

randkey = []

cryptkey = self.keya + hashlib.md5(self.keya + self.keyc).hexdigest()

key_lenth = len(cryptkey)

for i in xrange(255):

randkey.append(ord(cryptkey[i % key_lenth]))

for i in xrange(255):

j = 0

j = (j + box[i] + randkey[i]) % 256

tmp = box[i]

box[i] = box[j]

box[j] = tmp

for i in xrange(string_lenth):

a = j = 0

a = (a + 1) % 256

j = (j + box[a]) % 256

tmp = box[a]

box[a] = box[j]

box[j] = tmp

self.result += chr(ord(string[i]) ^ (box[(box[a] + box[j]) % 256]))

测试:

rc = rc4('nishidahuaidan')

string = '我在这里呢,你在那里呢'

print(string)

str = rc.encode(string)

print(str)

str = rc.decode(str)

print(str)

function方式

#/usr/bin/python

#coding=utf-8

import sys,os,hashlib,time,base64

def rc4(string, op = 'encode', public_key = 'ddd', expirytime = 0):

ckey_lenth = 4

public_key = public_key and public_key or ''

key = hashlib.md5(public_key).hexdigest()

keya = hashlib.md5(key[0:16]).hexdigest()

keyb = hashlib.md5(key[16:32]).hexdigest()

keyc = ckey_lenth and (op == 'decode' and string[0:ckey_lenth] or hashlib.md5(str(time.time())).hexdigest()[32 - ckey_lenth:32]) or ''

cryptkey = keya + hashlib.md5(keya + keyc).hexdigest()

key_lenth = len(cryptkey)

string = op == 'decode' and base64.b64decode(string[4:]) or '0000000000' + hashlib.md5(string + keyb).hexdigest()[0:16] + string

string_lenth = len(string)

result = ''

box = list(range(256))

randkey = []

for i in xrange(255):

randkey.append(ord(cryptkey[i % key_lenth]))

for i in xrange(255):

j = 0

j = (j + box[i] + randkey[i]) % 256

tmp = box[i]

box[i] = box[j]

box[j] = tmp

for i in xrange(string_lenth):

a = j = 0

a = (a + 1) % 256

j = (j + box[a]) % 256

tmp = box[a]

box[a] = box[j]

box[j] = tmp

result += chr(ord(string[i]) ^ (box[(box[a] + box[j]) % 256]))

if op == 'decode':

if (result[0:10] == '0000000000' or int(result[0:10]) - int(time.time()) > 0) and result[10:26] == hashlib.md5(result[26:] + keyb).hexdigest()[0:16]:

return result[26:]

else:

return None

else:

return keyc + base64.b64encode(result)

测试:

string = '我在这里呢,你在那里呢'

print(string)

str = rc4(string,'encode')

print(str)

rc = rc4(str,'decode')

print(rc)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值