我需要一个PHP函数,AES256_encode($dataToEcrypt)
将$data
加密成AES-256,并且另一个函数 AES256_decode($encryptedData)
则相反地解密。有人知道这些函数应该包含什么代码吗?
我需要一个PHP函数,AES256_encode($dataToEcrypt)
将$data
加密成AES-256,并且另一个函数 AES256_decode($encryptedData)
则相反地解密。有人知道这些函数应该包含什么代码吗?
请查看mcrypt模块
以下是从此处获取的AES-Rijndael示例
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);
$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");
# show key size use either 16, 24 or 32 byte keys for AES-128, 192
# and 256 respectively
$key_size = strlen($key);
echo "Key size: " . $key_size . "\n";
$text = "Meet me at 11 o'clock behind the monument.";
echo strlen($text) . "\n";
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv);
echo strlen($crypttext) . "\n";
这是解密函数
RIJNDAEL-256
是不同的。AES
中的 256 指的是密钥大小,而 RIJNDAEL
中的 256 指块大小。当使用 256 位密钥时,AES-256
等同于 RIJNDAEL-128
。 - ircmaxellmcrypt
库,它将在PHP 7.1版本之后被移除。因此,建议不要使用mcrypt,否则这个答案也会被弃用。请参阅http://php.net/manual/en/migration71.deprecated.php。 - Dennis我需要一个PHP函数,
AES256_encode($dataToEcrypt)
用于将$data
加密成AES-256,另外一个函数AES256_decode($encryptedData)
则实现相反的功能。是否有人知道这些函数应该是什么代码?
加密和编码之间有区别。
你真的需要AES-256吗?与AES-128相比,AES-256的安全性并不显著;您更可能在协议层面出错,而不是因为使用了128位块密码而被黑客攻击了。
如果您有兴趣构建自己的实现但不是为了在生产中部署,而是仅仅为了自己的教育,我包含了一个样本AES256
/**
* This is a quick and dirty proof of concept for StackOverflow.
*
* @ref https://dev59.com/J2w15IYBdhLWcg3wMY6L
*
* Do not use this in production.
*/
abstract class ExperimentalAES256DoNotActuallyUse
{
/**
* Encrypt with AES-256-CTR + HMAC-SHA-512
*
* @param string $plaintext Your message
* @param string $encryptionKey Key for encryption
* @param string $macKey Key for calculating the MAC
* @return string
*/
public static function encrypt($plaintext, $encryptionKey, $macKey)
{
$nonce = random_bytes(16);
$ciphertext = openssl_encrypt(
$plaintext,
'aes-256-ctr',
$encryptionKey,
OPENSSL_RAW_DATA,
$nonce
);
$mac = hash_hmac('sha512', $nonce.$ciphertext, $macKey, true);
return base64_encode($mac.$nonce.$ciphertext);
}
/**
* Verify HMAC-SHA-512 then decrypt AES-256-CTR
*
* @param string $message Encrypted message
* @param string $encryptionKey Key for encryption
* @param string $macKey Key for calculating the MAC
*/
public static function decrypt($message, $encryptionKey, $macKey)
{
$decoded = base64_decode($message);
$mac = mb_substr($message, 0, 64, '8bit');
$nonce = mb_substr($message, 64, 16, '8bit');
$ciphertext = mb_substr($message, 80, null, '8bit');
$calc = hash_hmac('sha512', $nonce.$ciphertext, $macKey, true);
if (!hash_equals($calc, $mac)) {
throw new Exception('Invalid MAC');
}
return openssl_decrypt(
$ciphertext,
'aes-256-ctr',
$encryptionKey,
OPENSSL_RAW_DATA,
$nonce
);
}
}
首先,生成两个密钥(是的,两个密钥),然后以某种方式存储它们。
$eKey = random_bytes(32);
$aKey = random_bytes(32);
然后进行加密/解密消息:
$plaintext = 'This is just a test message.';
$encrypted = ExperimentalAES256DoNotActuallyUse::encrypt($plaintext, $eKey, $aKey);
$decrypted = ExperimentalAES256DoNotActuallyUse::decrypt($encrypted, $eKey, $aKey);
如果您没有random_bytes()
,请获取random_compat。
v3.2.0
可用。 - DennisMCRYPT_RIJNDAEL_256不等同于AES_256。
将RIJNDAEL解密为AES的方法是使用MCRYPT_RIJNDAEL_128并在加密之前填充要加密的字符串。
AES-256的BlockSize为128位,KeySize为256位。 Rijndael-256的BlockSize为256位,KeySize为256位。
只有AES/Rijndael 128位是相同的。 Rijndael-192和Rijndael-256与AES-192和AES-256不相同(块大小和轮数不同)。
password_hash
函数对数据进行加密和解密。您还需要一个成本函数。请确保您的PHP环境启用了OpenSSL和Mcrypt扩展。<?php
$plaintext = 'My secret message 1234';
$password = '3sc3RLrpd17';
$method = 'aes-256-cbc';
$key = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
// IV must be exact 16 chars (128 bit)
$iv = random_bytes(16);
$encrypted = base64_encode(openssl_encrypt($plaintext, $method, $key, OPENSSL_RAW_DATA, $iv));
$decrypted = openssl_decrypt(base64_decode($encrypted), $method, $key, OPENSSL_RAW_DATA, $iv);
echo 'plaintext=' . $plaintext . "\n";
echo 'cipher=' . $method . "\n";
echo 'encrypted to: ' . $encrypted . "\n";
echo 'decrypted to: ' . $decrypted . "\n\n";
?>
$plaintext
: 这个变量保存我们想要加密的消息。在这个例子中,“My secret message 1234”是明文。$password
: 在这里,我们定义用于生成加密密钥的密码。$method
: 我们将加密方法设置为“aes-256-CBC”,这是使用Cipher Block Chaining (CBC)模式的AES-256加密模式。$key
: 该代码使用提供的密码使用password_hash()函数生成加密密钥,使用PASSWORD_BCRYPT算法和成本因素12。$iv
: 初始化向量(IV)对于AES-256在CBC模式下是必需的,并且必须正好16字节长(128位)。$encrypted
: 使用openssl_encrypt()函数获取加密后的密文,该函数接受明文、加密方法、加密密钥、IV和其他参数。然后对密文进行Base64编码以便表示。$decrypted
: 为了确保解密过程正常工作,我们使用openssl_decrypt()函数来反转加密过程。这将在解码Base64表示后返回原始明文。$key = '324325923495kdfgiert734t'; // key used for decryption in jasper code
$text = 'string_to_be_encrypted';
$encrypted = fnEncrypt($text, $key);
function fnEncrypt( $plaintext, $key )
{
$plaintext = pkcs5_pad($plaintext, 16);
return bin2hex(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, hex2bin($key), $plaintext, MCRYPT_MODE_ECB));
}
function pkcs5_pad ($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
function hex2bin($hexdata)
{
$bindata = "";
for ($i = 0; $i < strlen($hexdata); $i += 2)
{
$bindata .= chr(hexdec(substr($hexdata, $i, 2)));
}
return $bindata;
}