当前位置: 首页 > 知识库问答 >
问题:

Delphi DEC Twofish PHP中的加密和服务器端解密

容飞掣
2023-03-14

我必须用Twofish/CBC算法在Delphi中加密字符串,将其发送到服务器并在那里解密。我已经测试了下面的代码,B64编码/解码过程有效,但是我被困在密码加密/解密上。

我正在使用DEC 5.2用于德尔福。

以下是进行加密的德尔菲代码:

class function TEncryption.EncryptStream(const AInStream: TStream; const AOutStream: TStream; const APassword: String): Boolean;
var
  ASalt: Binary;
  AData: Binary;
  APass: Binary;
begin
  with ValidCipher(TCipher_Twofish).Create, Context do
  try
    ASalt := RandomBinary(16);
    APass := ValidHash(THash_SHA1).KDFx(Binary(APassword), ASalt, KeySize);
    Mode := cmCBCx;
    Init(APass);

    EncodeStream(AInStream, AOutStream, AInStream.Size);
    result := TRUE;
  finally
    Free;
    ProtectBinary(ASalt);
    ProtectBinary(AData);
    ProtectBinary(APass);
  end;
end;

class function TEncryption.EncryptString(const AString, APassword: String): String;
var
  instream, outstream: TStringStream;
begin
  result := '';
  instream := TStringStream.Create(AString);
  try
    outstream := TStringStream.Create;
    try
      if EncryptStream(instream, outstream, APassword) then
        result := outstream.DataString;
    finally
      outstream.Free;
    end;
  finally
    instream.Free;
  end;
end;

和应该解密发送数据的PHP函数:

function decrypt($input, $key) {
    $td = mcrypt_module_open('twofish', '', 'cbc', '');
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td, $key, $iv);

    $decrypted_data = mdecrypt_generic($td, base64_decode_urlsafe($input));

    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);

    return $decrypted_data;
}

我相信我必须对salt和初始化向量做更多的改动,但是我不知道怎么做。据我所知,KDFx()函数使SHA1从用户密码和salt中散列出密码,但是我在这一点上非常困难。

共有1个答案

沈俊美
2023-03-14

KDFx是一种专有的不兼容密钥派生方法,来源于:“类函数TDECHash.KDFx//DEC自己的KDF,甚至更强”。您可能会遇到使用DEC和PHP的问题,应该使用其他库。这个问题在例如http://www.delphipraxis.net/171047-dec-5-2-mit-vector-deccipher-umbau-von-dot-net-auf-delphi.html

 类似资料:
  • 我正在尝试使用在我的设备上生成的RSA密钥解密我的android应用程序中的字符串。加密由php服务完成,使用我的应用程序提供的公共rsa密钥。我的问题是解密,解密失败了。 我正在做以下工作: 在用base64.encode(pubkey.getencoded())和私钥进行“base64”编码后,这两个密钥(公共和私有)都保存到文件中。->好 当我调用我的webservice时,我在post变量

  • 我正在尝试像这样在客户端加密一个字符串 我试着在服务器端像这样解密。我正在使用jersey公开一个web服务。 AysmetricKeyCryptography类如下所示 当我在AsymetricKeyCryptograph类中运行main方法时,我得到了一个正确的结果,但是当我通过发送加密字符串调用Web服务时,它会抛出一个异常: 我不明白我哪里出错了

  • 服务器端加密是FDS在将您的数据写入数据中心的磁盘时会在对象级别上加密这些数据,并在您访问这些数据时为您解密这些数据。FDS加密使用AES-256来加密您的数据。 应用场景 适合对于数据存储有高安全性或者合规性要求的应用场景。 使用方式 在控制台开启bucket的加密存储 开启加密后,会对新上传的Object使用AES-256进行加密。若要对存量数据加密,请使用 存量数据加密工具 被加密的Obje

  • 问题内容: 我有以下基于cryptojs的javascript加密/解密函数,它们运行良好。 在使用cryptpjs加密消息时,我使用随机盐,随机iv值和特定密码。在解密加密的消息时,我重复使用了相同的salt,iv和密码来生成密钥。 这部分效果很好.. 但是,当我尝试在Java服务器端解密相同的加密文本时,问题就开始了。我希望通过我的java服务器代码解密加密后的消息。这是我编写的Java代码:

  • 我已经在Elastic Beanstalk上设置了一个工作解析服务器。我添加了一个AWS ElasticCache Redis服务器用于缓存,但我无法在使用密码时使连接工作,只有在没有密码的情况下。在我的解析服务器索引中。js文件,我在其中创建与Redis连接的新解析服务器,如下所示: 其中我的URL看起来像REDIS\u URL=clustercfg。xxxx年。xxxx年。use1.cache

  • 我正在使用AES加密下面的员工类,并将其保存为sealedObject作为serviceA的一部分。 在serviceB中,当我尝试将sealedObject解密回员工类时。 它抛出ClassNotFoundException,表示org。公司服务A。模型未找到员工。 显然,它试图通过完全限定的名称找到ServiceA的employee类,即使我在serviceB中创建了类似的类。 当加密和解密都