簡體   English   中英

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

[英]Decrypt in Python a string encrypted in PHP with Halite/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的包裝,它是“ NaCl的便攜式,可交叉編譯,可安裝,可打包的分支,具有兼容的API和擴展的API,甚至可以提高可用性進一步。”

有誰知道我應該在Python3中使用哪個依賴項(如果可能的話,提供代碼)來解密字符串? 我想我需要將enc_key設置為Lambda環境變量。

更輕松的跨語言秘密

雖然可以嘗試弄清楚如何在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);

現在,您只需要將隨機數和密碼字符串傳遞給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更改其協議並破壞代碼的可能性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM