Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2014, 01:53   #1
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
Вопрос Как правильно организовать шифрование Delphi<>PHP?

Приветствую!

Решил наладить клиент-серверное шифрование. В качестве языка программирования клиента - Delphi XE6, в качестве сервера - PHP 5.5. Для PHP особо выбирать не приходится - MCrypt, а вот для Delphi - решил поискать, ибо то что знал ранее DCPCrypto - наверняка устарел морально и физически. Почти сразу наткнулся на SecureBlackBox - бесплатный набор компонентов и даже поддержка D20 (то бишь Delphi XE6) есть.

Установил. Начал пробовать что нибудь сделать, пытался пытался - не вышло. Может быть кто нибудь сталкивался и сможет помочь?

Код на PHP
Код:
<?php
/*
 * PHP mcrypt - Basic encryption and decryption of a string
 */
$string = "Some text to be encrypted";
$secret_key = "51f732e39e5d800569802df7c37631f4";

// Create the initialization vector for added security.
//$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);

//$iv = "d2328087c75596d1b0569d99cf3c2487";
$iv = "0123456789abcdef";

// Encrypt $string
$encrypted_string = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $secret_key, $string, MCRYPT_MODE_CBC, $iv);

// Decrypt $string
$decrypted_string = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $secret_key, $encrypted_string, MCRYPT_MODE_CBC, $iv);

echo "Original string : " . $string . "<br />\n";
echo "Encrypted string : " . $encrypted_string . "<br />\n";
echo "Decrypted string : " . $decrypted_string . "<br />\n";
echo "----<br />\n";
echo "IV " . $iv . "<br />\n";
echo "IV " . base64_encode($iv) . "<br />\n";
echo "Encrypted string : " . base64_encode($encrypted_string) . "<br />\n";
?>
Как результат:
Код:
Original string : Some text to be encrypted
Encrypted string : ���O���d���c��_Պ��!0H�M��˱?R
Decrypted string : Some text to be encrypted
----
IV 0123456789abcdef
IV MDEyMzQ1Njc4OWFiY2RlZg==
Encrypted string : r+zYEk/vwa9kjJ62Y4e0X9WK2uUhMEjPTeeLy7E/UgU=
Код на Delphi
Код:
const
 iviv:   RawByteString = '0123456789abcdef';
 keykey: RawByteString = '51f732e39e5d800569802df7c37631f4';

procedure TForm1.sButton1Click(Sender: TObject);
var
 Crypto : TElSymmetricCrypto;
 KeyMaterial : TElSymmetricKeyMaterial;
 Factory : TElSymmetricCryptoFactory;

 Secret: ByteArray;
 IV: ByteArray;

 Data: RawByteString;
 Input, Output: ByteArray;

 Result: AnsiString;

 OutSize: Integer;
begin
 Factory := TElSymmetricCryptoFactory.Create;

 SetLength(Secret, Length(keykey));
 Move(keykey[1], Secret[0], Length(keykey));

 SetLength(IV, Length(iviv));
 Move(iviv[1], IV[0], Length(iviv));

 KeyMaterial:= TElSymmetricKeyMaterial.Create;
 KeyMaterial.Key:= Secret;
 KeyMaterial.IV:= IV;

 ShowMessage('IV Length: ' + length(KeyMaterial.IV).ToString);

 Crypto := Factory.CreateInstance(SB_ALGORITHM_CNT_AES256, cmCBC);

 Crypto.KeyMaterial:= KeyMaterial;

 Data:= DecodeBase64(sEdit2.Text);

 SetLength(Input, Length(Data));
 Move(Data[1], Input[0], Length(Data));

 ShowMessage('Input Length: ' + length(Input).ToString);

 try
  OutSize := 0;
  Crypto.Decrypt(@Input[0], Length(Input), nil, OutSize);

  ShowMessage('Length: ' + IntToStr(OutSize));

  SetLength(Output, OutSize);
  Crypto.Decrypt(@Input[0], Length(Input), @Output[0], OutSize);
  SetLength(Output, OutSize);

  SetLength(Result, OutSize);
  Move(Output[0], Result[1], OutSize);

  ShowMessage(Result);
 except
  on E: Exception do
   ShowMessage(E.Message);
 end;
end;
Как результат:
Код:
Ошибка - First chance exception at $77511D4D. Exception class EElSymmetricCryptoError with message 'Invalid symmetric cipher padding'.
В чем может быть дело, и как лучше поступить в этой ситуации? Тут ругается на padding, но я так понимаю это выравнивание - но ключ 32, вектор 16, данные 32 - все и так выравнено, дальше то куда?
STRELOK-2007 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как правильно организовать многовложенность в бд undead92 БД в Delphi 13 10.07.2013 16:48
Как правильно организовать хранение tarakan1983 SQL, базы данных 1 08.06.2012 19:46
[Delphi] Правильно организовать работу сервиса Человек_Борща Win Api 13 06.04.2012 08:49
Как правильно организовать сохранение в файл delphi JK0 Помощь студентам 1 21.12.2010 21:14
как правильно организовать продажу своего софта? broderweb Свободное общение 11 02.12.2009 17:41