为了账号安全,请及时绑定邮箱和手机立即绑定

在 Python 中使用 Halite/Libsodium 解密在 PHP 中加密的字符串

在 Python 中使用 Halite/Libsodium 解密在 PHP 中加密的字符串

PHP
慕田峪7331174 2021-12-24 09:31:52
我使用这个 PHP 代码来加密一个字符串:use ParagonIE\Halite\KeyFactory;use ParagonIE\Halite\Symmetric\Crypto as Symmetric;use ParagonIE\HiddenString\HiddenString;define("SECURE_PLACE", '/home/htdocs/secure_place/encryption.key');/*//already generated$enc_key = KeyFactory::generateEncryptionKey();KeyFactory::save($enc_key, $secure_place);*/$enc_key = KeyFactory::loadEncryptionKey(SECURE_PLACE);$string = "String to be encrypted";$cipherstring = \ParagonIE\Halite\Symmetric\Crypto::encrypt(  new HiddenString(   $string  ),    $enc_key );我可以用 PHP 解密它:$string = \ParagonIE\Halite\Symmetric\Crypto::decrypt(    $cipherstring,    $enc_key);但我需要在 Python3 中完成此操作,因为我将 POST 将加密字符串发送到 AWS lambda handler.py 函数。我知道Halite是一个 PHP 库,但我也明白它是 Libsodium 的包装器,它是“可移植、可交叉编译、可安装、可打包的 NaCl 分支,具有兼容的 API 和扩展的 API 以进一步提高可用性.”有谁知道我应该在 Python3 中使用哪个依赖项(如果可能,提供代码)来解密字符串?我想我需要设置enc_key为 Lambda 环境变量。
查看完整描述

1 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

更容易的跨语言秘密

虽然可以尝试找出如何在 Python 中重新创建 Halite 的加密,但我建议在下面移动一层抽象并直接使用 libsodium 的高级加密 API。


用于加密数据的 PHP 代码变为:


$nonce = \Sodium\randombytes_buf(\Sodium\CRYPTO_SECRETBOX_NONCEBYTES);

$string = "String to be encrypted";


$cipherstring = sodium_crypto_secretbox(

    $string, $nonce, $enc_key->getRawKeyMaterial());


$encoder = Halite::chooseEncoder(Halite::ENCODE_BASE64URLSAFE);

$cipherstring = $encoder($cipherstring);

$nonce = $encoder($nonce);

现在你只需要将 nonce 和 cipherstring 获取到 Python 中,如果你想继续使用 base64 并使用pynacl包,代码如下所示:


import nacl.secret

import nacl.encoding


decoder = nacl.encoding.URLSafeBase64Encoder


box = nacl.secret.SecretBox(

    # Key goes here, doesn't necessarily have to be base64-encoded

    "EtUEpKO2q2clEO5HRL0mk-DtQyHIt7Wf_6t1dSacrFI=", decoder

)


nonce = decoder.decode("Maxm2hN-0C4zqE3viwFVJO03I8eWJcm2")

ciphertext = decoder.decode("TpXjfPonHzBQnObD9JPtPhQc-wKIIq8Y-4o_Um3UtVut-ixCDp4=")


print(box.decrypt(ciphertext, nonce))

基本原理

我这么说的原因是因为如果你深入研究 Halite 的加密代码,他们基本上已经手动重新实现了许多 secretbox 的功能。似乎 Halite 真的只设计用于 PHP。通过直接使用 libsodium,您可以避免 Halite 更改其协议和破坏您的代码的可能性。


查看完整回答
反对 回复 2021-12-24
  • 1 回答
  • 0 关注
  • 198 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号