PHP AES 128 ECB密码和Delphi AES 128 ECB

时间:2014-06-20 14:53:57

标签: php delphi encryption cryptography

我加密" sifrelenecek" Delphi使用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 ==",我如何在PHP或对面的Delphi和Decrypt中加密?

在网上搜索并发现了很多功能,但没有任何这些功能结果与Delphi相同或http://aes.online-domain-tools.com/

提前致谢。

2 个答案:

答案 0 :(得分:5)

您正在混合两种不同形式的填充。这就是造成不匹配的原因。它不仅仅是Base64 / hex的区别。

您的明文是12个字节:" sifrelenecek",编码为:

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

如果您使用 ZEROES 填充明文,就像Delphi那样,并且记录为mcrypt_encrypt,那么您正在加密:

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

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

但是,如果您使用 PKCS#7 padding 填充明文,就像在上面的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 == - 正如您在问题中显示的那样。

两侧的垫子都是ZEROES,或两侧的垫子都是PKCS#7,你的结果应该匹配。

答案 1 :(得分:1)

我们可以看到您尝试比较使用十六进制清楚编码的一个。另一个用base64。

在php中

  • 让它消失(这是自动完成的)。
  • 不要做 base64_encode (你还没有在delphi中做过)。

php手册

描述:


  

string mcrypt_encrypt(string $ cipher,string $ key,   string $ data,string $ mode [,string $ iv])

     

加密数据并将其返回。

     

...

     

数据

     

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

     

返回的crypttext可能大于数据的大小   这是由数据提供的。

ECB模式忽略IV,因此使用MCRYPT_MODE_ECB和IV显示示例是错误的(手册中的示例显示相同的内容)。此外,了解ECB对随机数据有用也很重要,但结构化数据应使用更强大的模式,如MCRYPT_MODE_CBC

php Code

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中的加密Hex文本相同 FBE4A4405D6C1B54503D9B213E41AE56 == FBE4A4405D6C1B54503D9B213E41AE56