吾八哥博客

您现在的位置是:首页 > 码农手记 > Golang > 正文

Golang

Golang/Delphi实现的异或加密的方法

吾八哥2020-12-22Golang2264

异或加密是一个比较简单的加密方法,之前写了一个小工具,近期服务端从Delphi改为Golang了,里面用到了一个异或加密的算法,这里分享下具体的实现:

Golang版本实现方法:

package xor

import (
  "strconv"
)

// DefaultKey ...
const DefaultKey = "www.5bug.wang"

// Enc ...
func Enc(src, key string) (des string) {
  if key == "" {
    key = DefaultKey
  }
  keys := []byte(key)
  j := 0
  bt := []rune(src)
  for i := 0; i < len(bt); i++ {
    s := strconv.FormatInt(int64(byte(bt[i])^keys[j]), 16)
    if len(s) == 1 {
      s = "0" + s
    }
    des = des + (s)
    j = (j + 1) % 8
  }
  return
}

// Dec ...
func Dec(src, key string) (des string) {
  if key == "" {
    key = DefaultKey
  }
  keys := []byte(key)
  j := 0
  bt := []rune(src)
  for i := 0; i < len(src)/2; i++ {
    l, _ := strconv.ParseInt(string(bt[i*2:i*2+2]), 16, 0)
    des = des + string(byte(l)^keys[j])
    j = (j + 1) % 8
  }
  return
}

delphi版本实现方法:

unit uXor;

interface

uses System.SysUtils;

function XorEnc(AStr: string; AKey: string = ''): string;
function XorDec(AStr: string; AKey: string = ''): string;

implementation

const
  DefaultKey = 'www.5bug.wang';

function XorEnc(AStr: string; AKey: string): string;
var
  i, j: Integer;
  LBytes: TBytes;
begin
  if AKey = '' then
    AKey := DefaultKey;
  LBytes := BytesOf(AKey);
  Result := '';
  j := 0;
  for i := 1 to Length(AStr) do
  begin
    Result := Result + IntToHex(Byte(AStr[i]) xor LBytes[j], 2);
    j := (j + 1) mod 8;
  end;
end;

function XorDec(AStr: string; AKey: string): string;
var
  i, j: Integer;
  LBytes: TBytes;
begin
  if AKey = '' then
    AKey := DefaultKey;
  LBytes := BytesOf(AKey);
  Result := '';
  j := 0;
  for i := 1 to Length(AStr) div 2 do
  begin
    Result := Result + Char(StrToInt('$' + Copy(AStr, i * 2 - 1, 2)) xor LBytes[j]);
    j := (j + 1) mod 8;
  end;
end;

end.