一个用于简单加密的Base64变形算法源码

      最近有一个小项目中,有一些文本型的文件需要在不同用户间交换,为了防止用户恶意伪造数据,需要对数据做些简单加密。考虑了很多算法,非对称的,对称的都想过,但是要么是算法太复杂,在不同语言的系统间相互解密总是出些问题,又或者有性能问题不适合于加密较多的文本内容,考虑良久,决定还是化繁为简,用最简单的算法来实现自己的目标。Base64不能算是一种加密算法,对于标准的Base64编码字串,连三岁小孩都可以找个工具来解着玩,但如果把Base64的码表打乱,再进行编码,解密也就不是唾手可得的事了,对于加密这种要求不是很高的交换文件,应该还是可以的。

      于是,动手用Delphi写了下面这段代码。我不是Delphi高手,只是现学现卖,达到目的就成,代码写得好不好看也就不管了。

unit Base64;

interface
uses
  Sysutils;

function Base64Len(const srcLen : Integer):Integer; stdcall;
function Base64LenStr(const src : PChar):Integer; stdcall;
function Base64Encode(const Src :PChar; Dest: PChar; destLen : Integer ): Integer; stdcall;
function Base64Decode(const Src :PChar; Dest: PChar; destLen : Integer ): Integer; stdcall;

implementation
const B64Table = 'CDAENOPUIVWYZabTcdefghijklXmnFGKLMopqrstuJvQBRSwxyz0H123456789+/';
const B64Pad = '&';

function Base64Len;
begin
  Result := (4 * (srcLen + 3) div 3) + 1;
end;

function Base64LenStr;
var
  srcLen : Integer;
begin
  srcLen := StrLen(src);
  Result := Base64Len(srcLen);
end;

function Base64Encode(const Src: PChar; Dest : PChar; destLen : Integer ): Integer; stdcall;
var
  i: Integer;
  a: Integer;
  x: Integer;
  b: Integer;
  S: String;
  Ret: String;
begin
  S := StrPas( Src );
  a := 0;
  b := 0;
  for i := 1 to Length(s) do
  begin
    x := Ord(s[i]);
    b := b * 256 + x;
    a := a + 8;
    while a >= 6 do
    begin
      a := a - 6;
      x := b div (1 shl a);
      b := b mod (1 shl a);
      Ret := Ret + B64Table[x + 1];
    end;
  end;
  if a > 0 then
  begin
    x := b shl (6 - a);
    Ret := Ret + B64Table[x + 1];
  end;
  Result := length(Ret);
  StrCopy( Dest, PChar(Ret));
end;

function Base64Decode(const Src: PChar; Dest : PChar; destLen : Integer ): Integer; stdcall;
var
  i: Integer;
  a: Integer;
  x: Integer;
  b: Integer;
  S : String;
  Ret : String;
begin
  Result := -1;
  S := StrPas(Src);
  a := 0;
  b := 0;
  for i := 1 to Length(s) do
  begin
    x := Pos(s[i], B64Table) - 1;
    if x >= 0 then
    begin
      b := b * 64 + x;
      a := a + 6;
      if a >= 8 then
      begin
        a := a - 8;
        x := b shr a;
        b := b mod (1 shl a);
        x := x mod 256;
        Ret := Ret + chr(x);
      end;
    end
    else
      Exit;
  end;
  Result := length(Ret);
  StrCopy( Dest, PChar(Ret));
end;


end.

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值