PHP AES 128 ECB密码和Delphi AES 128 ECB

She*_*man 0 php delphi encryption cryptography

我用Delphi使用AES 128 ECB加密"sifrelenecek"字符串使用密钥"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")
Run Code Online (Sandbox Code Playgroud)

但是php给我的结果为"+ wL2yf + 72thixicjw0duQA ==",我如何在PHP或对等的Delphi和Decrypt中加密?

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

提前致谢.

Jim*_*ood 5

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

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

[115, 105, 102, 114, 101, 108, 101, 110, 101, 99, 101, 107]
Run Code Online (Sandbox Code Playgroud)

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

[115, 105, 102, 114, 101, 108, 101, 110, 101, 99, 101, 107, 0, 0, 0, 0]
Run Code Online (Sandbox Code Playgroud)

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

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

$pad = $block - (strlen($str) % $block);
$str .= str_repeat(chr($pad), $pad);
Run Code Online (Sandbox Code Playgroud)

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

[115, 105, 102, 114, 101, 108, 101, 110, 101, 99, 101, 107, 4, 4, 4, 4]
Run Code Online (Sandbox Code Playgroud)

得到的密文是+ wL2yf + 72thixicjw0duQA == - 正如您在上面的问题中所显示的那样.

两边都用ZEROES填充,或者两边用PKCS#7填充,你的结果应该匹配.