openssl aes加密,php ctr b,用PHP解密AES CTR Little Endian
openssl aes加密,php ctr b,用PHP解密AES CTR Little Endian
我在使用PHP解密使用iOS 5.x的CommonCrypto庫加密的字符串時遇到麻煩.以下是參數:
Algorithm: AES-128
Mode: CTR
openssl aes加密?Mode options: CTR Little-Endian
Padding: None
這是我最大的嘗試示例:
$encrypted = base64_decode('MlNFlnXE1sqIsmKZRtjChBvUMgiJlXgdjHVxQJ6JK24Id4uaN9NK/nBtY+cgrMJR/PRJRCmIUx0boQO5XqJYZ8VJ0w==');
php解密工具?$key = base64_decode('HB+dD1Irj2rXQ/nO+IuqSiK9xVE3PD9cZGIGzrMtwtA=');
$iv = base64_decode('2gxxKYU/G4lj7174e5wj+g==');
$cryptor = mcrypt_module_open('rijndael-128', '', 'ctr', '');
mcrypt_generic_init($cryptor, $key, $iv);
php解密免費、echo mdecrypt_generic($cryptor, $encrypted);
mcrypt_generic_deinit($cryptor);
mcrypt_module_close($cryptor);
輸出看起來像這樣:
mzphp解密?Lorem ipsum dolo?N??]???+?
????x??k????}??'??????;t
但這應該是“ Lorem ipsum dolor坐著,奉獻自若,sed do …”(包括尾隨省略號.)
塊大小為16,并且正確獲取了前16個字符.這似乎表明Mcrypt和CommonCrypto之間的AES CTR反增量過程不匹配.到目前為止,我聽到的每個人都認為這是Big Endian與Little Endian的問題.
php源代碼解密,我花了幾天時間試圖自己找出所有這些字節序和反增量的東西,但是對我來說仍然是巫毒教. :-(我只需要一些PHP代碼即可正確地解密我的字符串.我不在乎算法的運行速度.我愿意放棄Mcrypt來支持PHP原生解決方案或其他一些PHP擴展,只要這是很常見的做法,但是,不能在iOS端進行更改.
請幫忙!
解決方法:
分組密碼模式非常簡單,如果兩種實現方式不兼容,則可以自己實現.
php微盾解密。這是針對您的特定情況的點擊率實現:
function ctr_crypt($str, $key, $iv) {
$numOfBlocks = ceil(strlen($str) / 16);
$ctrStr = '';
php批量解密。for ($i = 0; $i < $numOfBlocks; ++$i) {
$ctrStr .= $iv;
// increment IV
for ($j = 0; $j < 16; ++$j) {
php加解密工具。$n = ord($iv[$j]);
if (++$n == 0x100) {
// overflow, set this one to 0, increment next
$iv[$j] = "\0";
php中文解謎?} else {
// no overflow, just write incremented number back and abort
$iv[$j] = chr($n);
break;
php aes加密?}
}
}
return $str ^ mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $ctrStr, MCRYPT_MODE_ECB);
php加密源碼?}
該算法非常簡單:您總是要追加IV并增加IV,直到擁有與輸入字符串相比更長(或相等長度)的字符串.然后,使用ECB模式對該字符串進行加密,然后將其與輸入字符串進行XOR運算.
在這里,增量是復雜的部分,因為我們正在處理二進制數.小尾數表示我們從左到右遞增(j = 0,j <16,j).大尾數將意味著我們從右向左遞增(j = 15,j> = 0,j--).
試試看:
$encrypted = base64_decode('MlNFlnXE1sqIsmKZRtjChBvUMgiJlXgdjHVxQJ6JK24Id4uaN9NK/nBtY+cgrMJR/PRJRCmIUx0boQO5XqJYZ8VJ0w==');
$key = base64_decode('HB+dD1Irj2rXQ/nO+IuqSiK9xVE3PD9cZGIGzrMtwtA=');
$iv = base64_decode('2gxxKYU/G4lj7174e5wj+g==');
var_dump(ctr_crypt($encrypted, $key, $iv));
// string(67) "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do..."
注意:ctr_crypt既可以用作加密功能,也可以用作解密功能.
標簽:commoncrypto,mcrypt,aes,cryptography,php
來源: https://codeday.me/bug/20191123/2066695.html