亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 197 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號