簡體   English   中英

加密結果在PHP和Node.js中有所不同

[英]encryption result differs in PHP and Node.js

我使用帶有空白iv和密鑰(16 0)的AES 128 CBC加密字符串“ aaaaaaaaaaaaaaaaaa”(16字節UTF8字符串),並獲得不同的結果

在PHP中:

echo base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128,pack("H*", "00000000000000000000000000000000"),"aaaaaaaaaaaaaaaa",MCRYPT_MODE_CBC,pack("H*", "00000000000000000000000000000000")))

返回“ kmwP6gWv1l9ZMdKanGs / nA ==”

在Node.js中:

let cipher = require('crypto').createCipheriv('aes-128-cbc',Buffer.alloc(16),Buffer.alloc(16))
console.log(cipher.update('aaaaaaaaaaaaaaaa','utf8','base64') + cipher.final('base64'))

返回“ kmwP6gWv1l9ZMdKanGs / n HeUidae8Z4dK0HU7p2z + 1c =”

第一位(固定)與PHP相同,但是PHP值具有一個額外的“ A =”,然后Node值具有一個完整的額外“ HeUidae8Z4dK0HU7p2z + 1c”

我承認我對這里發生的事情非常不滿意-我在這里想念什么?

編輯 ...但不是那么搖晃,以至於我不明白我在這里所做的並不是特別安全。 不必擔心這是否是進行加密的“正確”方法-請關注結果應該對齊的事實。

edit2-但是,我可以使用十六進制而不是base64進行封閉-

PHP:926c0fea05afd65f5931d29a9c6b3f9c

節點: 926c0fea05afd65f5931d29a9c6b3f9c 779489d69ef19e1d2b41d4ee9db3fb57

Node十六進制的第二個塊是由.final方法返回的,我不明白它的用途。

AES的塊大小為16個字節。 您正在加密字符串“ hello world”,該字符串在UTF8中長11個字節。 因此,使用填充將字符串的長度增加到16個字節。

節點以及它應該使用的PKCS5填充將您的純文本填充到16個字節,然后對其進行加密。

mcrypt 不應使用零字節來填充純文本,這是不應該的 mcrypt已被棄用 ,並且已經廢棄了十年。

因為您的兩種填充方案不同,所以純文本實際上甚至在我們應用AES之前就已經不同。

我的建議:在PHP中使用openssl_*函數。 並且不要使用靜態IV。 使用靜態IV會使您的程序容易遭受與ECB模式相同的某些漏洞,這不好!

暫無
暫無

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

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