AES ve Rolling Code

Başlatan AST, 16 Temmuz 2013, 11:41:28

AST

Selamlar,

AES şifreleme ve rolling code arasındaki fark nedir.
Bir RF uygulamasında şifreleme yapmam gerekiyor.Kolay bir şekilde nasıl çözüm sağlanabilir.

ferdem

AES bir şifreleme türü; rolling code ise her defasında yeni bir kod üreten sistemin adı, AES ile direkt ilgili olmak zorunda değil.
Detaylı bilgim yok ancak rolling code ile ilgili şu anahtar kelimeleri önerebilirim: Microchip, KeeLoq.

yxsdf

AES en yaygın kullanılan blok şifreleme türüdür. Rolling codelar ya da "code hoping" sistemler, şifrelemeden ziyade iki tarafında ortak bir ilk anahtar kullanarak aynı sayı üzerinde anlaşmalarıdır. Araba uzaktan kumandaları, bankaların tek kullanımlık şifre yazılımları bunlara örnektir. Araba anahtarlarında kullanılan en meşhur sistem microchip tarafından geliştirilen, doğrusal olmayan geri beslemeli kaydırmalı yazdırgaç (non-linear LFSR) yapısı üzerine kurulu Keeloq algoritmasıydı ancak algoritmadaki zayıflıklardan dolayı artık kullanılmıyor.

Rolling kodlar kullanarak şifreleme yapamazsınız, sadece doğrulama amaçlı kullanılabilirler. Şifreleme için simetrik ya da asimetrik şifreleme sistemleri kullanmalısınız. Eğer iletişim yapılacak her iki tarafa da önceden anahtar yükleme durumunuz varsa simetrik sistem kullanmak işinizi görecektir. Dediğim gibi en sık kullanılan simetrik sistem AES'tir. Ancak RC4 ya da 3DES gibi alternatiflerde güvenle kullanılabilir. Asimetrik kripto apayrı bir hikaye, ona değinmiyorum bile.

Eğer şifreleme kullanmayı düşündüğünüz verinin formatı, kullandığınız ekipmanları vs. yazarsanız nokta atışı daha detaylı bilgiler yazmaya çalışırım.
www.yxsdf.com © 2014

AST

Cevaplar için teşekkürler.

Yapılacak sistem rf üzerinden karşılıklı mesaj gönderme işlemi.Bende bu iletişimin şifreli olmasını istiyorum.Veri formatı basit ABCD1234 gibi bir data.
Mcu olarak Atmel AVR kullanmayı düşünüyorum.Birde AES sisteminde öğrenmek istediğim mesela "A" datasını her gönderdiğinizde farklı bir kodlama ile mi gönderiyor?Öyle olması gerekli diye düşünüyorum.

yxsdf

#4
AES blok bir şifreleme sistemidir ve 128-bit (16 byte boyutundaki) girdiyi yine 128-bit (16-byte) boyutunda çıktıya dönüştürür. Bunun için 128-bit, 192-bit ya da 256-bit uzunluğunda anahtar kullanmanız gereklidir. Anladığım kadarı ile sizin göndereceğiniz veriler öyle uzun veriler değil, o yüzden blok şifreleme sistemi sizin için kısmen kullanışsız olacaktır. Çünkü, örneğin, göndereceğiniz veri 4 byte olsun, "DATA" stringini şifrelemek istiyorsunuz, fakat AES algoritması 16 byte veri girdisi kabul ettiği için bu 4 byte lık bilgiyi bir şekilde 16 byte a uzatmanız gerekecek. Bunun için de padding ismi verilen uzatma yöntemlerini kullanmanız gerekecek.

Bunun yerine, akış şifreleme (stream cipher) kullanmanız işlerinizi çok daha kolay hale getirecektir. Örneğin RC4 oldukça sık kullanılan, hızlı çalışan ve mikrokontrolcülerde de kolaylıkla implement edilebilen girdileri 1-byte 1-byte olarak şifreleyebilen bir sistemdir. Örneğin, yine yukarıdaki "DATA" verisini ele alırsak, bunu şifrelemek için RC4 algoritmasının 4 kere çalışması yeterli olacaktır.
Tabi burada önemli bir problem de senkronizasyon problemi, her iki taraftada RC4 aynı sayıda çalıştırılması gerektiği için arada iletilemeyen veriler olduğunda bu sayılar tutmayacağı için senkronizasyonu yenilemeniz gerekecektir. Bu yüzden bu işlemi asenkron yapmaya yarayan tasarımlar ( https://www.google.com.tr/search?q=asynchronous+stream+cipher ) var onları incelemeniz faydalı olacaktır.

Ancak, veri kaybı durumu çoksa, yani verinin iletilememsi durumu sık sık oluyorsa akış şifreleme sizin için kullanışsız olacaktır. Bu yüzden blok şifreleme kullanmanız daha kolay olacaktır. Bunun içinde padding yöntemlerini incelemeniz faydalı olacaktır.

mesaj birleştirme:: 17 Temmuz 2013, 11:04:41

Normalde simetrik şifreleme sistemleri deterministiktir. Yani aynı girdiyi ve aynı anahtarı verirseniz aynı çıktıyı alırsınız. Ancak bu durumu aşmak için, anahtarla birlikte "initialization vector (IV)" denilen ve her seferinde rastgele üretilen ve gizli olmayan (yani şifreli mesajın yanında açıktan gönderilebilir) bir bilgi de şifreleme sistemine verilmektedir. Bu sayede deterministik olan sistem rastgele görünümlü hale gelir. Ve artık aynı veriyi şifreleseniz bile farklı çıktılar alırsınız, tabi kullandığınız IV ler farklı olduğu sürece.
www.yxsdf.com © 2014

AST

Göndereceğim datalar 15 byte ile 25 byte arasında değişiyor.Ben AES sisteminin kabul edeceği girdiye göre göndereceğim datayı düzenlerim.Elimde AVR ile yazılmış hazır bir kütüphane var.Bunun üzerinden gitmem gerekiyor şimdilik.Verdiğiniz bilgiler aydınlatıcı oldu, teşekkürler.

http://avrcryptolib.das-labor.org/trac/wiki/AES

#include <stdint.h>
#include "aes.h"

...
/* a sample key, key must be located in RAM */
uint8_t key[]  = { 0x01, 0x23, 0x45, 0x67,
                   0x89, 0xAB, 0xCD, OxEF,
                   0x01, 0x23, 0x45, 0x67,
                   0x89, 0xAB, 0xCD, OxEF };
/* sample data, you can encrypt what you want but keep in mind that only 128 bits (not less not more) get encrypted*/
uint8_t data[] = { 0x01, 0x02, 0x03, 0x04,
                   0x05, 0x06, 0x07, 0x08,
                   0x09, 0x0A, 0x0B, 0x0C,
                   0x0D, 0x0E, 0x0F, 0x00 };
aes128_ctx_t ctx; /* the context where the round keys are stored */
aes128_init(key, &ctx); /* generating the round keys from the 128 bit key */
aes128_enc(data, &ctx); /* encrypting the data block */

...

aes128_dec(data, &ctx); /* decrypting the data block */

...

atioky_216

Doğrudan AES şifreleme türüne destek veren kablosuz haberleşme protokollerinden birkaçını kullanmışlığım var hatta geçenlerde 'acaba şifreleme dongusu oluşturarak bunu nasıl değişik yönleri ile kullanabilirim' diye düşünmüştüm.

Sabit AES anahtarı kullanmayıp anahtar matrislerinde bir yeni matris tanımlayarak denemey de yapmayı düşünüyorum. Örneğin 128X1 yerine 128X32 gibi.. Hangi anahtarın ne hangi zaman dilimlerinde kullanılacağını da başka fonksiyon ile belirleyeceğim. Ama sorun çıkabileceğini düşündüğüm nokta zamanlama. Hepsinde aynı zmanda aynı anahtarı kullanıp-kullanamayacağımdan emin değilim.

Zaten AES işini mcu içindeki birim yaptığı için bize iş çıkmıyor. Bir de AES128' de bile bu kadar güvenlik var iken bu kadar detaya girmek gerekli mi ona da emin değilim, benimkisi merak  ::)

Tabi bu 'Rolling Code' a girer mi bilmem.

yxsdf

#7
Anahtarları bir sırayla kullanma fikri çok iyi bir fikir değil, onun yerine IV kullanımı daha kolay olur. Örneğin yukarıdaki implementation da IV desteği yok, o yüzden 128-bit anahtarın bir kısmını IV olarak kullanabilirsiniz. 128-bit'in son 32 bitini her seferinde farklı seçerek ve bu 32 biti gönderdiğiniz mesajın yanında göndererek güvenlik seviyesini biraz olsa da düşürerek basit bir IV sistemi yapabilirsiniz. Bu durumda güvenlik 128-32 = 96-bit'e düşmüş olacak. Çok kritik şifrelemenin gerekmediği durumlarda bu bir çözüm olabilir.

Ya da size daha güvenli ancak bir basamak daha yorucu bir sistem söyleyeyim. Elinizde AES için 128-bitlik bir anahtar olsun. Bunu, direkt bilgilerinizi şifrelemek için kullanmayın. Önce, 128-bitlik bir rasgele bir değer (IV) üretin, bu değeri elinizdeki AES anahtarını kullanarak şifreleyin. Şifreleme sonucu oluşan 128-bitlik çıktıyı verilerinizi şifrelemek için anahtar olarak kullanabilirsiniz. Böylece güvenlikten de ödün vermemiş olursunuz.
www.yxsdf.com © 2014

gokhangokcen

#8
arkadaşlar merhaba; konuyu biraz hortlatmış gibi olacağım ama yeni konu açmak istemedim. Arkadaşın dediği gibi rf ile göndermiş olduğum dataları şifrelemem gerekiyor. Bir verici üzerinden yaklaşık 200 alıcı cihaz kullanılacak. Vericinin gönderdiği kodu çözmek kolay olmamalı.Nasıl bir yol izlemeliyim nasıl bir algoritma kurmam gerekir? Biraz araştırma yaptım forumda bir kaç değerlendirmeyi okudum. Rolling Code anladığım kadarı ile verici her seferinde farklı bir değer ile veri gönderiyor alıcı ise şifrelenmiş veriyi çözüp kendi değeri ile aynı mı diye kontrol edip işlem yapıyor. AES şifrelemenin mantığını tam kavrayamadım. Algoritmasına internette epeyce bakındım ama çözümleyemedim. Elinde AES ya da Rolling Code algoritması olan var mı? ya da internette detaylı açıklamasına algoritmasına rastlayan oldu mu? link vs gönderebilirseniz inceleyebilirim.İsteğim alıcı tek bir değere bağlı kalmasın bir gün x, bir gün y, birgün z kodunu göndersin ama verici her zaman aynı kodu çözümleyebilsin istiyorum.


Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

gokhangokcen

Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

barisertekin

#10
Ben de sizinle aynı şeyi yapmak için konu açmıştım cevap alamadım :)

STM32F4 içinde dahili AES crypto module var. Bunu kullanmak için bakındım ama hiç örnek bulamadım.
Veya sadece AES crypto yapan chip'ler var. Bu chip'ler crypto yaptı diyelim. Aynı zamanda decrypto yapıyor mu? Bu sorulara cevap bulamamıştım.

Crypto.h
https://github.com/karlp/kkstm32_base/blob/master/example/stm32f4/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_cryp.h

gokhangokcen

devlet sırrı niteliğinde bir konu değil sanırım umarım daha önce uğraşmış ve/veya bilgi sahibi birileri vardır  :)
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

barisertekin

Birşeyler buldum. Vaktim olsa oturup test edicem. İstersen bak kodlar gayet açık.

crypto_set_key(CRYPTO_KEY_128BIT,key);
crypto_set_iv(iv); /* only in CBC or CTR mode */
crypto_set_datatype(CRYPTO_DATA_32BIT);
crypto_set_algorithm(ENCRYPT_DES_ECB);

crypto_start();
crypto_process_block((uint32_t*)plaintext, (uint32_t*)ciphertext, 8 / sizeof(uint32_t));
crypto_stop();


decode the previously encoded message  from ciphertext to plaintext2

crypto_set_key(CRYPTO_KEY_128BIT,key);
crypto_set_iv(iv); /* only in CBC or CTR mode */
crypto_set_datatype(CRYPTO_DATA_32BIT);
crypto_set_algorithm(DECRYPT_DES_ECB);
 
crypto_start();
crypto_process_block((uint32_t*)ciphertext, (uint32_t*)plaintext2, 8 / sizeof(uint32_t));
crypto_stop();


https://github.com/BuFran/libopencm3-examples/blob/e2eb2b49fd401440577bbb27d7f9f7a7e64886c3/examples/stm32/f4/other/crypto-basic/cryptobasic.c

gokhangokcen

üstad ben tam çözümleyemedim kodu :)
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

barisertekin

Linkten bakarsan daha açıklayıcı olur.

İlk kod şifreleme yapıyor. İkinci kod şifreyi çözüyor. Linkte devamı var.  Doğru çözmüş mü diye iki değişkeni karşılaştırıyor. Ona göre led yakıyor.
Crypto.h kütühanesini kullanmış. Kütüphane dosyaları da bu linkte
https://github.com/libopencm3/libopencm3/tree/master/include/libopencm3/stm32/f4