stm32f4 AES ECB DECRYPT problem

Başlatan Gökhan BEKEN, 26 Ağustos 2015, 14:30:21

Gökhan BEKEN

#include "stm32f4xx_cryp.h"
extern ErrorStatus CRYP_AES_ECB(uint8_t Mode,
                         uint8_t *Key, uint16_t Keysize,
                         uint8_t *Input, uint32_t Ilength,
                         uint8_t *Output);

int main(void) {
	SystemInit();

	/* Enable CRYP clock */
	RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_CRYP, ENABLE);



	unsigned char key_[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
	unsigned char out_[16];
	unsigned char intputVeri_[16]="deneme123456"; // 16 adet 

	ErrorStatus hata=0;

	hata=CRYP_AES_ECB(MODE_DECRYPT,key_,128,intputVeri_,16,out_);
	if(hata == SUCCESS){
		//buraya girmiyor
	}
	if(hata == ERROR){
		//buraya giriyor	
	}
}



16 byte'lık şifrelenmiş veriyi ve anahtarı verip, çevrilmiş halini almak istiyorum, ama kütüphanede Keysize olarak "128, 192 or 256" istiyor, bunun sebebini anlayamadım, kullanımımda hata mı var?

Kullanım klavuzu:
/**
  * @brief  Encrypt and decrypt using AES in ECB Mode
  * @param  Mode: encryption or decryption Mode.
  *          This parameter can be one of the following values:
  *            @arg MODE_ENCRYPT: Encryption
  *            @arg MODE_DECRYPT: Decryption
  * @param  Key: Key used for AES algorithm.
  * @param  Keysize: length of the Key, must be a 128, 192 or 256.
  * @param  Input: pointer to the Input buffer.
  * @param  Ilength: length of the Input buffer, must be a multiple of 16.
  * @param  Output: pointer to the returned buffer.
  * @retval An ErrorStatus enumeration value:
  *          - SUCCESS: Operation done
  *          - ERROR: Operation failed
  */
Özel mesaj okumuyorum, lütfen göndermeyin.

X-Fi

#1
Hocam kriptolama için kullandığınız key 16 byte yani 128 bit daha uzun keyler kullandığınızda seçimi 192 yada 256 olarak değiştirebiliyorsunuz.

Şifrelemede ya da çözümlemede kullanılacak keyin uzunluğunu kütüpaneye bildirmeniz lazım.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

Gökhan BEKEN

Teşekkürler hocam, ben byte cinsinden istiyor sanmıştım ama 128 versem de işe yaramıyor.
uint32_t Ilength kısmına gireceğimiz değer de mi bit cinsinden?
Yani oraya da mı 128 yazmam lazım, 16byte veri çözmek için?
Özel mesaj okumuyorum, lütfen göndermeyin.

X-Fi

Emin değilim bu kütüpaneyi tanımıyorum bir projemde cortex m3 işlemcide DES ve AES çözmek için açık kaynaklı "Cyclone Crypto" kütüpanesini kullanmıştım. Kullanımı hemen hemen aynıdır bi dene istersen.

Genelde AES doğrulamasını da buradan yaparım http://extranet.cryptomathic.com/aescalc/index
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

Gökhan BEKEN

Bu kütüphane donanımsal olduğu için kullandım hocam, normalde çalışan yazılımsal bir kütüphane kullanıyorum ama çok hızlı olması gereken işlemlere yetişemiyor. Donanımsal olursa hızlı çalışır diye düşündüm bu yüzden böyle deniyorum.
Özel mesaj okumuyorum, lütfen göndermeyin.

X-Fi

#5
STM32F407 kullanıyorsun sanırım eğer öyleyse bu çipde güvenlik anlaşmaları nedeniyle AES peripheral donanımı yok. Çalışmama sebebi bu olabilir. AES Donanımı olan seri STM32F417. Ayrıca aes'i olan bir çip bulman zordur az sayıda askeri uygulamalar için üretiliyor proje göstermen onay alman falan gerekiyor.

Aşağıdaki linkde de Aes ayrımını belirtmiş;

http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1577/LN11
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

AsHeS

Alıntı yapılan: X-Fi - 26 Ağustos 2015, 15:53:36
Emin değilim bu kütüpaneyi tanımıyorum bir projemde cortex m3 işlemcide DES ve AES çözmek için açık kaynaklı "Cyclone Crypto" kütüpanesini kullanmıştım. Kullanımı hemen hemen aynıdır bi dene istersen.

Genelde AES doğrulamasını da buradan yaparım http://extranet.cryptomathic.com/aescalc/index
@X-Fi hocam lisans sorununu nasıl çözdünüz  ?

Burak B

#7
@Gökhan BEKEN hatayı çözebildin mi ?

    unsigned char intputVeri_[16]="deneme123456"; // 16 adet <----- Evet 16 Byte tanımlamışsın ama padding hatalı. (Aslında bu hem makul hem problemli bir durum ne yaptığını bilip bilmediğine bağlı)
    ...
    hata=CRYP_AES_ECB(MODE_DECRYPT,key_,128,intputVeri_,16,out_);  // ENCRYPT mi yapacaksın DECRYPT mi ?


- Verileri stackte saklayacaksan uzunluğundan ve içerisindeki verilerden emin ol.
- Fonksiyona verdiğin veriler şifrelenmemiş; şifrelemek mi istiyorsun şifresini çözmek mi ? Şifreleyeceksen MODE_ENCRYPT yazmalısın.
- Yukarıda arkadaşların da söylediği gibi kullandığın MCU HW Crypto barındırıyor mu ? Genelde STM32Fx1x serisi MCU'lar HW Crypto barındırır.
- AES(Rijndael)'i ne amaçla kullanıyorsun. Bu bir block cipher. Yani sırf verileri şifreliyor diye heryerde kullanamazsın. Kullanırsan tasarım ve uygulama hataları yüzünden emeklerin boşa gitmiş olur.
- Bilgi notu olarak AES, Amerika tarafından seçilmiş bir algoritmadır. Yakın tarihlerde bir arkakapı barındırdığına dair makaleler de çıktı.
- MCU üzerinde koşan bu tip algoritmalar MCU' yu çok meşgul ettiği için direkt olmasa bile non-invasive diye tabir edilen harici yollarla saldırıya uğramaya açık olurlar.

Ek: Unutmadan AES simetrik anahtarlı bir cipher. Yani şifrelemek ve çözmek için aynı anahtarı kullanmak zorundasınız. Bunu istediğinize emin misiniz ?
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

Gökhan BEKEN

#8
@Burak BAYRAK hocam,  discovery'den stm32f407'yi çıkartıp stm32f417 alıp takmayı planladım en son.
Yani sorun hala devam ediyor.
AES ECB kullanıyorum amacım şifrelenmiş veriyi çözmek olduğundan MODE_DECRYPT olarak kullandım.
Bunu yazılımsal yapabiliyorum şu an ama işime gelmiyor, 240byte'lık diziyi toplam 6.5ms'de çeviriyor, bu da programın aksamasına sebep oluyor.
Şu an istesem de başka bir şifreleme metodu kullanamam, ben bir alıcı yapıyorum ve vericinin gönderdiği veriye müdahele edemiyorum.
Bu yüzden sistem AES ECB olmak zorunda.

Alıntı YapBu bir block cipher. Yani sırf verileri şifreliyor diye heryerde kullanamazsın. Kullanırsan tasarım ve uygulama hataları yüzünden emeklerin boşa gitmiş olur.
Bu kısmı açar mısınız hocam, block cipher olunca neden heryerde kullanılmaz?
Ben normalde 16 byte'lık seriler halinde çeviriyorum , toplamda 15*16=240 byte veri çevrilmiş oluyor 15 adımda.


Bu proje için değil de genel kültür açısından soruyorum, hangi şifreleme algoritmalarını, hangi durumlarda tavsiye ediyorsunuz?

mesaj birleştirme:: 27 Ağustos 2015, 01:40:11

Bu arada "padding hatalı" demişsiniz ama anlamadım bu kısmı. "padding" nedir? Benim bildiğim html'de iç kenar boşluğunu ayarlarken kullanılıyordu ama c dilinde böyle bir kavram duymadım.
normalde o dizideki veri RF ile geliyor yani sürekli değişiyor.
Özel mesaj okumuyorum, lütfen göndermeyin.

Burak B

#9
Yazılımsal kullanım için: Veriyi alırken DMA kullanmak gibi bir imkanın yok mu ? Varsa Veriyi bufferla. 6.5ms için gereken hafıza hesabını veri akış hızı üzerinden hesapla. Yeterli gelecek kadar iki hafıza alanını buffer olarak tahsis et. Buffer dolana kadar sen DECODE işini bitirmiş olursun. Hafızaları yer değiştirirsin DMA diğerini doldururken sen gelen üzerinde çalışırsın. DMA ve IRQ kullanma ihtimalin yoksa ASM ile optimize bir AES entegre etmeye çalış hızını artıracaktır. Ayrıca şunu da unutma deşifre işlemini istediğin an durdurabilirsin ve devam ettirebilirsin ama gelen veri için bunu yapamazsın. Bu nedenle gelen veriyi bufferlamak daha öncelikli ve önem arzeden bir iş.

Donanımsal kullanacaksan: İşin daha kolay interruptları var zaten. Bunu daha açıklamaya gerek yok sanırım.

Tavsiye konusu göreceli bir durum. Mesela AES bir Block Cipher olmasına rağmen işletim moduna göre Stream Cipher olarak ta kullanılabiliyor. Ama kesinlikle ECB modu buna uygun değil diyebilirim. Şifreleme algoritmaları güvenlik modeline ve ihtiyaçlarına göre tercih edilir. Yani sizin neyi saklamak istediğiniz ve bunu başarmak için başka şeyleri saklamanızın gerekip gerekmediği bile düşünülmelidir. SSL için kullandığımız güvenlik sertifikaları bu gibi durumlara iyi birer örnektir. Hatta SSL' in kendisi de iyi bir örnektir. Piyasada tonla algoritma mevcut konu birkaç satır ile anlatılabilecek bir konu değil açıkcası.

Alıntı yapılan: Gökhan BEKEN - 27 Ağustos 2015, 01:23:24

mesaj birleştirme:: 28 Ağustos 2015, 01:40:11

Bu arada "padding hatalı" demişsiniz ama anlamadım bu kısmı. "padding" nedir? Benim bildiğim html'de iç kenar boşluğunu ayarlarken kullanılıyordu ama c dilinde böyle bir kavram duymadım.
normalde o dizideki veri RF ile geliyor yani sürekli değişiyor.

Bu konu yaygın bir bilgi eksikliği ve düşünce yanılgısı yüzünden böyle algılanıyor. Yani "AES/Kripto = şifreleme ve güvenlik" gibi algılanıyor. Aslında doğru kullanılmadığında hiçbir işe yaramıyorlar. Padding konusu da şöyle AES bir block cipher. 128 bitlik blokları alıyor ve işliyor. Sonucunda size okunamaz halde bir veri bloğu sunuyor. Yani siz algoritmaya 1 byte veri bile girseniz algoritma her halükarda o verinin pointerından başlayıp 16 byte veri işliyor. Bu durumda sizin girdi olarak kullanacağınız PlainText diye tabir edilen girdinizi parçalayıp 16 bytelık bloklara bölmeniz gerekiyor. Eğer veri 16 byte dan az ise bu durumda veriyi pad ederek 16 byte şişirmeniz gerekiyor. İşte padding basitçe bu manaya geliyor. PAdding önemli bir konu zira zayıf padding algoritmanın güvenliğini de zayıflatan bir durum diyebillirim.

Senin kodunda verilerin stackte olduğu ve bufferı temizlemediğin için öngörülemez durumda. Bu hem iyi hemde kötü bir durum. :)

Son olarak verici cihazın firmware güncellemesi v.s. gibi özellikleri var mı ?
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

MrDarK

Ahh ahh aes bende az uğraşmadım. Ama sağ olsunlar yardım ettiler. Ben yazılımsal AES kullandım.

Belki konusu değil ama hazır AES'ci leri bir arada yakalamışken birşey sormak istiyorum.

Örneğin içinde SELAM yazan bir data padding edildi ve şu hale geldi

"SELAM00000000000"

Kriptolu halide şu olsun "abcdefghıijklmno" bunu karşı tarafa gönderdiğimizde birşey yapıyor diye farz edelim. Adam bizim kartı alsa bu bilgiyi rf vericiden çıkmadan önce dinlese ve kaydetse sonra tek tek gönderdiğim komutları deneyerek kullansa burada güvenlik kalmış oluyor mu ? Bence kalmıyor adam benim sistemimi anahtarlayarak bozmuş oldu. Bununla ilgili neler yapılabilir güvenlik için, veya güvenlik için yapılması gereken başka püf noktalar var mıdır ?
Picproje Eğitim Gönüllüleri ~ MrDarK

iyildirim

@MrDarK Hocam sabit bilgiyi sabit bir key ile şifreliyorsanız çıktı aynı olacağından, bu kriptolanmış veriyi başka bir şekilde gönderdiğinizde alıcının bunu anlaması imkansız.
Çözüm olarak değişken key kullanmak veya daha basiti dataya değişken çöp bilgi eklemek olabilir.
RTC den alınacak zaman bilgisi veya random veri ile padding yapmak gibi.


Gökhan BEKEN

Sorun çözülmüştür, ilgilenen herkese teşekkür ederim.
STM'in yayınladığı(!) hem hardware ve hem software destekleyen bir kütüphane buldum. Normalde 6.5ms'de çevirdiğim işi artık 165 us'de çevirebiliyorum.
Donanımsal kullanmama gerek kalmadı.
Ancak kütüphane .lib dosyası olduğu için taşınabilir değil, zaten stm için asm yazmışlardır büyük ihtimal, bu yüzden taşınmasına gerek yok.

kullanımı: http://www.st.com/st-web-ui/static/active/cn/resource/technical/document/user_manual/CD00208802.pdf
indirmek için biraz uğraşmanız gerekiyor: http://www.st.com/web/en/catalog/tools/PF259409
üye girişi yaptıktan sonra sepete ekliyorsunuz, bir süre sonra size link geliyor.
Özel mesaj okumuyorum, lütfen göndermeyin.

Gökhan BEKEN

@Burak BAYRAK hocam, bu arada belirtmek istedim, ne olur ne olmaz diye sipariş etmiştik stm32f417'yi ama standart kullanıcılara satmıyorlarmış.
Onu almak için bazı lisanslar vermemiz gerekiyormuş.
Özel mesaj okumuyorum, lütfen göndermeyin.

Burak B

#14
Biliyorum. Bu tip algoritmaları içeren her türlü ürünün Amerika dışına çıkarılması v.b. gibi durumlar için tonla bilgi ve belge istenir. Hatta bazılarına izin verilmez. Bu durumda şu soru akla gelebilir "Bunların kodları heryerde yok mu ? Internette bir sürü örnek var.". Evet, var ama;

Export of Crypto from USA
"... a healthy dose of paranoia leads to better systems." Jack Ganssle