我把这个代码片段作为一个例子,我试图让它更多一点"现代":
$key='09KzF2qMBy58ZWg137N$I4h6UwJvp!ij';
$encrypted='Chttex_vuYYEK-oKQfwYrVCZYbnNh3tMgwGuK-VOsvt7TjF5M6MIcsE6e8DynZrHuxrmtmIpiN215WygdO-hzXnmx45RXzBWdxk_MkIvNoI=';
$encrypted = urlsafe_b64decode($encrypted);
$decrypted = decrypt($encrypted, $key);
$inflated = gzinflate($decrypted);
echo 'Decrypted: '.$inflated."<br />";
function urlsafe_b64decode($data) {
return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}
function decrypt($data, $key)
{
return mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_ECB);
}
我在PHP7上试图转换它使用openssl。我拿着字符串并通过现有的“urlsafe_b64decode”运行它。功能,然后创建另一个解密&#39;功能:
function decrypt($string, $key)
{
return openssl_decrypt($string, 'AES-256-ECB', $key);
}
我认为这将是一个相当简单的一对一转换,但它总是返回&#34; false&#34;。我有什么想法可能做错了吗? 提前谢谢!
修改: 由于我使用的服务是.NET商店,所以这里是.NET加密的例子,如果它有帮助的话。
Public Shared Function Encrypt(ByVal data As Byte()) As Byte()
Dim encrypted As Byte()
Using rijAlg = New System.Security.Cryptography.AesManaged()
rijAlg.Key = Encoding.ASCII.GetBytes("encryptionkeyhere")
rijAlg.Padding = System.Security.Cryptography.PaddingMode.None
rijAlg.Mode = System.Security.Cryptography.CipherMode.ECB
Dim encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV)
Using msEncrypt = New MemoryStream()
Using csEncrypt = New System.Security.Cryptography.CryptoStream(msEncrypt, encryptor, System.Security.Cryptography.CryptoStreamMode.Write)
csEncrypt.Write(data, 0, data.Length)
End Using
encrypted = msEncrypt.ToArray()
End Using
End Using
Return encrypted
End Function
更新2 所以我更新了我的本地服务器以获得mcrypt,并且能够从我的初始代码片段解码加密的字符串。这是期望的回应:&#34; sessionid = 7bf727043d85e6963e640fb541d886a7454f8091&amp; requestid = 1488925528&#34;
在谷歌搜索和stackoverflowing和实验之后,我仍然无法使用openssl正确解密字符串。它甚至可能吗?
答案 0 :(得分:0)
这不是一个答案,但由于我包含了大量代码,我将它放在这里。它也从一个不同的地方取消了,但是当我偶然测试它时,我关上了窗户,并且不能给予适当的信任。
它还使用不同的密码方法(ECB)。但是,它是你的起点。正如您所看到的,运行此代码会产生一些错误,但在底部的vardump中,确实会返回加密的文本字符串。
希望它对你有所帮助!我必须跑出门!
<?php
$key = "1234541413411111";
$data = "hello world";
$cipher = mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
$key,
$data,
MCRYPT_MODE_ECB);
$plain = openssl_decrypt(
$cipher,
'aes-128-ecb',
$key,
OPENSSL_RAW_DATA | OPENSSL_NO_PADDING
);
//try to detect null padding
if (mb_strlen($iv, '8bit') % mb_strlen($plain, '8bit') == 0) {
preg_match_all('#([\0]+)$#', $plain, $matches);
if (mb_strlen($matches[1][0], '8bit') > 1) {
$plain = rtrim($plain, "\0");
trigger_error('Detected and stripped null padding. Please double-check results!');
}
}
var_dump(
$message,
bin2hex($cipher),
$plain,
mb_strlen($message, '8bit'),
mb_strlen($plain, '8bit'),
$message === $plain
);