C++ Xor İle Şifrelemek ?
-
c'de bir stringi xorlayarak nasıl şifreleyebilir ve çözebilirim ? yardımcı olabilecek şimdiden teşekkürler
-
hocam biraz daha açsana.
ne yapmak istiyosun tam olarak?
-
Ne için istediğini söylersen daha doğru bir cevap verilebilir ama en basitinden birşeyi xor ile şöyle şifreleyebilirsin.
#include <stdio.h>
niRvana_GG tarafından 19/Oca/16 02:49 tarihinde düzenlenmiştir
#include <stdlib.h>
int main()
{
char testStr[] = "Test Yazisi";
size_t i, size = strlen(testStr);
unsigned seed;
printf("Seed degerini girin : ");
scanf("%u", &seed);
srand(seed);
for(i = 0; i < size; ++i)
testStr[i] ^= rand();
printf("%s\n", testStr);
srand(seed);
for(i = 0; i < size; ++i)
testStr[i] ^= rand();
printf("%s\n", testStr);
system("pause");
return 0;
} -
aslında string şifreleme diye bişey yok, Şifreleme bit bazında yapılır, stringi byte arraye çevirmekle başla.
xorladiktan sonra geriye string istiyorsan çıktının base64 ünü falan alıp string versiyonunu bastır
-
C üzerinden anlatıyorum , önce mantığı kavra.Mesela 1000 1010 1010 1100 gibi 16 bitlik bir bitstringin var. Bunu 1000 1000 1000 1000 ile xorlarsan ortaya şifrelenmiş bir değer ortaya koyarsın.Bu şifreyi çözmek için ise çıkan değeri tekrar 1000 1000 1000 1000 ile xorlarsan baştaki bitstringi elde edersin.
Basitçe
#include #include #include //bu kütüphaneyi yüksek bitli değerleri tanımlamada kullandığımız uint16_t , uint32_t , uint64_t tanımlarken yazmamız gerekli. int main(){ uint16_t sonuc; //xorlama işlemi için sonuç değişkeni uint16_t baslangicadonus; // burada ise dediğim gibi b değeri ile sonuç değeri tekrar xorlanırsa başlangıç , yani şifrelenmemiş değeri elde edersin char s[16 + 1]; // a nın yazdırma için for değeri için değişkeni int i; //a nın yazdırma arttırma için değişkeni char d[16+1]; //b için yazdırma int k; //b için yazdırma char f[16+1]; //sonuc için yazdırma int j; //sonuc için yazdırma char z[16+1]; //baslangicadon için yazdırma int p; //baslangicadon için yazdırma uint16_t a=0x8AACu; //Bu yukarıdaki verdiğim ilk bitstringin hexadecimal gösterimi uint16_t b=0x8888u; //Buda xorlayacağın sabit değer ve ikisini xorladığında ortaya şifrelenmiş bir kod çıkar.Bu kodu 1000 1000 1000 1000 değerini bilmeyen kimse anlayamaz.Bunu sadece sen bu değerle xorlayarak elde edebilirsin. sonuc=a ^ b; // burada xorlama işlemini yapıyoruz.Bu "^" da bitwise operatörlerinde xor işlemi demektir. baslangicadon=sonuc ^ b; //burada tekrar sadece senin bilebileceğin 1000 1000 1000 1000 , hexadecimal olarak "0x8888" ile xorluyoruz ve başlangıç değerimiz "a" yı elde ediyoruz //Şimdi sana bu bit değerlerini görebilmemiz için özel bir printf fonksiyonu veriyorum.Böylece konsolda( siyah ekranda) görerek anlayabilirsin.4 tane değeride yazdırıyoruz a, b, sonuc,baslangicadon for (i = 0; i < 16; i++) { s[15 - i] = (a & (1 << i)) ? '1' : '0'; // bu işlemin genel açıklaması: char değeri örnek olarak eğer i=0 ise "0." biti yazacağız işlemini yapar "1" sola 0 kez shiftlenir(kaydırılır) sonra "a" nın "0". biti ile karşılaştırılır.eğer "a" nın "0". biti 1 ise "1" yazar değil ise 0 yazar } for (k = 0; k < 16; k++) { d[15 - k] = (b & (1 << k)) ? '1' : '0'; } for (j = 0; j < 16; j++) { f[15 - j] = (sonuc & (1 << j)) ? '1' : '0'; } for (p = 0; p < 16; p++) { z[15 - p] = (baslangicadon & (1 << p)) ? '1' : '0'; } s[16] = '\0'; d[16] = '\0'; f[16] = '\0'; z[16] = '\0'; //print işlemini yaptırıyoruz printf(" %s %s %s %s ", a,b,sonuc,baslangicadon); return 0; }KODU GELİŞİGUZEL YAZDIM, VAKTİM OLMADIĞI İÇİN DENEMEDİM.SORUN ÇIKARSA, SONUCU GÖREMİYORSAN YAZ BURAYA, EDİTLERİZ
-
Ya da şöyle yapabilirsin: http://bfy.tw/3neb
