我正在运行PHP 7.2.8。根据openssl_get_cipher_methods chacha20-poly1305是一个支持的算法:
echo in_array('chacha20-poly1305', openssl_get_cipher_methods()) ? 'yes' : 'no';输出“是”。
所以我试着用chacha20-poly1305
$plaintext = 'zzzzzz';
$key = str_repeat('k', 32);
$nonce = str_repeat('n', 12);
$aad = '';
$r = openssl_encrypt(
$plaintext,
'chacha20-poly1305',
$key,
OPENSSL_RAW_DATA,
$nonce,
$newtag,
$aad
);
echo bin2hex($r);输出PHP警告:
警告: openssl_encrypt():不能为不支持AEAD的密码提供经过身份验证的标记
$r为f4854428b8a8。
我能够为r和chacha20获得相同的输出(即。(通过这样做没有poly1305 ):
$r = openssl_encrypt(
$plaintext,
'chacha20',
$key,
OPENSSL_RAW_DATA,
"\1\0\0\0" . $nonce
);输出是相同的,这意味着Poly1305身份验证代码既没有被附加,也没有加到密文中。
我的问题是..。如何使用Poly1305中的OpenSSL获得OpenSSL身份验证代码?
而且,我知道less提供了chacha20-poly1305支持,但我仍然很好奇它应该如何与OpenSSL一起工作。
发布于 2020-11-21 12:04:14
OpenSSL的问题仍未解决(2020年11月),因此,如果您需要使用Cha20-Poly1305认证的PHPCha20-Poly1305加密,我推荐Leigh (https://github.com/lt/PHP-AEAD-ChaCha20-Poly1305)库,它可以非常容易地实现。
将auth标记($tag)附加到密文中,需要在开始解密之前进行分离。
在我用OpenJDK 11 (Java)测试相同的功能时,请注意:这两个函数生成相同的密文,但不同的auth标记,因此它们不能在跨平台环境中使用。
产出:
ChaCha20-Poly1305 encryption with leigh/aead-chacha20-poly1305
tag (16 bytes long, Base64): FK11WpqxhDuJytSgHN86tQ==
ciphertext (Base64): 1rXNtbeGF9KsMZXgPjszIeJ0Ze5ua+Uh5Aexu1ngaH4XoeldG71DwuDEAA==
decrypt: The quick brown fox jumps over the lazy dog代码(安全警告:不要在生产中使用静态密钥或时间):
<?php
# make sure that you used Composer to get "leigh/aead-chacha20-poly1305"
require __DIR__ . '/vendor/autoload.php';
// ### never use static key & nonce in production, this is for testing only ###
$key = '12345678901234567890123456789012'; // 32 bytes
$nonce = '123456789012'; // 12 bytes
$plaintext = 'The quick brown fox jumps over the lazy dog';
$aad = '';
echo 'ChaCha20-Poly1305 encryption with leigh/aead-chacha20-poly1305' . PHP_EOL;
list($ciphertext, $tag) = \ChaCha20Poly1305\encrypt($key, $nonce, $aad, $plaintext);
echo 'tag (16 bytes long, Base64): ' . base64_encode($tag) . PHP_EOL;
echo 'ciphertext (Base64): ' . base64_encode($ciphertext) . PHP_EOL;
$decrypt = \ChaCha20Poly1305\decrypt($key, $nonce, $aad, $ciphertext, $tag);
echo 'decrypt: ' . $decrypt . PHP_EOL;
?>https://stackoverflow.com/questions/54809652
复制相似问题