我正在尝试将C#函数转换为PHP。
这是C#函数:
public string Encrypt(string Value)
{
string RetVal = "";
if(Value != string.Empty && Value != null)
{
MemoryStream Buffer = new MemoryStream();
RijndaelManaged RijndaelManaged = new RijndaelManaged();
UnicodeEncoding UnicodeEncoder = new UnicodeEncoding();
byte[] KeyArray = new Byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
byte[] IVArray = new Byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
try
{
byte[] ValueBytes = UnicodeEncoder.GetBytes(Value);
CryptoStream EncryptStream = new CryptoStream(Buffer,
RijndaelManaged.CreateEncryptor(KeyArray, IVArray),
CryptoStreamMode.Write);
EncryptStream.Write(ValueBytes, 0, ValueBytes.Length);
EncryptStream.FlushFinalBlock();
// Base64 encode the encrypted data
RetVal = Convert.ToBase64String(Buffer.ToArray());
}
catch
{
throw;
}
}
return RetVal;
}
这是我在PHP中的尝试:
function EncryptString ($cleartext)
{
$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
$key128 = '111111111111111111111111111';
$iv = '111111111111111111111111111';
if (mcrypt_generic_init($cipher, $key128, $iv) != -1) //Parameter iv will be ignored in ECB mode
{
$cipherText = mcrypt_generic($cipher,$cleartext );
mcrypt_generic_deinit($cipher);
$encrypted = (bin2hex($cipherText));
return base64_encode($encrypted);
}
}
目前,当我使用这两个函数对测试短语“test”进行编码时,我会得到不同的值。看起来PHP版本为$key
和$iv
值采用字符串,其中C#版本采用字节数组。
如何修改我的PHP函数来模仿C#函数?
[编辑] c#功能是第三方,我无权更改它;我需要在PHP中编写等效的代码以相同的方式编码给定的字符串
答案 0 :(得分:1)
查看RijndaelManaged文档并复制:
请注意,您可以从其他地方检索填充。
现在确保为双方使用完全相同的输入。您可以通过以十六进制值打印出键,IV和纯文本来完成此操作。密钥大小和IV大小应该是算法所需的确切位数。要获得相同的纯文本,您需要使用相同的character-encoding s。
最后你需要相同的密文编码,但似乎你已经覆盖了它。
答案 1 :(得分:-1)
我会尝试使用,而不是27 1的字符串,这个:
$key128 = '';
for ( $i = 0; $i < 27; ++$i )
$key128 .= chr(1);
$iv = $key128; // copy
我不完全确定这些函数是做什么的,但这会把你的字符串变成重复1的字节数组。