Существующая реализация C # шифрует строку путем реализации RijndaelManaged()
следующее:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace sample
{
class Program
{
static void Main(string[] args)
{
var sKey = "ABCDEF0123456789ABCDEF0123456789";
var sData = "Some Data";
var bData = Encoding.ASCII.GetBytes(sData);
var oAes = new RijndaelManaged();
oAes.Key = Encoding.ASCII.GetBytes(sKey.Substring(0, 32));
oAes.IV = Encoding.ASCII.GetBytes(sKey.Substring(0, 16));
var bEncrypted = oAes.CreateEncryptor(oAes.Key, oAes.IV).TransformFinalBlock(bData, 0, bData.Length);
Console.WriteLine(Convert.ToBase64String(bEncrypted));
// Output: NXyPbSVtB5LomNcsPK7cgg==
}
}
}
Реализация php должна давать одинаковый результат при одинаковом вводе, чтобы можно было сравнить две результирующие строки.
У всех библиотек, которые я пробовал, отсутствует метод, похожий на TransformFinalBlock ().
К сожалению, реализация C # не может быть изменена — мы должны найти работающую реализацию php.
Аналогичная реализация PHP (с использованием phpseclib / phpseclib библиотека) следует:
<?php
function getBytes($s) {
$result = '';
for ($i = 0; $i < mb_strlen($s, 'ASCII'); $i++) {
$result .= ord($s[$i]);
}
return $result;
}
$sKey = "ABCDEF0123456789ABCDEF0123456789";
$sData = "Some Data";
$bData = getBytes($sData);
$bKey = getBytes(substr($sKey, 0, 32));
$bIV = getBytes(substr($sKey, 0, 16));
include 'vendor/autoload.php';
$oAes = new \phpseclib\Crypt\Rijndael(2); // MODE_CBC - Default for RijndaelManaged()
$oAes->setBlockLength(128); // Default for RijndaelManaged()
$oAes->setKey($bKey);
$oAes->setIV($bIV);
$bEncrypted = $oAes->encrypt($bData);
echo(base64_encode($bEncrypted));
// Output: HwznolyEl6472Hm0rbNzINEa6LUwo4O4UAWd90P9PUg=
Как можно добиться того же результата в php?
Задача ещё не решена.
Других решений пока нет …