purebasic.info

PureBasic forum
Текущее время: Пн апр 23, 2018 8:04 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: AESDecoder
СообщениеДобавлено: Пн окт 16, 2017 10:29 pm 
Не в сети
студент
Аватар пользователя

Зарегистрирован: Сб ноя 22, 2014 10:14 pm
Сообщений: 5
Откуда: Россия, Москва
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Здравствуйте, у меня возник вопрос по работе алгоритма AES
У меня есть шифровщик и дешифровщик AES их код ниже
Шифровщик
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
OpenPreferences("cipher.ini")
text.s = ReadPreferenceString("Text","")
padd = 16-Len(text.s)%16
  If padd = 0
    For i = 1 To 16
      text.s = text.s + Chr(16)
    Next
  Else
    For i = 1 To padd
      text.s = text.s + Chr(padd)
    Next
    For i = 1 To 16
      text.s = text.s + Chr(16)
    Next
  EndIf
Debug Len(text)
*Input = AllocateMemory(Len(text))
*Output = AllocateMemory(Len(text))
*Key = AllocateMemory(16)
*IV = AllocateMemory(16)
PokeS(*Key,"aaaaaaaaaaaaaaaa")
PokeS(*IV,"1010101010101010")
PokeS(*Input,text)
If AESEncoder(*Input,*Output,Len(text),*Key,128,*IV,#PB_Cipher_CBC) = 0
  MessageRequester("","Failed")
Else
  MessageRequester("",PeekS(*Output))
  WritePreferenceString("CipherText",PeekS(*Output))
EndIf



Дешифровщик
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
OpenPreferences("cipher.ini")
*ct = AllocateMemory(256)
*iv = AllocateMemory(16)
*key = AllocateMemory(16)
*|/2/>out = AllocateMemory(256)
c.s = Left(ReadPreferenceString("CipherText",""),256)
PokeS(*ct,c.s)
i.s = Mid(ReadPreferenceString("CipherText",""),257,16)
PokeS(*iv,i)
k.s = Right(ReadPreferenceString("CipherText",""),16)
PokeS(*key,k)
CallDebugger
Debug *ct
Debug *iv
Debug *key
 
If AESDecoder(*ct,*|/2/>out,256,*key,128,*iv,#PB_Cipher_CBC) = 0
  Debug *ct
Else
  Debug out
EndIf



При шифровании данного текста:
Цитата:
AES is based on a design principle known as a substitution-permutation network, a combination of both substitution and permutation, and is fast in both software and hardware. Unlike its predecessor DES, AES does not use a Feistel network.


Выход получается следующим:
Цитата:
ꋙ䫢궵樉㋱皇ܼ舸㍲嗩↫ꧾ旲퉧挚ꛢ鋬剼忂Ɬ辤旯陓햇鍙挲䇨ὲ劥椞ᴎ쳶⁀ㄙ뻰矽伤蹤ą礹⥞✸퓊䂵▱꯹࢑儠蚗貫뽒쫿ꚽ㊍�浪䈕鋴鑶쫽퇞軫睸죋툂凴ꜫ擛ᬐ壃᭩ﶄ䗝핋⯹梜槅ꛉ૒Ⳇ䦇硗跱樇꠸⛯삓戈짷ヨ䓕Yԍ⃻⫢紓껲⑫졁墻궭宁符ͅ졆쿞ꎩጴ鴅�럸뷞橾휨뱀찻꜈ࠀaaaaaaaaaaaa1010101010101010


Т.е. в конце висят IV и ключ. При попытке расшифровать часть до IV и ключа второй программой декодер возвращает 0.
В дебаггере неправильно заполняются буферы iv, key, ct.
Что я делаю не так?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AESDecoder
СообщениеДобавлено: Вт окт 17, 2017 11:52 am 
Не в сети
доцент

Зарегистрирован: Чт июн 23, 2016 8:15 pm
Сообщений: 31
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Навскидку могу сказать, что вы, как минимум, выделяете слишком мало памяти под выходной буфер. Строка text в памяти занимает вдвое больше места из-за того, что ее внутреннее представление - Unicode. Посмотрите в справке пример шифрования, там под буфер выделяется StringByteLength(String$) + SizeOf(Character)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AESDecoder
СообщениеДобавлено: Вт окт 17, 2017 12:31 pm 
Не в сети
доцент

Зарегистрирован: Чт июн 23, 2016 8:15 pm
Сообщений: 31
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
И ключ слишком длинный, и вектор: 32 байта против необходимых для 128-битного шифрования 16 байт. Отсюда и растут ноги всех ваших проблем: вы не представляете себе внутреннего представления данных.

Кроме того, в конце шифрованной строки не должно быть ни IV, ни ключа шифрования. Они там у вас появились из-за неверно выбранной длины выходного буфера. Соответственно, либо при дешифровке надо получать вектор и ключ другими способами, или добавлять их в конец строки на этапе записи в ini-файл (последнее неправильно с точки зрения ИБ).

Также можно обойтись без PokeS: key.s = "aaaaaaaa" (например), затем использовать @key в вызовах AESEncoder / AESDecoder


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] и гости: 10


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB