论坛首页 综合技术论坛

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

浏览 3735 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-03-05  

      最近有一个小项目中,有一些文本型的文件需要在不同用户间交换,为了防止用户恶意伪造数据,需要对数据做些简单加密。考虑了很多算法,非对称的,对称的都想过,但是要么是算法太复杂,在不同语言的系统间相互解密总是出些问题,又或者有性能问题不适合于加密较多的文本内容,考虑良久,决定还是化繁为简,用最简单的算法来实现自己的目标。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.

 

论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics