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

标签 php python encryption libsodium

我使用这个 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 的包装器,Libsodium 是“一个可移植、可交叉编译、可安装、可打包的 NaCl 分支,具有兼容的API 和扩展 API 可以进一步提高可用性。”

有谁知道我应该在Python3中使用哪个依赖项(如果可能的话,提供代码)来解密字符串?我想我需要将 enc_key 设置为 Lambda 环境变量。

最佳答案

更简单的跨语言 secret

虽然可以尝试弄清楚如何在 Python 中重新创建 Halite 的加密,但我建议在下面移动一层抽象并使用 libsodium 的 high level encryption 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);

现在,如果您想继续使用 base64 并使用pynacl,您只需将随机数和密码字符串获取到Python即可。包,代码如下:

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))

基本原理

我这么说的原因是因为如果你深入研究岩盐的encryption code ,他们基本上手动重新实现了 Secretbox 的很多功能。看来 Halite 确实只设计用于 PHP。通过直接使用 libsodium,您可以避免 Halite 更改其协议(protocol)并破坏您的代码的可能性。

关于php - 在 Python 中使用 Halite/Libsodium 解密在 PHP 中加密的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57761141/

相关文章:

python - 使用带有稀疏 scipy 矩阵的广播

python - 如何使用RSA方案加密字符串?

php - 从选择的 field1 插入到 field1,field2,field2 仅填充 1 个字段

php - Laravel date_format 字段验证向后?

python - 使用 Joblib 并获取 "cannot unpack non-iterable function object"

Python代码检测OS X El Capitan中的暗模式以更改状态栏菜单图标

javascript - Node crypto.createDecipher 错误的最终 block 长度错误

encryption - 使用 OpenSSL 问题输出解密字符串

php - Laravel 5.4 测试路由受 $request->ajax() 保护,如何发起测试 ajax 请求?

php - 如何在 Magento 搜索中重置 addAttributeToFilter