我需要一个PHP函数,AES256_encode($dataToEcrypt)将$data加密为AES-256,另一个AES256_decode($encryptedData)则相反。有谁知道这个函数应该有什么代码?
AES256_encode($dataToEcrypt)
$data
AES256_decode($encryptedData)
aor9mmx11#
查看mcrypt moduleAES-Rijndael示例摘自here
$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";
$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";
字符串这就是decrypt function
nhaq1z212#
我需要一个PHP函数,AES256_encode($dataToEcrypt)将$data加密为AES-256,另一个AES256_decode($encryptedData)则相反。有谁知道这个函数应该有什么代码?有一个difference between encrypting and encoding。你真的需要AES-256吗?AES-256与AES-128的安全性没有那么重要;你更有可能在协议层搞砸而不是被黑客攻击,因为你使用了128位的分组密码而不是256位的分组密码。
x1c 0d1x的数据
如果您对构建自己的感兴趣,不是为了在生产环境中部署它,而是为了您自己的学习,我提供了一个示例AES 256
/** * This is a quick and dirty proof of concept for StackOverflow. * * @ref http://stackoverflow.com/q/6770370/2224584 * * 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 ); }}
/**
* This is a quick and dirty proof of concept for StackOverflow.
*
* @ref http://stackoverflow.com/q/6770370/2224584
* 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
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,
字符串
首先,生成两个密钥(是的,其中两个)并以某种方式存储它们。
$eKey = random_bytes(32);$aKey = random_bytes(32);
$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);
$plaintext = 'This is just a test message.';
$encrypted = ExperimentalAES256DoNotActuallyUse::encrypt($plaintext, $eKey, $aKey);
$decrypted = ExperimentalAES256DoNotActuallyUse::decrypt($encrypted, $eKey, $aKey);
型如果你没有random_bytes(),就用random_compat。
random_bytes()
n3schb8v3#
MCRYPT_RIJNDAEL_256不等同于AES_256。
从AES中解密RIJNDAEL的方法是使用MCRYPT_RIJNDAEL_128,并在加密之前添加要加密的字符串AES-256具有BlockSize= 128 bit和KeySize= 256 bit Rijndael-256具有BlockSize= 256 bit和KeySize= 256 bit只有AES/Rijndael 128 bit是相同的。Rijndael-192和Rijndael-256与AES-192和AES-256不同(块大小和轮数不同)。
kkih6yb84#
您可以在PHP中使用password_hash函数加密和解密数据。你还需要一个成本函数。确保在PHP环境中启用了OpenSSL和Mcrypt扩展。
password_hash
<?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";?>
<?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
$password
$method
$key
$iv
$encrypted
$decrypted
来源:Secure AES-256 Encryption and Decryption in PHP
rkttyhzu5#
$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;}
$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;
5条答案
按热度按时间aor9mmx11#
查看mcrypt module
AES-Rijndael示例摘自here
字符串
这就是decrypt function
nhaq1z212#
我需要一个PHP函数,
AES256_encode($dataToEcrypt)
将$data
加密为AES-256,另一个AES256_decode($encryptedData)
则相反。有谁知道这个函数应该有什么代码?有一个difference between encrypting and encoding。
你真的需要AES-256吗?AES-256与AES-128的安全性没有那么重要;你更有可能在协议层搞砸而不是被黑客攻击,因为你使用了128位的分组密码而不是256位的分组密码。
重要提示-使用库
x1c 0d1x的数据
一个快速而肮脏的AES-256实现
如果您对构建自己的感兴趣,不是为了在生产环境中部署它,而是为了您自己的学习,我提供了一个示例AES 256
字符串
用法
首先,生成两个密钥(是的,其中两个)并以某种方式存储它们。
型
然后要加密/解密消息:
型
如果你没有
random_bytes()
,就用random_compat。n3schb8v3#
MCRYPT_RIJNDAEL_256不等同于AES_256。
从AES中解密RIJNDAEL的方法是使用MCRYPT_RIJNDAEL_128,并在加密之前添加要加密的字符串
AES-256具有BlockSize= 128 bit和KeySize= 256 bit Rijndael-256具有BlockSize= 256 bit和KeySize= 256 bit
只有AES/Rijndael 128 bit是相同的。Rijndael-192和Rijndael-256与AES-192和AES-256不同(块大小和轮数不同)。
kkih6yb84#
您可以在PHP中使用
password_hash
函数加密和解密数据。你还需要一个成本函数。确保在PHP环境中启用了OpenSSL和Mcrypt扩展。字符串
$plaintext
:这个变量保存我们想要加密的消息。在该示例中,“我的秘密消息1234”是明文。$password
:在这里,我们定义用于导出加密密钥的密码。$method
:我们将加密方法设置为“aes-256-CBC”,这是密码块链接(CBC)模式中的AES-256加密模式。$key
:代码使用提供的密码生成加密密钥,使用password_hash()函数和PASSWORD_BCRYPT算法,成本因子为12。$iv
:CBC模式下的AES-256需要初始化向量(IV),并且必须正好是16字节长(128位)。$encrypted
:使用openssl_encrypt()函数获取加密密文,该函数接受明文、加密方法、加密密钥、IV等参数。然后对密文进行Base64编码以便于表示。$decrypted
:为了确保解密过程正常,我们使用openssl_decrypt()函数来反转加密过程。这将在解码Base64表示后返回原始明文。来源:Secure AES-256 Encryption and Decryption in PHP
rkttyhzu5#
字符串