Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Rijndael进行不同的Delphi/PHP加密解密_Php_Delphi_Encryption_Cryptography_Rijndael - Fatal编程技术网

使用Rijndael进行不同的Delphi/PHP加密解密

使用Rijndael进行不同的Delphi/PHP加密解密,php,delphi,encryption,cryptography,rijndael,Php,Delphi,Encryption,Cryptography,Rijndael,我正在尝试使用Rijndael从php到Delphi再到Delphi对字符串进行加密/解密 如果我从Delphi解密一个PHP字符串。。。很好 如果我用Delphi加密一个字符串,结果字符串是ok的,但更短 对于测试,我使用了一个62个字符的字符串。使用delphi加密的字符串比PHP长4个字符 这些是弦。。。最后字符: PHP:Gylwj1anbjrme8mbsao5cvtrcbva== 德尔福:GYLWJ1ANBJRME8MBSO5CVTRCBV 谢谢你的建议 我使用以下源代码示例: PHP

我正在尝试使用Rijndael从php到Delphi再到Delphi对字符串进行加密/解密

如果我从Delphi解密一个PHP字符串。。。很好

如果我用Delphi加密一个字符串,结果字符串是ok的,但更短

对于测试,我使用了一个62个字符的字符串。使用delphi加密的字符串比PHP长4个字符

这些是弦。。。最后字符:

PHP:Gylwj1anbjrme8mbsao5cvtrcbva==

德尔福:GYLWJ1ANBJRME8MBSO5CVTRCBV

谢谢你的建议

我使用以下源代码示例:

PHP:

Delphi加密:

function EncryptData3(Data: string; AKey: AnsiString; AIv: AnsiString): string;
var
  cipher: TDCP_rijndael;
  key, iv, src, dest, b64: TBytes;
  index, slen, bsize, pad: integer;
begin
  //key := Base64DecodeBytes(TEncoding.UTF8.GetBytes(AKey));
  //iv := Base64DecodeBytes(TEncoding.UTF8.GetBytes(AIv));
  key := TEncoding.ASCII.GetBytes(AKey);
  iv := TEncoding.ASCII.GetBytes(AIv);

  src := TEncoding.ascii.GetBytes(Data);

  cipher := TDCP_rijndael.Create(nil);
  try
    cipher.CipherMode := cmCBC;
    // Add padding.
    // Resize the Value array to make it a multiple of the block length.
    // If it's already an exact multiple then add a full block of padding.
    slen := Length(src);
    bsize := (cipher.BlockSize div 8);
    pad := bsize - (slen mod bsize);
    Inc(slen, pad);
    SetLength(src, slen);

    for index := pad downto 1 do
    begin
      src[slen - index] := pad;
    end;

    SetLength(dest, slen);
    cipher.Init(key[0], 256, @iv[0]); // DCP uses key size in BITS not BYTES
    cipher.Encrypt(src[0], dest[0], slen);

    b64 := Base64EncodeBytes(dest);
    result := TEncoding.Default.GetString(b64);
  finally
    cipher.Free;
  end;
end;
德尔福解密。。。不起作用:

function DecryptData3(Data: string; AKey: AnsiString; AIv: AnsiString): string;
var
  key, iv, src, dest: TBytes;
  cipher: TDCP_rijndael;
  slen, pad: integer;
begin
  //key := Base64DecodeBytes(TEncoding.UTF8.GetBytes(AKey));
  //iv := Base64DecodeBytes(TEncoding.UTF8.GetBytes(AIv));
  key := TEncoding.ASCII.GetBytes(AKey);
  iv := TEncoding.ASCII.GetBytes(AIv);

  src := Base64DecodeBytes(TEncoding.UTF8.GetBytes(Data));

  cipher := TDCP_rijndael.Create(nil);
  try
    cipher.CipherMode := cmCBC;
    slen := Length(src);
    SetLength(dest, slen);
    cipher.Init(key[0], 256, @iv[0]); // DCP uses key size in BITS not BYTES
    cipher.Decrypt(src[0], dest[0], slen);
    // Remove the padding. Get the numerical value of the last byte and remove
    // that number of bytes
    pad := dest[slen - 1];
    SetLength(dest, slen - pad);

    // Base64 encode it
    result := TEncoding.Default.GetString(dest);
  finally
    cipher.Free;
  end;
end;

我不知道我是否用了正确的方法。。。但是,如果我将字节值转换为字符串,并在此链接中使用此Base64Encode:

现在我加密正确了。例如:

SetString(stringValue, PAnsiChar(@dest[0]), slen); 
result := Base64Encode2(stringValue);

如果你想阅读整个WWW中的所有问题/答案或博客文章,你可以花上几年的时间。在这里,这个问题几乎每周在德尔福角被问一次。我找到了这个问题的两个答案。。。但是它不能解决任何问题。Ken,链接的答案没有一个可接受的答案。。请澄清,
vA==
表示一个字节。两个加密文本之间有一个字节的差异。你显然很接近。我试着找出一个字节的差异是什么。Delphi程序员什么时候才能知道文本和二进制是不一样的。那个二进制文件不属于字符串。base64将二进制编码为文本。
SetString(stringValue, PAnsiChar(@dest[0]), slen); 
result := Base64Encode2(stringValue);