function EncryptString(Source, Key: string): string;
//对字符串加密(Source:源 Key:密匙)
var
  KeyLen: integer;
  KeyPos: integer;
  Offset: integer;
  Dest: string;
  SrcPos: integer;
  SrcAsc: integer;
  Range: integer;
begin
  KeyLen := Length(Key);
  if KeyLen = 0 then
    Key := 'delphi';
  KeyPos := 0;
  Range := 256;
  randomize;
  Offset := random(Range);
  Dest := format('%1.2x', [Offset]);
  for SrcPos := 1 to Length(Source) do
  begin
    SrcAsc := (Ord(Source[SrcPos]) + Offset) mod 255;
    if KeyPos < KeyLen then
      KeyPos := KeyPos + 1
    else
      KeyPos := 1;
    SrcAsc := SrcAsc xor Ord(Key[KeyPos]);
    Dest := Dest + format('%1.2x', [SrcAsc]);
    Offset := SrcAsc;
  end;
  result := Dest;
end;
function UnEncryptString(Source, Key: string): string;
//对字符串解密(Src:源 Key:密匙)
var
  KeyLen: integer;
  KeyPos: integer;
  Offset: integer;
  Dest: string;
  SrcPos: integer;
  SrcAsc: integer;
  TmpSrcAsc: integer;
begin
  KeyLen := Length(Key);
  if KeyLen = 0 then
    Key := 'delphi';
  KeyPos := 0;
  Offset := strtoint('$' + copy(Source, 1, 2));
  SrcPos := 3;
  repeat
    SrcAsc := strtoint('$' + copy(Source, SrcPos, 2));
    if KeyPos < KeyLen then
      KeyPos := KeyPos + 1
    else
      KeyPos := 1;
    TmpSrcAsc := SrcAsc xor Ord(Key[KeyPos]);
    if TmpSrcAsc <= Offset then
      TmpSrcAsc := 255 + TmpSrcAsc - Offset
    else
      TmpSrcAsc := TmpSrcAsc - Offset;
    Dest := Dest + chr(TmpSrcAsc);
    Offset := SrcAsc;
    SrcPos := SrcPos + 2;
  until SrcPos >= Length(Source);
  result := Dest;
end; 

解决方案 »

  1.   

    老板要我星期一就提交,要不很难交代,这个是他在网上找的,我对Delphi可以说是一窍不通,各位老大帮帮忙,我这个问题已经发了三遍了,可就没人回...
      

  2.   

    // 无非是字符串处理和一个伪随机数。
    // strlen,strcpy,strcat等等就够用了。
      

  3.   

    我们公司是做PB开发的,现在做到加密狗步骤了,老板就要求用VC做dll扩展,可一直找不到合适的算法,自己写又达不到效果,这几天被老板搞的一塌糊涂,各位老大如果懂的话,请帮帮忙,或发我邮箱,谢谢...
      

  4.   

    我们试过des了,可明文的长度有限制
      

  5.   

    可以一句一句地转换,遇到函数名就百度一下--如果是库函数的话。Delphi写的代码有点儿像VB的,开头好像有个所有变量与函数名的声明表的。我也不懂Delphi,但是要维护代码只能跟着看。同一段代码你看10遍就算不懂也看明白了
      

  6.   

    // var这部分是变量声明
    // begin..end之间相当于{}
    // string,可以用char*
    // length()->strlen,strtoint->atoi(), copy->strcpy()
    // 字符串相加用strcat
    // repeat..until ->do{}while()// 一句一句翻吧,看了下,每句对应写成C的就行了。
      

  7.   

    网上大把的加密算法源代码,不过一般都是c的,很简单的,delphi转vc不是没人会,
    而是愿不愿意搭上时间帮你。
      

  8.   

    CString EncryptString(CString &Source, CString &Key)
    {
    int KeyPos=0;
    int iRange=256;
    int KeyLen=Key.GetLength();    if(KeyLen==0)  
    Key="delphi";
    srand(time(0)); 
       
    int Offset=rand() % iRange; char str[2];
    sprintf(str,"%1.2x",Offset);
    CString Dest(str);
    int SrcAsc;    int iLen=Source.GetLength(); char *pSrc=Source.GetBuffer(0);
    char *pKey=Key.GetBuffer(0); for(int SrcPos=0;SrcPos<iLen;SrcPos++)
    {
    SrcAsc=pSrc[SrcPos]; SrcAsc=(SrcAsc+Offset) % 255;
    if(KeyPos<KeyLen) KeyPos++;
    else KeyPos=1; SrcAsc=SrcAsc ^ pKey[KeyPos-1];
    sprintf(str,"%1.2x",SrcAsc);
    Dest+=str;
    Offset=SrcAsc;
    } Source.ReleaseBuffer();
    Key.ReleaseBuffer(); Dest.MakeUpper();
    return Dest;
    }CString UnEncryptString(CString &Source, CString &Key)
    {
    int KeyLen=Key.GetLength();
    if(KeyLen==0)
    Key="delphi";

    int KeyPos=0;

    CString Dest;
    int iLen=Source.GetLength();
    char *pSrc=Source.GetBuffer(0);
    char *pKey=Key.GetBuffer(0);
    char cOffset[3];
    memset(cOffset,1,3);
    memcpy(cOffset,pSrc,2);
    cOffset[2]='\0';
    int Offset=strtol(cOffset,NULL,16);

    int SrcAsc,TmpSrcAsc;
    int SrcPos=2;
    while(SrcPos<iLen)
    {
    memset(cOffset,1,3);
    memcpy(cOffset,pSrc+SrcPos,2);
    cOffset[2]='\0';
    SrcAsc=strtol(cOffset,NULL,16);
    if (KeyPos<KeyLen)
    KeyPos++;
    else
    KeyPos=1;

    TmpSrcAsc=SrcAsc ^ pKey[KeyPos-1];
    if (TmpSrcAsc<=Offset)
    TmpSrcAsc=255+TmpSrcAsc-Offset;
    else
    TmpSrcAsc-=Offset;

    Dest+=TmpSrcAsc;

    Offset=SrcAsc;

    SrcPos+=2;
    }

    Source.ReleaseBuffer();
    Key.ReleaseBuffer();

    return Dest;
    }