浏览 3735 次
锁定老帖子 主题:一个用于简单加密的Base64变形算法源码
精华帖 (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.
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |