首页
社区
课程
招聘
[原创]Base64加密算法Delphi7源码,可能是错的
发表于: 2005-9-28 14:06 9988

[原创]Base64加密算法Delphi7源码,可能是错的

2005-9-28 14:06
9988

//**************************Base64加密算法*********************************
//****************************wofan[OCN]***********************************

var
  Form1: TForm1;
  const
  base='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';  //要注意的是Delphi字串实际上是一个一维                                                                             //数组,从0开始存放,所以,后面查表时
                                                                              //数组

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
name:string;                       //注册名
lname:integer;                     //注册名长度
i,a,b,c:integer;                   //i是一个计数器,其它是存放零时数据
code:string;                      //注册码
  s1,s2:char;                      //只是为了存放零时数据,原因是Base64中要排列好找到的字符
begin
name:=trim(edit1.Text);
lname:=length(name);
a:=lname mod 3;                      //这里是Base64的特征
lname:=lname-a;

code:='';                          //变量初始化
i:=lname;
while (i<>0) do
begin
c:=0;
c:=(((ord(name[i-2])shl 8) or ord(name[i-1]))shl 8)or ord(name[i]);  //只是为了Base64的注册码要重排找到的字符。
b:=c and $3F;   //用b去查表                                       三个注册名字符产生四个注册码字符
code:=base[b+1]+code;
c:=c shr 6;
b:=c and $3F;    //用b去查表
code:=base[b+1]+code;
c:=c shr 6;
b:=c and $3F;    //用b 去查表
code:=base[b+1]+code;
c:=c shr 6;
code:=base[c+1]+code; //最后不要and ,直接用c去查表
i:=i-3;           //进行下一轮
end;

case a of                        
  1:
  begin
  c:=ord(name[lname+a]) shl 4;
  b:=c and $3F;  //查表
  s1:=base[b+1];
  c:=c shr 6;      //查表
  code:=code+base[c+1]+s1+chr($3D)+chr($3D);
  end;
  2:
  begin
  c:=(ord(name[lname+1]) shl 8)or ord(name[lname+2]);
  c:=c shl 2 ;
  b:=c and $3F;
  s1:=base[b+1];
  c:=c shr 6;
  b:=c and $3F;
  s2:=base[b+1];
  c:=c shr 6;
  code:=code+base[c+1]+s2+s1+chr($3D);
  end;
  end; //end case

edit2.Text:=code;                       //输出
end;

end.
{by wofan[OCN]
14:02 2005-6-28
看了网上下载的一份BASE64的源码,特复杂,看不下去。
依据OD反汇编的结果,写出这个程序。
不过这段代码却能代替它,不会出错,这倒底是怎么一回事呢?
难道Base64还有别的什么东东,我没有看清楚??
我的天,这是什么代码!!
我在那个地方出错呢。为什么那个高人的源码会如此庞大呢?}


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (5)
雪    币: 442
活跃值: (1216)
能力值: ( LV12,RANK:1130 )
在线值:
发帖
回帖
粉丝
2
贴个正确的

unit Base64;

interface
uses
  Sysutils;

function Base64EncodeStr(const Value: string): string;
function Base64DecodeStr(const Value: string): string;
function Base64Encode(pInput: pointer; pOutput: pointer; Size: longint): longint;
function Base64Decode(pInput: pointer; pOutput: pointer; Size: longint): longint;

implementation

const
  B64: array[0..63] of byte= (65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,
    81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,
    109,110,111,112,113,114,115,116,117,118,119,120,121,122,48,49,50,51,52,53,
    54,55,56,57,43,47);

function Base64Encode(pInput: pointer; pOutput: pointer; Size: longint): longint;
var
  i, iptr, optr: integer;
  Input, Output: PByteArray;
begin
  Input:= PByteArray(pInput); Output:= PByteArray(pOutput);
  iptr:= 0; optr:= 0;
  for i:= 1 to (Size div 3) do
  begin
    Output^[optr+0]:= B64[Input^[iptr] shr 2];
    Output^[optr+1]:= B64[((Input^[iptr] and 3) shl 4) + (Input^[iptr+1] shr 4)];
    Output^[optr+2]:= B64[((Input^[iptr+1] and 15) shl 2) + (Input^[iptr+2] shr 6)];
    Output^[optr+3]:= B64[Input^[iptr+2] and 63];
    Inc(optr,4); Inc(iptr,3);
  end;
  case (Size mod 3) of
    1: begin
         Output^[optr+0]:= B64[Input^[iptr] shr 2];
         Output^[optr+1]:= B64[(Input^[iptr] and 3) shl 4];
         Output^[optr+2]:= byte('=');
         Output^[optr+3]:= byte('=');
       end;
    2: begin
         Output^[optr+0]:= B64[Input^[iptr] shr 2];
         Output^[optr+1]:= B64[((Input^[iptr] and 3) shl 4) + (Input^[iptr+1] shr 4)];
         Output^[optr+2]:= B64[(Input^[iptr+1] and 15) shl 2];
         Output^[optr+3]:= byte('=');
       end;
  end;
  Result:= ((Size+2) div 3) * 4;
end;

function Base64EncodeStr(const Value: string): string;
begin
  SetLength(Result,((Length(Value)+2) div 3) * 4);
  Base64Encode(@Value[1],@Result[1],Length(Value));
end;

function Base64Decode(pInput: pointer; pOutput: pointer; Size: longint): longint;
var
  i, j, iptr, optr: integer;
  Temp: array[0..3] of byte;
  Input, Output: PByteArray;
begin
  Input:= PByteArray(pInput); Output:= PByteArray(pOutput);
  iptr:= 0; optr:= 0;
  Result:= 0;
  for i:= 1 to (Size div 4) do
  begin
    for j:= 0 to 3 do
    begin
      case Input^[iptr] of
        65..90 : Temp[j]:= Input^[iptr] - Ord('A');
        97..122: Temp[j]:= Input^[iptr] - Ord('a') + 26;
        48..57 : Temp[j]:= Input^[iptr] - Ord('0') + 52;
        43     : Temp[j]:= 62;
        47     : Temp[j]:= 63;
        61     : Temp[j]:= $FF;
      end;
      Inc(iptr);
    end;
    Output^[optr]:= (Temp[0] shl 2) or (Temp[1] shr 4);
    Result:= optr+1;
    if (Temp[2]<> $FF) and (Temp[3]= $FF) then
    begin
      Output^[optr+1]:= (Temp[1] shl 4) or (Temp[2] shr 2);
      Result:= optr+2;
      Inc(optr)
    end
    else if (Temp[2]<> $FF) then
    begin
      Output^[optr+1]:= (Temp[1] shl 4) or (Temp[2] shr 2);
      Output^[optr+2]:= (Temp[2] shl 6) or  Temp[3];
      Result:= optr+3;
      Inc(optr,2);
    end;
    Inc(optr);
  end;
end;

function Base64DecodeStr(const Value: string): string;
begin
  SetLength(Result,(Length(Value) div 4) * 3);
  SetLength(Result,Base64Decode(@Value[1],@Result[1],Length(Value)));
end;

end.
2005-9-28 14:50
0
雪    币: 10
活跃值: (130)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
注意到
base='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

B64: array[0..63] of byte= (65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,48,49,50,51,52,53,54,55,56,57,43,47);
了吗?
这个表并非是规定死的。是可以变化的。
2005-9-28 19:41
0
雪    币: 2943
活跃值: (1788)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
4
可能就因为这样,我做成的注册机,也是完美的呀。
不过Baby2008提供的代码,是比较短的哟。
谢谢BABY2008!!!
真不好意思,在网吧上网,中英文切换这么不顺手。
就大写表示你的大名。
2005-9-29 16:24
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
最初由 hermit 发布
注意到
base='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

B64: array[0..63] of byte= (65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,48,49,50,51,52,53,54,55,56,57,43,47);
了吗?
........


这两个其实是一样的,后面的数组形式,都是前一种字符串的ASCII码值
2006-3-10 20:57
0
雪    币: 225
活跃值: (218)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
网上源码大把哟
2006-3-21 14:52
0
游客
登录 | 注册 方可回帖
返回
//