Сейчас на форуме: jinoweb, bartolomeo, rmn (+4 невидимых)

 eXeL@B —› Программирование —› PHP DELPHI AES
Посл.ответ Сообщение

Ранг: 5.2 (гость), 1thx
Активность: 0=0
Статус: Участник

Создано: 23 мая 2014 01:31 · Поправил: Vostol
· Личное сообщение · #1

Доброго времени суток форумчане! Вот я и созрел для своего первого поста в этом разделе.
Проблема следующего характера. AES шифрование.
Code:
  1. base64_encode(openssl_encrypt('test123', 'AES-256-CFB8', 'key', OPENSSL_RAW_DATA, $iv='aiDuqu5leij9ooHa'));

Дает результат:
Code:
  1. 5QuWpDfffw==

по байтам:
Code:
  1. E5 0B 96 A4 37 DF 7F


Реализация на CryptAPI получается не 7 а 16 байт:
Code:
  1. 5QuWpDfff3Qg68ZTsUUGXQ==

по байтам:
Code:
  1. E5 0B 96 A4 37 DF 7F 74 20 EB C6 53 B1 45 06 5D


То есть наблюдаются те же 7 байт, но с довеском.

Дешифровка производится с помощью CAPI.
При попытке дешифровки варианта, получаемого из openssl_encrypt (7 байт) получаю "Поврежденные данные"
При дешифровке 16 байт из CAPI все Ок.

Примеры готов предоставить.



Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 23 мая 2014 09:27
· Личное сообщение · #2

OPENSSL_ZERO_PADDING



Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 23 мая 2014 09:30
· Личное сообщение · #3

Для CAPI это можно решить дополняя шифроблок нулями до размера блока и уже потом делать декрипт и отрезать нужную длину.

-----
старый пень




Ранг: 5.2 (гость), 1thx
Активность: 0=0
Статус: Участник

Создано: 24 мая 2014 00:03
· Личное сообщение · #4

r_e пишет:
Для CAPI это можно решить дополняя шифроблок нулями до размера блока и уже потом делать декрипт и отрезать нужную длину.

Я не стал об этом писать, но я так пробовал, не прокатило.

TryAga1n пишет:
OPENSSL_ZERO_PADDING

Попробую, но не хотелось бы на стороне php что то менять.

Спасибо за ответы, о результатах отпишусь.



Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 24 мая 2014 01:25
· Личное сообщение · #5

Vostol пишет:
Я не стал об этом писать, но я так пробовал, не прокатило.

Не может такого быть ))) уверен что вы что-то не то отрезаете или перемудрили с base64.
cfb = aes(key, iv) ^ msg
соответственно, перед операцией msg нужно выровнять на границу блока, а после операции можно безболезненно отрезать лишнее.

-----
старый пень


| Сообщение посчитали полезным: Vostol

Ранг: 5.2 (гость), 1thx
Активность: 0=0
Статус: Участник

Создано: 24 мая 2014 02:45 · Поправил: Vostol
· Личное сообщение · #6

Данные для примера те же.
Key = 'key'
Data = '5QuWpDfffw=='
IV = 'aiDuqu5leij9ooHa'

Несколько упростил код.

Code:
  1.       SetLength(Buffer, 16);
  2.       FillChar(Buffer[0],Length(Buffer),#0);
  3.  
  4.       CBuffer:=TBytes(Base64DecodeStr(input)); // CBuffer = E5 0B 96 A4 37 DF 7F
  5.  
  6.       Move(CBuffer[0],Buffer[0],Length(CBuffer)); //Buffer = E5 0B 96 A4 37 DF 7F 00 00 00 00 00 00 00 00 00
  7.       dataLen:=Length(Buffer);
  8.  
  9.  
  10.       if not CryptDecrypt(hKey, 0, True, 0, @Buffer[0], @dataLen) then
  11.         RaiseLastOSError();


RaiseLastOSError выдает ошибку - Плохие данные, если CryptDecrypt отработал без ошибок, в dataLen была бы реальная длина - 7 байт, но тут в ней 16,
После отработки в Buffer - результат test123 + довесок на 9 байт.

UPD. Проблема решилась установкой Final в False, перестало вызывать ошибку.
Всем спасибо. Можно закрыть.


 eXeL@B —› Программирование —› PHP DELPHI AES
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати