我試著通過PHP 7.4 (Laravel)和OpenSSL用DES-ECB加密數值,我試著用在線工具
uj5u.com熱心網友回復:
網站必須考慮哪些問題?
網站允許用DES和TripleDES的2TDEA變體(雙長密鑰)進行加密。該演算法是由密鑰大小決定的。對于8位元組的密鑰,使用DES,對于16位元組的密鑰,使用TripleDES/2TDEA。支持的模式是ECB和CBC。 密鑰、IV(如果是CBC模式)、明文和密文必須在網站上輸入十六進制編碼。零填充被應用(如果明文長度已經是DES/TripleDES塊大小8位元組的整數倍,則不填充的變體)。這對發布的資料意味著什么?
由于發布的十六進制編碼的密鑰96187BBAB2BD19ACF899B74FB4E37972的大小為16位元組,所以使用TripleDES/2TDEA(在ECB模式下)。
十六進制編碼的明文F01DCCE40F8C365ADE0A7DC03BC11DDE的大小為16位元組,因此沒有被填充。由此產生的十六進制編碼的密碼文本355A627E977D8ECF4953C98D801E472F因此具有相同的長度。
如何修復該PHP代碼?
發布的PHP代碼給出了一個不同的結果,因為DES被用作演算法(在ECB模式下),而且還缺少十六進制編碼/解碼。因此,要產生網站的結果,必須固定編碼/解碼,并應用DES-EDE-ECB作為演算法(不要與DES-EDE3-ECB混淆,用于3TDEA/三長密鑰):
$data = hex2bin("F01DCCE40F8C365ADE0A7DC03BC11DDE"/span>) 。 //對16個位元組的資料進行十六進制解碼。
$key = hex2bin("96187BBAB2BD19ACF899B74FB4E37972"); // hex decode the 16 bytes key key.
$encrypted = openssl_encrypt($data, 'DES-EDE-ECB', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING)。) //apply DES-EDE-ECB; use OPENSSL_ZERO_PADDING.
echo bin2hex($encrypted); // 355a627e977d8ecf4953c98d801e472f // hex編碼的16位元組密碼文本。
與輸出:
355a627e977d8ecf4953c98d801e472f
這等于網站的結果,s. here
如何為 DES 實作一致的結果?
當前的PHP代碼應用了DES,因此通過只使用前8個位元組隱含地將密鑰截斷為8個位元組。這一點可以通過洗掉密鑰的最后8個位元組輕松驗證。結果并沒有改變。如果將縮短后的密鑰應用到網站上,結果又是一致的。
如果將縮短后的密鑰應用到網站上,結果又是一致的。
$data = hex2bin("F01DCCE40F8C365ADE0A7DC03BC11DDE")。 //對16個位元組的資料進行十六進制解碼。
$key = hex2bin("96187BBAB2BD19AC"); // hex decode the 8 bytes key.
$encrypted = openssl_encrypt($data, 'DES-ECB', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING)。 //apply DES-ECB; use OPENSSL_ZERO_PADDING.
echo bin2hex($encrypted); // 692370230b8176f011760ddc07392a4f // hex encode the 16 bytes ciphertext。
與輸出:
692370230b8176f011760ddc07392a4f
這等于網站的結果,s. here.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/306681.html
標籤:
