簡體   English   中英

從 phpseclib 2 升級到 3

[英]Upgrading from phpseclib 2 to 3

幾年前我繼承了一個項目,幾天前我們開始隨機遇到 phpseclib 2.x 不再解密的問題,我正在為這個問題煩惱。 我們的項目中沒有更改代碼,但解密 function 字面上停止工作,加密很好,但即使在測試環境中,解密也沒有任何作用,並且錯誤是沒有的,或者基本上是模糊的,它們是無用的。 所以,我們去了 3.0,但這個項目的原始開發人員沒有使用初始化向量,因為它在版本 2 中不是必需的,它在版本 3 中是必需的。

我的問題是我們如何在版本 3 中使用沒有 IV 的 AES 進行解密? 我在文檔中找不到如何執行此操作的任何地方,如果我不提供 IV,phpseclib 會拋出錯誤。

所以基本上,之前:

$aes = new AES();
$aes->setKey('secret_key');
$enc_data = $aes->encrypt('abcdefg');
$dec_data = $aes->decrypt($enc_data);

新版本:

$aes = new AES('cbc'); //or whatever cipher
$aes->setIV('something');
$aes->setKey('secret_key');
$enc_data = $aes->encrypt('abcdefg');
$dec_data = $aes->decrypt($enc_data);

現在在 3.0 中,AES 需要聲明一個 cypher, 看起來 CBC是 2 中的默認值,但是如果 2.0 中沒有添加 IV 而我需要在 3.0 中添加它,我看不出該怎么辦。 我試過但不能添加 '',根本不傳遞任何參數,null 等,所以如果有人沒有使用版本 2 的初始化向量,他們就不能使用 3 解密......? 我查看了 2.0 文檔,據我所知,它默認為空字符串,我無法在 3.0 中傳遞它。

有人遇到過這個嗎? 任何人都知道如何解決它? 我從這個服務器上完全刪除了 2.0 並重新添加了它,但我仍然無法用它解密,我猜 apache 或 php 中的某些更新破壞了某些東西,但我無法在我的其他服務器上重現它。

在 V2 中,默認使用 CBC 和零 IV,即具有 16 個 0x00 值的 IV。 在 V3 中,模式和 IV必須明確指定。

因此,以下代碼會產生相同的密文:

使用 V2:

$key = hex2bin("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f");
$plaintext = "The quick brown fox jumps over the lazy dog";
$aes = new AES();
$aes->setKey($key);
$enc_data = $aes->encrypt($plaintext);
$dec_data = $aes->decrypt($enc_data);

print(bin2hex($enc_data) . PHP_EOL); // bce46469e2f7ab6b7ea767bd3252529a843ba24e890e567ef600c4a6e1051ffc2012305e362438463838fad4043c22a6
print($dec_data . PHP_EOL); // The quick brown fox jumps over the lazy dog

使用 V3:

$key = hex2bin("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f");
$iv = hex2bin("00000000000000000000000000000000");
$plaintext = "The quick brown fox jumps over the lazy dog";
$aes = new AES('cbc');
$aes->setKey($key);
$aes->setIV($iv);
$enc_data = $aes->encrypt($plaintext);
$dec_data = $aes->decrypt($enc_data);

print(bin2hex($enc_data) . PHP_EOL); // bce46469e2f7ab6b7ea767bd3252529a843ba24e890e567ef600c4a6e1051ffc2012305e362438463838fad4043c22a6
print($dec_data . PHP_EOL); // The quick brown fox jumps over the lazy dog

請注意,static IV 與零 IV 一樣是不安全的。

暫無
暫無

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

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