2009-06-17 15 views
19

Küçük bir metin dosyası okuyan ve bir "dahili" anahtar kullanarak şifreleyen C/C++ 'da küçük bir program yazmak istiyorum. Daha sonra aynı şifreyi kullanarak şifrelenmiş dosyanın şifresini çözebilen başka bir küçük program yazmak istiyorum. Küçük bir dosyanın şifrelenmesi ve şifresini çözme openssl

Ben openSSL sitesinde baktım google'dan ancak basit bir örnek buldum, birileri hiç de bu işi yapmaya çalıştı?

+0

benzer örnekle bir soru http://stackoverflow.com/questions/3141860/aes-ctr-256-encryption-mode-of- open-on-openssl – enthusiasticgeek

+0

'EVP_ *' işlevlerini kullanmalısınız. 'EVP_ *' işlevleri, AES-NI (varsa) gibi donanım kullanır. OpenSSL wiki'de [EVP Simetrik Şifreleme ve Şifre Çözme] (https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption) konusuna bakın.Aslında, her ikisi de * gizlilik ve özgünlük sağladığından, kimliği doğrulanmış şifrelemeyi kullanmalısınız. OpenSSL wiki'deki [EVP Onaylı Şifreleme ve Şifre Çözme] (https://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption) konusuna bakın. – jww

cevap

0

OpenSSL bir ağ üzerinden veri şifrelemek için protokoller SSL ve TLS uygulanması ile spesifik olarak ilgilidir. Bir dosyayı şifrelemek istediğinizden, OpenSSL kullanmak ancak ideal değil. Bunun yerine, her ikisi de kullanımları için örnekler veren BeeCrypt veya Crypto++® Library 5.6.0 gibi bir şey kullanırdım.

+4

OpenSSL, bir soyutlama olan hem BIO'ların hem belleğine hem de dosyasına sahiptir. Kütüphane, bellek arabellekleri, dosya arabellekleri, soketler ve diğer G/Ç nesneleriyle uyumludur. Kütüphanenin kriptografi kısmı ('libcrypto.a') tek başına kullanılabilir; ve SSL bölümü ('libssl.a') kriptografinin üstüne kurulmuştur. – jww

20

İdeali, ccrypt gibi mevcut bir aracı kullanmak olabilir, ama buraya:

#include <openssl/aes.h> 

/* ... */ 


{ 
    int bytes_read, bytes_written; 
    unsigned char indata[AES_BLOCK_SIZE]; 
    unsigned char outdata[AES_BLOCK_SIZE]; 

    /* ckey and ivec are the two 128-bits keys necesary to 
    en- and recrypt your data. Note that ckey can be 
    192 or 256 bits as well */ 
    unsigned char ckey[] = "thiskeyisverybad"; 
    unsigned char ivec[] = "dontusethisinput"; 

    /* data structure that contains the key itself */ 
    AES_KEY key; 

    /* set the encryption key */ 
    AES_set_encrypt_key(ckey, 128, &key); 

    /* set where on the 128 bit encrypted block to begin encryption*/ 
    int num = 0; 

    while (1) { 
    bytes_read = fread(indata, 1, AES_BLOCK_SIZE, ifp); 

    AES_cfb128_encrypt(indata, outdata, bytes_read, &key, ivec, &num, 
      AES_ENCRYPT); 

    bytes_written = fwrite(outdata, 1, bytes_read, ofp); 
    if (bytes_read < AES_BLOCK_SIZE) 
    break; 
    } 
} 

Şifre çözme son parametre olarak AES_DECRYPT ile AES_cfb128_encrypt arayarak yapılır. Bu kodun testin en temelinden daha fazla bir şey verilmediğini ve ckey ve ivec için uygun 8 bitlik rastgele verileri kullanmanız gerektiğini unutmayın.

DÜZENLEME: AES_cfb128_encrypt istenilen uzunlukta veriyi kabul eder görünüyor, bu nedenle AES_BLOCK_SIZE (16) bayt bloklar halinde şifrelemek için gerekli değiliz.

+0

aes'den bazı yönlerden yardım doktoru şunları söylüyor: Bu kitaplığın tüm olası büyüklükleri ve çalışma modları sağlanamıyor. Bu nedenle, ve diğerleri, uygulamalar doğrudan AES işlevlerini çağırmak yerine, L vb. Üst düzey işlevlerini kullanmalıdır. – solotim

+0

@Michiel Budding ': Kodunuzu kullandım ve int num değerini başlatmalıyım; doğru çalışması için ivec boyutuna. – Macarse

+0

Kod parçanız çok büyük. – user99545

13

Önceki cevaplar, istediklerinizi nasıl yapacağınız konusunda yönlendirdi.

Neden numaralı telefona bir kelime eklemek istiyorum muhtemelen.

Bahsettiğiniz şey, "simetrik şifreleme" olarak adlandırılır (aynı anahtar şifrelemek ve şifresini çözmek için kullanılır; asimetrik şifrelemenin aksine, tek bir anahtarla şifrelenen her şey yalnızca belirli bir karşılık olarak çözülebilir). kullanılan kodlanmış anahtar belirlemek için bir çalıştırılabilir sökülmesi

sonraki ve basittir. Bu demektir ki, ellerini her zaman sizin yürütücülerinizden birine götüren herkes, daha önce değiştirilen herhangi bir mesajın şifrelenmesini kırabilir. aklınızdaki uygulandığında çok özel olmadığı sürece

, bu kurulum "look" güvenli olabilir anlamına gelir, ama değil. Bu durumlarda, genellikle şifrelenmemesi daha iyidir, bu yüzden hiç kimsenin bu sahte güvenlik duygusu için düşmemesi gerekir ...

Şifreleme yapmak için standart kütüphanelere bakmak çok iyidir (uygulamak yerine)/bir algoritma da) oluşturmak, ama Protokollerine uygulamaları, anahtarlar ve mesajlar kullanılır ve değiş tokuş edilmektedir nasıl (), en azından şifre kendisi kadar önemlidir. Fikirlerinizi kriptografiyle uğraşan biri tarafından test edilmek, zayıflıklarını anlatmak isteyebilirsiniz. (O tür yeterli StackOverflow'daki burada olduğuna eminim. ;-))

+0

+1. Ancak, söylediğin gibi, en az iki cevap simetrik şifreleme yapmamayı önerdi (Andrew Austin ve benimki). – bortzmeyer

+0

İtiraf ediyorum Ne hakkında olduğunu öğrenmek için bağlantıları takip etmedim. ;-) – DevSolar

+2

Biraz muhalif olmak zorundayım (ve tabi ki); OP'nin ne düşündüğü hakkında hiçbir fikrimiz yok. Şifreleme ve şifre çözme farklı bilgisayarlarda yapılırsa, bir iç anahtar güvenlidir. Sadece SSL kütüphaneleriyle oynamak istiyorsa, güvenlik önemsizdir. Tavsiye için size +1 vereceğim, ama "bunu yapmamalısınız" biraz özet bir özet. –

İlgili konular