需要匹配的PHP加密函数吗
3年前,我构建了一个多层应用程序,它在.NET端加密,在PHP端解密。我从未创建过相应的PHP加密函数,因为我认为我永远都不需要它。现在我知道了,我不记得我从哪里得到的PHP解密。我对php加密了解不够,无法从头开始构建它,并将其与现有的php Decrypt()函数配合使用 我需要有人给我指出一个PHP Encrypt()函数,我的PHP Decrypt()将对其进行正确的解密。详情如下 .NET加密功能:需要匹配的PHP加密函数吗,php,encryption,cryptography,mcrypt,encryption-symmetric,Php,Encryption,Cryptography,Mcrypt,Encryption Symmetric,3年前,我构建了一个多层应用程序,它在.NET端加密,在PHP端解密。我从未创建过相应的PHP加密函数,因为我认为我永远都不需要它。现在我知道了,我不记得我从哪里得到的PHP解密。我对php加密了解不够,无法从头开始构建它,并将其与现有的php Decrypt()函数配合使用 我需要有人给我指出一个PHP Encrypt()函数,我的PHP Decrypt()将对其进行正确的解密。详情如下 .NET加密功能: private string Encrypt(string plainText) {
private string Encrypt(string plainText)
{
if (string.IsNullOrEmpty(plainText))
return string.Empty;
string passPhrase = "secret1";
string saltValue = "secret2";
int passwordIterations = 1000;
string initVector = "pOWaTbO92LfXbh69JkYzfT7P465TNc0h";
int keySize = 256;
byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
Rfc2898DeriveBytes password = new Rfc2898DeriveBytes(passPhrase, saltValueBytes, passwordIterations);
byte[] keyBytes = password.GetBytes(keySize / 8);
// Create uninitialized Rijndael encryption object.
RijndaelManaged symmetricKey = new RijndaelManaged();
symmetricKey.BlockSize = 256;
symmetricKey.KeySize = 256;
symmetricKey.Padding = PaddingMode.Zeros;
symmetricKey.Mode = CipherMode.CBC;
ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes);
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
cryptoStream.FlushFinalBlock();
byte[] cipherTextBytes = memoryStream.ToArray();
memoryStream.Close();
cryptoStream.Close();
string cipherText = Convert.ToBase64String(cipherTextBytes);
return cipherText;
}
function Decrypt($encryptedText) {
$p = "secret1";
$s = "secret2";
$iv = "pOWaTbO92LfXbh69JkYzfT7P465TNc0h";
$c = 1000;
$kl = 32;
$a = 'sha1';
$hl = strlen(hash($a, null, true)); # Hash length
$kb = ceil($kl / $hl); # Key blocks to compute
$dk = ''; # Derived key
# Create key
for ( $block = 1; $block <= $kb; $block ++ ) {
# Initial hash for this block
$ib = $b = hash_hmac($a, $s . pack('N', $block), $p, true);
# Perform block iterations
for ( $i = 1; $i < $c; $i ++ )
# XOR each iterate
$ib ^= ($b = hash_hmac($a, $b, $p, true));
$dk .= $ib; # Append iterated block
}
$key = substr($dk, 0, $kl);
$plainText = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($encryptedText), MCRYPT_MODE_CBC, $iv));
$textArray = str_split($plainText);
foreach($textArray as $char) {
$ascii = ord($char);
if($ascii < 32 || $ascii > 127){
return "";
}
}
return $plainText;
}
PHP解密函数:
private string Encrypt(string plainText)
{
if (string.IsNullOrEmpty(plainText))
return string.Empty;
string passPhrase = "secret1";
string saltValue = "secret2";
int passwordIterations = 1000;
string initVector = "pOWaTbO92LfXbh69JkYzfT7P465TNc0h";
int keySize = 256;
byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
Rfc2898DeriveBytes password = new Rfc2898DeriveBytes(passPhrase, saltValueBytes, passwordIterations);
byte[] keyBytes = password.GetBytes(keySize / 8);
// Create uninitialized Rijndael encryption object.
RijndaelManaged symmetricKey = new RijndaelManaged();
symmetricKey.BlockSize = 256;
symmetricKey.KeySize = 256;
symmetricKey.Padding = PaddingMode.Zeros;
symmetricKey.Mode = CipherMode.CBC;
ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes);
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
cryptoStream.FlushFinalBlock();
byte[] cipherTextBytes = memoryStream.ToArray();
memoryStream.Close();
cryptoStream.Close();
string cipherText = Convert.ToBase64String(cipherTextBytes);
return cipherText;
}
function Decrypt($encryptedText) {
$p = "secret1";
$s = "secret2";
$iv = "pOWaTbO92LfXbh69JkYzfT7P465TNc0h";
$c = 1000;
$kl = 32;
$a = 'sha1';
$hl = strlen(hash($a, null, true)); # Hash length
$kb = ceil($kl / $hl); # Key blocks to compute
$dk = ''; # Derived key
# Create key
for ( $block = 1; $block <= $kb; $block ++ ) {
# Initial hash for this block
$ib = $b = hash_hmac($a, $s . pack('N', $block), $p, true);
# Perform block iterations
for ( $i = 1; $i < $c; $i ++ )
# XOR each iterate
$ib ^= ($b = hash_hmac($a, $b, $p, true));
$dk .= $ib; # Append iterated block
}
$key = substr($dk, 0, $kl);
$plainText = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($encryptedText), MCRYPT_MODE_CBC, $iv));
$textArray = str_split($plainText);
foreach($textArray as $char) {
$ascii = ord($char);
if($ascii < 32 || $ascii > 127){
return "";
}
}
return $plainText;
}
函数解密($encryptedText){
$p=“secret1”;
$s=“secret2”;
$iv=“pOWaTbO92LfXbh69JkYzfT7P465TNc0h”;
$c=1000;
$kl=32;
$a='sha1';
$hl=strlen(散列($a,null,true));#散列长度
$kb=ceil($kl/$hl)#要计算的关键块
$dk='';#派生密钥
#创建密钥
对于($block=1;$block 127){
返回“”;
}
}
返回$plainText;
}
My.NET Encrypt()和PHP Decrypt()配合得很好,没有问题。是否有一个PHP加密英雄可以向我展示一个与发布的PHP Decrypt()函数一起工作的PHP Encrypt()函数
一个加密示例:“SnoqL/xcgfFBkhZld+QXRnsl7zS9viJpJsbm4MocDUQ=”解密到字符串“443”。没有引号。下面是带证明的加密代码。我认为这是一个测试使用my函数加密,作为解密函数的输入,该函数将成功解密并打印“这是一个测试!”到屏幕上
<?
echo Decrypt(Encrypt('This is a test!'));
function Encrypt($plainText) {
$key = createKey();
$encryptedText = rtrim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $plainText, MCRYPT_MODE_CBC, "pOWaTbO92LfXbh69JkYzfT7P465TNc0h")));
return $encryptedText;
}
function Decrypt($encryptedText) {
$key = createKey();
$plainText = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($encryptedText), MCRYPT_MODE_CBC, "pOWaTbO92LfXbh69JkYzfT7P465TNc0h"));
return $plainText;
}
function createKey() {
$p = "secret1";
$s = "secret2";
$dk = '';
for ($block = 1; $block <= 2; $block++) {
$ib = $b = hash_hmac('sha1', $s . pack('N', $block), $p, true);
for ($i = 1; $i < 1000; $i++)
$ib ^= ($b = hash_hmac('sha1', $b, $p, true));
$dk .= $ib;
}
return substr($dk, 0, 32);
}
“SnoqL/xcgfFBkhZld+QXRnsl7zS9viJpJsbm4MocDUQ=”解密到字符串“443”。没有引用。这个问题可能被否决了,因为StackOverflow不是一个代码编写服务。