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

PHPAES 128 ECB密码和Delphi AES 128 ECB

归翔
2023-03-14

我用Delphi加密“sifrelenecek”字符串,使用AES 128 ECB,使用密钥为“KRPTTT101103”,它给了我“FBE4A4405D6C1B54503D9B213E41AE56”,我正在检查http://aes.online-domain-tools.com/,它是正确的。我试图使用此功能创建相同的PHP加密;

function sifrele($str, $key){
 $block = mcrypt_get_block_size('rijndael_128', 'ecb');
 $pad = $block - (strlen($str) % $block);
 $str .= str_repeat(chr($pad), $pad);
 return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB)); }

print sifrele("sifrelenecek","KRPTTT101103")

但是php给我的结果是“wL2yf 72thixicjw0duQA==”,如何在Delphi中加密,在php或opposit中解密?

在网上搜索并找到了很多函数,但这些函数中的任何一个都与德尔福或 http://aes.online-domain-tools.com/ 相同

提前感谢。

共有2个答案

干京
2023-03-14

正如我们所看到的,您尝试比较使用十六进制清晰编码的一个。另一个用Bas64。

在php中

  • 让填充物消失(这是自动完成的)。
  • 不要做base64_encode(你在德尔福也没有做过)。

php手册

描述:

字符串mcrypt_encrypt (字符串 $cipher , 字符串 $key , 字符串 $data , 字符串 $mode [, 字符串 $iv ] )

加密数据并返回它。

……

数据

将使用给定密码和模式加密的数据。如果数据的大小不是n*blocksize,则数据将填充“\0”。

返回的crypttext可以大于数据给定的数据大小。

ECB模式忽略了IV,因此显示同时使用MCRYPT_MODE_ECB和IV的示例是误导性的(手册中的示例显示了同样的事情)。此外,重要的是要知道ECB对随机数据很有用,但是结构化数据应该使用更强的模式,比如MCRYPT_MODE_CBC

php代码

function encrypt($input) {
    // $iv = mcrypt_create_iv(32);
    $mcr = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, "KRPTTT101103",
                          $input, MCRYPT_MODE_ECB);
    $hex2 = bin2hex($mcr); // Convert binary data into hexadecimal representation
    return strtoupper($hex2);
    // base64_encode($mcr);
    }

$encryptedhextext = encrypt("sifrelenecek");

 if ($encryptedhextext == "FBE4A4405D6C1B54503D9B213E41AE56" ) {
   echo   "Encrypted Hex text in Delphi and php are equal<br />";    
   echo $encryptedhextext." == FBE4A4405D6C1B54503D9B213E41AE56";
 }

输出

Delphi和php中加密的十六进制文本相等< br > fbe4a 4405d 6 C1 b 54503 d9 b 213 e 41 AE 56 = = fbe4a 4405d 6 C1 b 54503 d9 b 213 e 41 AE 56

太叔灿
2023-03-14

你正在混合两种不同形式的填充。这就是导致不匹配的原因。这不仅仅是Base64/十六进制的差异。

你的明文是12字节:“sifrelenecek”,编码为:

[115, 105, 102, 114, 101, 108, 101, 110, 101, 99, 101, 107]

如果您用零填充明文,就像Delphi所做的那样,并且mcrypt_encrypt被记录为这样,那么您正在加密:

[115, 105, 102, 114, 101, 108, 101, 110, 101, 99, 101, 107, 0, 0, 0, 0]

生成的密文是Base64中的SkQF1sG1RQPZshPkGuVg==,当解码为纯字节并以十六进制重新编码时,变成“FBE4A4405D6C1B54503D9B213E41AE56” - 正是在线工具返回的内容。

但是,如果您使用 PKCS#7 填充填充明文,就像您在上面的 PHP 代码中所做的那样:

$pad = $block - (strlen($str) % $block);
$str .= str_repeat(chr($pad), $pad);

然后这个明文用 FOURS 填充,你正在加密:

[115, 105, 102, 114, 101, 108, 101, 110, 101, 99, 101, 107, 4, 4, 4, 4]

得到的密文是wL2yf 72thixicjw0duQA== -就像你在上面的问题中显示的那样。

要么在两边垫上零,要么在两边都垫上PKCS#7,结果应该匹配。

 类似资料:
  • 问题内容: 我想用Java加密和解密密码,然后以加密形式存储到数据库中。如果它是开源的,那就太好了。有什么建议/建议吗? 问题答案: 编辑 :这个答案是旧的。现在 不建议 使用MD5,因为它很容易被破坏。 我想象中的MD5必须足够好?您可以使用MessageDigest实现它。 这里还列出了其他算法。 如果确实需要,这是它的第三方版本: Fast MD5

  • 尽管我有点困惑,我是否应该将salt输入到我的PBKDF2函数中,并将salt存储在一列中,而将PBKDF2的密码存储在另一列中。 我也在使用CodeIgniter,并找到了一个用于PBKDF2的库(https://github.com/hashemqolami/codeigniter-pbkdf2-library),它声称我不需要单独存储salt。 使用作为推荐的用户密码注册用户;无需单独存储用

  • 我用哈希法通过了一个密码 这将密码作为哈希值存储到数据库中。但是当我试图通过 无论密码是否正确,它都会告诉我密码是正确的。有没有办法解决这个问题,所以我可以散列密码,但登录时输入(非散列)密码。

  • 我有一个文本文件,我已经加密使用移位,但我需要加密加密的文本再次,但这一次使用vigenere密码。然后我需要解密加密的文本(首先是vigenere,然后是Shift),但所有的大小写字母以及黑色空格、引号、逗号和句号都需要保持不变。我已经完成了移位、加密和解密,剩下的就是Vigenere了。下面显示的是我加密Vigenere的类,我还没有写解密,因为我被卡在加密步骤。谢谢你。

  • 问题内容: 我最近一直在试验Docker,以构建一些可玩的服务,而一直困扰我的一件事是将密码放入Dockerfile。我是一名开发人员,因此将密码存储在源代码中感觉像是一拳。这是否值得关注?关于如何在Dockerfiles中处理密码是否有良好的约定? 问题答案: 绝对是一个问题。Dockerfile通常签入存储库并与其他人共享。一种替代方法是在运行时提供任何凭据(用户名,密码,令牌,任何敏感内容)

  • 本文向大家介绍分组密码和流密码之间的区别,包括了分组密码和流密码之间的区别的使用技巧和注意事项,需要的朋友参考一下 分组和流密码都是加密方法,主要用于将纯文本直接转换为密文,并且属于对称键密码家族。 以下是块密码和流密码之间的重要区别。 序号 键 分组密码 流密码 1 定义 块密码是一种加密类型,通过一次获取其块来执行纯文本转换。 另一方面,“流密码”是一种加密类型,其中,通过一次获取一个字节的纯

  • 如果用户创建了一个新密码,并通过哈希算法存储在数据库中,则在用户登录时可以将其与用户输入的密码进行匹配。输入到登录屏幕的密码将被哈希化,然后检查它是否与存储的哈希匹配。如果是,则允许用户访问。 然而,如今,密码是经过哈希和盐处理的。因此,当用户第一次注册密码时,它会经过一个散列,然后会被加密10000次以上。这个salt与后端代码生成的关键字相同,还是每次salt都随机生成? 当用户输入密码登录时

  • 本文向大家介绍经典密码学和量子密码学的区别,包括了经典密码学和量子密码学的区别的使用技巧和注意事项,需要的朋友参考一下 众所周知,密码学包括两个过程,分别是在发送方和接收方执行的加密和解密。基本上,密码学是在公共环境中实践或实现的,用于在发送方和接收方之间进行安全的通信,使得除这两方外,其他任何人都无法获得或理解所传递的消息。 根据消息的加密和解密类型,我们可以区分经典加密和量子加密,如下所示: