Ana içeriğe git

Haberler

Konu: Getirin o veriyi kriptolayalım :) (398 Kez okunmuş) önceki konu - sonraki konu

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.
  • ashes
  • [*][*][*][*][*]
Getirin o veriyi kriptolayalım :)
Bu aralar kripto işlerine meylettiğimden dolayı gömülü sistemlerde nasıl kriptolama kütüphaneleri kullanabiliriz ona bakacağız. Piyasada epey kripto kütüphanesi var hatta STM32'nin bazı modellerinde hw kriptolama modülleri bulunmakta fakat Türkiye'ye satışı gerçekleştirilememektedir.
İlk olarak incelediğim kütüphane CyaSLL (wolfSSL)di. Bu arkadaşın en büyük sıkıntı eğer kütüphaneyi ola ki üründe kullanırsanız ürün başına 5000$ istemesiydi. Gerekli cevabı iç dünyamda verdim ve yeni bir kütüphane arayışına girdim. 2 tane kriptolama kütüphanesi buldum. Bunlardan ilki GNU crypto project idi. Port etmesi zor geldiği için rafa kaldırdım. İkincisi ise herkesin az çok duyduğu openSSL. OpenSSL tam manasıyla dev bir kütüphane kafanızda ki çoğu şeye göre API leri yapılandırmışlar ve en önemlisi modüller epey bağımsız. Yani bu şu demek ben AES'i en ham haliyle kullanmak istiyorum dediğiniz zaman bunu ilgili klasörde çat diye bulup getirebiliyorsunuz. En güzeli ise openSSL'in lisans sıkıntısı yok istediğiniz gibi kullanabiliyorsunuz.

Örneğimiz AES-CBC 192 - bit üzerinden olacak. openSSL'in dizin yapısından çıkartarak AES-CBC için sadeleşmiş bir dizin çıkardım kendime;
aes_lib
Önce PC de test için Code::Blocks ta aşağıdaki gibi bir proje ağacı çıkardım.
Proje Ağacı

Ardından test için aşağıda ki gibi bir main.c oluşturdum.

Kod: [Seç]

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

const uint8_t aes_key[24] = { 0x0A, 0x0C, 0x0D, 0xFF, 0xAA};

uint8_t input_stream[256],  output_stream[256];

int main()
{
    int i = 0;
    AES_KEY enc_key, dec_key;
    unsigned char iv_enc[AES_BLOCK_SIZE], iv_dec[AES_BLOCK_SIZE];


    for( i = 0; i < AES_BLOCK_SIZE; i++ )
    {
                iv_enc[i] = iv_dec[i] = i;
    }
    AES_set_encrypt_key( aes_key, sizeof(aes_key)*8, &enc_key);

    printf("\n\rInput Stream:");
    for( i = 0; i < 256; i++ )
    {
        input_stream[i] = i;
        printf(" 0x%02X", input_stream[i] );
    }
    printf("\n\r");

    AES_cbc_encrypt( input_stream, output_stream, 256, &enc_key,  iv_enc, AES_ENCRYPT );

    printf("\n\rOutput Stream:");
    for( i = 0; i < 256; i++ )
    {
        printf(" 0x%02X", output_stream[i] );
    }
    printf("\n\r");

    AES_set_decrypt_key(aes_key, sizeof(aes_key)*8, &dec_key);

    AES_cbc_encrypt( output_stream, input_stream, 256, &dec_key,  iv_dec, AES_DECRYPT );

    printf("\n\rDecrypted Stream:");
    for( i = 0; i < 256; i++ )
    {
        printf(" 0x%02X", input_stream[i] );
    }
    printf("\n\r");

    printf("Hello world!\n");
    return 0;
}

Aynı şekilde STM32F030C8 işlemcisine port ettim library i yaklaşık 15 kB ROM, 1.5 kB RAM kullanımı mevcut.

  • Son Düzenleme: Mart 10, 2017, 22:10:00 - ashes

  • 1k
  • [*]
Ynt: Getirin o veriyi kriptolayalım :)
Yanıt #1
Özellikle uzun veriler üzerinde çalışırken software lib.ler ciddi iş yükü getiriyorlar.

Burada microchip'in lib.'i var. Port etmesi oldukça kolay. http://www.microchip.com/Developmenttools/ProductDetails.aspx?PartNO=SW300052


Bu da oldukça lightweight https://github.com/kokke/tiny-AES128-C

  • ashes
  • [*][*][*][*][*]
Ynt: Getirin o veriyi kriptolayalım :)
Yanıt #2
Kodun flashta kapladığı alan çok sıkıntı olmuyorda RAM büyük sıkıntı. Microchip'in cyaSSL uyarlaması eğer cyaSSL ile aynı lisanslama koşullarına sahipse kullanılabilecek bir ürün değil. Ürün başı 5000$ mantıklı değil açıkçası. Diğeri ise AES128 için uygulanabilir duruyor.

  • Tagli
  • [*][*]
Ynt: Getirin o veriyi kriptolayalım :)
Yanıt #3
Ciddi anlamda araştırma yapmadım ama bu başlığı görünce konuyla uzaktan da olsa alakalı olduğunu düşündüğüm için sorayım dedim: Kriptolu bir bootloader var mıdır? Amacım cep telefonundan bluetooth ile cihaz yazılımını (firmware) güncellemek ama bunu yaparken birilerinin araya girip hex'i alamaması gerekiyor. Yani hex kriptolu bir şekilde cihaza ulaşmalı ve orada çözülüp programlama işlemi gerçekleşmeli.

Elbette sadece bootloader gibi bir uygulama için bahsi geçen bellek gereksinimleri pek kabul edilebilir değil.

Kripto konusunda hiç deneyimim yok. Temel bilgileri edinmek için henüz taslak aşamasında olan ancak anlatımını epey güzel bulduğum bu ekitap'ı okudum.
Gökçe Tağlıoğlu

  • ashes
  • [*][*][*][*][*]
Ynt: Getirin o veriyi kriptolayalım :)
Yanıt #4
Ciddi anlamda araştırma yapmadım ama bu başlığı görünce konuyla uzaktan da olsa alakalı olduğunu düşündüğüm için sorayım dedim: Kriptolu bir bootloader var mıdır? Amacım cep telefonundan bluetooth ile cihaz yazılımını (firmware) güncellemek ama bunu yaparken birilerinin araya girip hex'i alamaması gerekiyor. Yani hex kriptolu bir şekilde cihaza ulaşmalı ve orada çözülüp programlama işlemi gerçekleşmeli.

Elbette sadece bootloader gibi bir uygulama için bahsi geçen bellek gereksinimleri pek kabul edilebilir değil.

Kripto konusunda hiç deneyimim yok. Temel bilgileri edinmek için henüz taslak aşamasında olan ancak anlatımını epey güzel bulduğum bu ekitap'ı okudum.
Burada bahsedilen algoritmalar biraz güçlü algoritmalar yani güvenilirliği dünyaca kabul görmüş yapılar bu sebeple memory footage çok abzürt gelmiyor fakat kullanacağınız işlemcinin ROM ve RAM alanı azsa basitçe kendi algoritmanızı ve implementasyonunuzu oluşturmakta bir çözüm. Sizin anlattığınız durumda Sezar şifrelemesinin hex hali bile yetebilir belki.

https://tr.wikipedia.org/wiki/Sezar_%C5%9Fifrelemesi