文档章节

Golang、python中的一个异或加密算法,用来加密字符串。

大洋的顶端
 大洋的顶端
发布于 2017/03/19 11:56
字数 524
阅读 355
收藏 1

在Go语言中,有自带的对称或者非对称加密函数,但是有点重量级,用起来也有点麻烦。

一般的游戏设计中,肯定不用Go自带的那些加密库,因为处理速度有点慢,服务器跟不上速度,客户端也跟不上速度。

平时开发中,我在delphi中、易语言中常用这个算法加密,算法是网上抄的:

XorKey可以自定义修改。

delphi代码:

const
   XorKey: array[0..7] of Byte = ($B2, $09, $BB, $55, $93, $6D, $44, $47); //字符串加密用

function Enc(Str: string): string; //字符加密函數  這是用的一個異或加密
var
   i, j: Integer;
begin
   Result := '';
   j := 0;
   for i := 1 to Length(Str) do
   begin
      Result := Result + IntToHex(Byte(Str[i]) xor XorKey[j], 2);
      j := (j + 1) mod 8;
   end;
end;             

function Dec(Str: string): string; //字符解密函數
var
   i, j: Integer;
begin
   Result := '';
   j := 0;
   for i := 1 to Length(Str) div 2 do
   begin
      Result := Result + Char(StrToInt('$' + Copy(Str, i * 2 - 1, 2)) xor XorKey[j]);
      j := (j + 1) mod 8;
   end;
end;

 

用Go语言改写后,是这样的,大家其实可以自己优化下。

var XorKey []byte = []byte{0xB2, 0x09, 0xBB, 0x55, 0x93, 0x6D, 0x44, 0x47}

type Xor struct {
}
type m interface {
   enc(src string) string
   dec(src string) string
}

func (a *Xor) enc(src string) string {
   var result string
   j := 0
   s := ""
   bt := []rune(src)
   for i := 0; i < len(bt); i++ {
      s = strconv.FormatInt(int64(byte(bt[i])^XorKey[j]), 16)
      if len(s) == 1 {
         s = "0" + s
      }
      result = result + (s)
      j = (j + 1) % 8
   }
   return result
}

func (a *Xor) dec(src string) string {
   var result string
   var s int64
   j := 0
   bt := []rune(src)
   fmt.Println(bt)
   for i := 0; i < len(src)/2; i++ {
      s, _ = strconv.ParseInt(string(bt[i*2:i*2+2]), 16, 0)
      result = result + string(byte(s)^XorKey[j])
      j = (j + 1) % 8
   }
   return result
}
func main() {
   xor := Xor{}
   fmt.Println(xor.enc("123fsgdg0fd"))
   fmt.Println(xor.dec("833b8833e00a2020826fdf"))
}

 

python中,可以这样来写。

class Xor:
    XorKey=[0xB2, 0x09, 0xBB, 0x55, 0x93, 0x6D, 0x44, 0x47]
    def __init__(self):
        pass
    @classmethod
    def enc(self,src):
        j,result=0,""
        bt=bytes(src,'ascii')
        h=len(bt)
        for i in range(h):
           result=result+hex(bt[i]^(self.XorKey[j]))[2:]
           j=(j+1)%8
        return result
    @classmethod
    def dec(self,src):
        j,result,h=0,"",0
        h=len(src)
        for i in range(0,h,2):
           result=result + chr (int( src[i:i+2],16)^self.XorKey[j])
           j=(j+1)%8
        return result
a=Xor()
print(a.enc("123fsgdg0fd"))
print(a.dec("833b8833e00a2020826fdf"))

© 著作权归作者所有

大洋的顶端
粉丝 17
博文 30
码字总数 13805
作品 0
广州
私信 提问
破解爬虫过程中遇到的网页加密Email地址

文章首发个人微信公众号及博客:http://zmister.com/archives/269.html 欢迎访问个人博客:http://zmister.com 查看更多Python应用文章 欢迎关注个人微信公众号:州的先生 及时交流讨论 1、问...

州的先生
2018/05/15
0
0
Python基础——内置hashlib、IO、Json、codecs模块(0426)

一、hashlib 加密模块:提供了很多加密的算法 常见的加密方式:MD5 RSA,加密之后不可逆。没法破解。 1、以MD5的方式加密字符串(Python 3) 示例 结果 2、以MD5的方式加密字符串(Python 2)...

python初雪之路
2018/04/27
99
0
md5模块(Python内置模块)和hashlib模块

MD5模块用于产生消息摘要,康用来判断文件是否相同。 python的md5模块使用非常简单,包括以下几个函数: md5.new([arg]) 返回一个md5对象,如果给出参数,则相当于调用了update(arg) md5.upd...

duhaizhang
2012/07/15
20.7K
2
nodejs的crypto模块基础知识普及篇

前言 加密这方面nodejs自带原生的crypto模块,在网关开发中或多或少会牵涉到这块,大部分集中在、的加密上,因此我们封装了这么一个工具库用来平时的加密和解密使用,传送门。 在使用这些api...

小兀666
05/27
0
0
python实现简单的文件加密与解密

对于任意的一个文件,本质上来讲都是二进制的。 对于任意一个二进制数a,对其用另外任意一个与a的位数相同的二进制数m进行“异或”操作得到结果e,即e=a xor m; 如果再讲上面得到的e用m进行...

Aomo
2018/09/21
980
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
30分钟前
4
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
32分钟前
5
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
6
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
4
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部