用于mcrypt_加密的32字符PHP AES密钥

用于mcrypt_加密的32字符PHP AES密钥,php,encryption,aes,rijndael,symmetric-key,Php,Encryption,Aes,Rijndael,Symmetric Key,考虑以下PHP代码: <?php $key = "1234567812345678"; $iv = "1234567812345678"; $data = "Test string"; $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_

考虑以下PHP代码:

<?php
$key = "1234567812345678";
$iv = "1234567812345678";
$data = "Test string";

$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128,
                            $key,
                            $data,
                            MCRYPT_MODE_CBC,
                            $iv);

print "Encoded1: " . base64_encode($encrypted) . "\n";

$key = "12345678123456781234567812345678";

$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128,
                            $key,
                            $data,
                            MCRYPT_MODE_CBC,
                            $iv);

print "Encoded2: " . base64_encode($encrypted) . "\n";
请注意,我从

现在,问题是:

在第一种情况下,传入的密钥是16个字符的字符串。如果每个单独的字符都被解释为8位的数量,则会得到预期的128位密钥大小。事实上,我上面提到的StackOverflow页面上的Java代码就是这样做的,并获得与PHP相同的结果

在上面对
mcrypt\u encrypt
的第二次调用中,我将密钥的长度增加了一倍
mcrypt_encrypt
愉快地接受了这一点,但生成的加密输出与第一种情况不同。因此,很明显,它认为这是一个不同的密钥——例如,它不会只接受前128位并丢弃任何过去的

那么,
mcrypt\u encrypt
如何处理输入密钥字符串以得到
mcrypt\u RIJNDAEL\u 128
算法所需的128位密钥呢


如果有什么不同的话,我特别感兴趣的是当传入一个32个字符的字符串时,就像我的第二个示例一样-我必须创建一个匹配的解密例程(在Java中),所以我需要弄清楚在这种情况下密钥实际上是如何生成的。我引用的页面有非常好的Java代码(适用于我所有的测试用例)-我只是缺少正确的密钥字节集。

Rijndael算法有两个重要参数。有密钥大小(128位、192位和256位),然后是块大小(128位、192位和256位)。
MCRYPT_RIJNDAEL_128
中的
128
表示块大小。密钥大小是可变的

当您将不同长度的关键帧传递到MCrypt时,它将自动选择适当的关键帧大小,因此您不需要也无法设置它
MCRYPT_RIJNDAEL_128
是AES(AES-128、AES-192、AES-256)
MCRYPT_RIJNDAEL_192
MCRYPT_RIJNDAEL_256
不再是AES

如果Java代码生成了128位密钥的匹配结果,那么它也将生成256位密钥的匹配结果

MCrypt有点奇怪。在PHP版本5.6.0之前,它需要任意密钥长度,而不仅仅是128位、192位或256位。密钥将由0x00字节填充,直到下一个有效密钥长度



由于Java不支持开箱即用的零填充,因此应该使用适当的填充方案,如PHP中的PKCS#5/PKCS#7填充。它有一个很好的实现。

灯泡时刻!我假设MCRYPT_RIJNDAEL_128=AES-128、MCRYPT_RIJNDAEL_192=AES-192和MCRYPT_RIJNDAEL_256=AES-256(即数字后缀指定密钥大小)。正如您所建议的,只要我正确地处理了密钥,Java解决方案就可以完美地工作。我正在使用PHP5.5,这对我没有任何帮助,因此在我处理(有时是随机的)键大小时没有出现任何错误。非常感谢你!
Encoded1: iz1qFlQJfs6Ycp+gcc2z4w==
Encoded2: n3D26h/m8CSH0CE+z6okkw==