Невозможно получить идентичный результат шифрования Rijndael в php и C #

Существующая реализация 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?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector