C# 和 PHP 加密兼容性 - 3DES ECB 与 PKCS7
C# and PHP encryption compatibility - 3DES ECB with PKCS7
我有一个常见问题,但网络上的各种解决方案中 none 似乎对我有用。
我有使用 PKCS7 加密 3DES-ECB 的 C# 代码。我必须在 PHP 中做同样的事情,但我得到了不同的结果。
这是我的 C# 代码:
public string Encrypt(string toEncrypt, string key)
{
byte[] keyArray;
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
//Always release the resources and flush data
// of the Cryptographic service provide. Best Practice
hashmd5.Clear();
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = tdes.CreateEncryptor();
byte[] resultArray =
cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
tdes.Clear();
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
我在php中做了很多尝试...这只是其中之一:
function apiEncode($data)
{
$key = "6702BC24DD0527E7";
//Pad for PKCS7
$blockSize = mcrypt_get_block_size('tripledes', 'ecb');
$len = strlen($data);
$pad = $blockSize - ($len % $blockSize);
$data .= str_repeat(chr($pad), $pad);
//Encrypt data
$encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');
return base64_encode($encData);
}
我使用的是随机密钥,您可以在 php 示例代码中找到它。
当输入为“00010”时,C#代码returns“FcXBCikZU64=”而php 给我 "FIg+xqod9iY=".
为什么?我想我正在做我在 blogs/tutorials/etc 中找到的所有东西...那么,我的问题是什么?
更新:
我已经添加了,但仍然是坏消息...
$key .= substr($key,0,8);
function apiEncode($data)
{
$key = "6702BC24DD0527E7";
//Pad for PKCS7
$blockSize = mcrypt_get_block_size('tripledes', 'ecb');
$len = strlen($data);
$pad = $blockSize - ($len % $blockSize);
$data .= str_repeat(chr($pad), $pad);
$key .= substr($key,0,8); // append the first 8 bytes onto the end
//Encrypt data
$encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb'); //, $iv);
return base64_encode($encData);
}
现在输出是 hbJpiCNmXz8=...仍然不是我需要的..
UPDATE2:问题是,在 C# 方面,我做了一个散列,但我不知道如何在 php.. 看代码 "tabbed",是我在 C# 端做散列的地方。我怎么能在 php 中做呢?
解决方案:
function apiEncode($data)
{
//Pad for PKCS7
$blockSize = mcrypt_get_block_size('tripledes', 'ecb');
$len = strlen($data);
$pad = $blockSize - ($len % $blockSize);
$data .= str_repeat(chr($pad), $pad);
$key = "6702BC24DD0527E7";
$key = md5($key,TRUE);
$key .= substr($key,0,8);
//Encrypt data
$encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');
return base64_encode($encData);
}
$crypt = apiEncode("00010");
echo "CRYPT: $crypt";
PHP代码:
$key = "6702BC24DD0527E7";
$key = md5($key,TRUE);
$key .= substr($key,0,8);
C# 代码是 "ok" 原样。
"ok" 在这里是个大词。我可能会使用 SHA256 和 trim 它到 24 字节:
C#:
SHA256Managed sha256 = new SHA256Managed();
keyArray = sha256.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
Array.Resize(ref keyArray, 24);
//Always release the resources and flush data
// of the Cryptographic service provide. Best Practice
sha256.Clear();
和PHP:
$key = "6702BC24DD0527E7";
$key = hash("sha256",$key,TRUE);
$key = substr($key,0,24);
并且仍然是 "lower case OK"...通常您应该使用 AES 和各种区块链模式之一,例如 CBC(需要 IV),并且密码应该是 "strenghtened"使用算法,例如 PBKDF2(需要 PHP >= 5.5)
好的,问题解决了。看this link,我都写在那里
我有一个常见问题,但网络上的各种解决方案中 none 似乎对我有用。
我有使用 PKCS7 加密 3DES-ECB 的 C# 代码。我必须在 PHP 中做同样的事情,但我得到了不同的结果。
这是我的 C# 代码:
public string Encrypt(string toEncrypt, string key)
{
byte[] keyArray;
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
//Always release the resources and flush data
// of the Cryptographic service provide. Best Practice
hashmd5.Clear();
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = tdes.CreateEncryptor();
byte[] resultArray =
cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
tdes.Clear();
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
我在php中做了很多尝试...这只是其中之一:
function apiEncode($data)
{
$key = "6702BC24DD0527E7";
//Pad for PKCS7
$blockSize = mcrypt_get_block_size('tripledes', 'ecb');
$len = strlen($data);
$pad = $blockSize - ($len % $blockSize);
$data .= str_repeat(chr($pad), $pad);
//Encrypt data
$encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');
return base64_encode($encData);
}
我使用的是随机密钥,您可以在 php 示例代码中找到它。
当输入为“00010”时,C#代码returns“FcXBCikZU64=”而php 给我 "FIg+xqod9iY=".
为什么?我想我正在做我在 blogs/tutorials/etc 中找到的所有东西...那么,我的问题是什么?
更新:
我已经添加了,但仍然是坏消息...
$key .= substr($key,0,8);
function apiEncode($data)
{
$key = "6702BC24DD0527E7";
//Pad for PKCS7
$blockSize = mcrypt_get_block_size('tripledes', 'ecb');
$len = strlen($data);
$pad = $blockSize - ($len % $blockSize);
$data .= str_repeat(chr($pad), $pad);
$key .= substr($key,0,8); // append the first 8 bytes onto the end
//Encrypt data
$encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb'); //, $iv);
return base64_encode($encData);
}
现在输出是 hbJpiCNmXz8=...仍然不是我需要的..
UPDATE2:问题是,在 C# 方面,我做了一个散列,但我不知道如何在 php.. 看代码 "tabbed",是我在 C# 端做散列的地方。我怎么能在 php 中做呢?
解决方案:
function apiEncode($data)
{
//Pad for PKCS7
$blockSize = mcrypt_get_block_size('tripledes', 'ecb');
$len = strlen($data);
$pad = $blockSize - ($len % $blockSize);
$data .= str_repeat(chr($pad), $pad);
$key = "6702BC24DD0527E7";
$key = md5($key,TRUE);
$key .= substr($key,0,8);
//Encrypt data
$encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');
return base64_encode($encData);
}
$crypt = apiEncode("00010");
echo "CRYPT: $crypt";
PHP代码:
$key = "6702BC24DD0527E7";
$key = md5($key,TRUE);
$key .= substr($key,0,8);
C# 代码是 "ok" 原样。
"ok" 在这里是个大词。我可能会使用 SHA256 和 trim 它到 24 字节:
C#:
SHA256Managed sha256 = new SHA256Managed();
keyArray = sha256.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
Array.Resize(ref keyArray, 24);
//Always release the resources and flush data
// of the Cryptographic service provide. Best Practice
sha256.Clear();
和PHP:
$key = "6702BC24DD0527E7";
$key = hash("sha256",$key,TRUE);
$key = substr($key,0,24);
并且仍然是 "lower case OK"...通常您应该使用 AES 和各种区块链模式之一,例如 CBC(需要 IV),并且密码应该是 "strenghtened"使用算法,例如 PBKDF2(需要 PHP >= 5.5)
好的,问题解决了。看this link,我都写在那里