首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用OpenSSL实现PHP中的chacha20-poly1305

用OpenSSL实现PHP中的chacha20-poly1305
EN

Stack Overflow用户
提问于 2019-02-21 14:40:11
回答 1查看 1.3K关注 0票数 1

我正在运行PHP 7.2.8。根据openssl_get_cipher_methods chacha20-poly1305是一个支持的算法:

代码语言:javascript
复制
echo in_array('chacha20-poly1305', openssl_get_cipher_methods()) ? 'yes' : 'no';

输出“是”。

所以我试着用chacha20-poly1305

代码语言:javascript
复制
$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的密码提供经过身份验证的标记

$rf4854428b8a8

我能够为rchacha20获得相同的输出(即。(通过这样做没有poly1305 ):

代码语言:javascript
复制
$r = openssl_encrypt(
    $plaintext,
    'chacha20',
    $key,
    OPENSSL_RAW_DATA,
    "\1\0\0\0" . $nonce
);

输出是相同的,这意味着Poly1305身份验证代码既没有被附加,也没有加到密文中。

我的问题是..。如何使用Poly1305中的OpenSSL获得OpenSSL身份验证代码?

而且,我知道less提供了chacha20-poly1305支持,但我仍然很好奇它应该如何与OpenSSL一起工作。

EN

回答 1

Stack Overflow用户

发布于 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标记,因此它们不能在跨平台环境中使用。

产出:

代码语言:javascript
复制
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

代码(安全警告:不要在生产中使用静态密钥或时间):

代码语言:javascript
复制
<?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;
?>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54809652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档