我加密" 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/
提前致谢。
答案 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中
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